# -*- coding: UTF-8 -*-
"""
@Author :Douglas
@Project :deepLearning_try
@File :mlp_from_zero.py
@IDE :PyCharm
@Date :2024/8/5
"""
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
# from torch.utils.tensorboard import SummaryWriter
from torch import nn
def try_gpu(i=0): # 有 GPU 则使用,否则使用 CPU
"""如果存在,则返回gpu(i),否则返回cpu()"""
if torch.cuda.device_count() >= i + 1:
# return torch.device(f'cuda:{i}')
return torch.device('cpu')
return torch.device('cpu')
def load_data_fashion_mnist(batch_size, loader_num, resize=None): # 数据集准备
"""下载Fashion-MNIST数据集,然后将其加载到内存中"""
trans = [transforms.ToTensor()] # 数据变换操作列表
if resize: # 如果需要改变形状的话,把resize的操作加到变换列表里
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans) # 将变换操作集合起来
# 下载训练集和数据集
mnist_train = torchvision.datasets.FashionMNIST(
root="../dataset", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="../dataset", train=False, transform=trans, download=True)
return (data.DataLoader(mnist_train, batch_size, shuffle=True,
num_workers=loader_num),
data.DataLoader(mnist_test, batch_size, shuffle=False,
num_workers=loader_num))
def relu(X): # 激活函数
a = torch.zeros_like(X)
return torch.max(X, a)
def net(X): # 模型
X = X.reshape((-1, num_inputs)) # 展平
H = relu(X@W1 + b1) # 这里“@”代表矩阵乘法
return (H@W2 + b2)
def accuracy(y_hat, y):
"""计算预测正确的数量"""
if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
y_hat = y_hat.argmax(axis=1)
cmp = y_hat.type(y.dtype) == y
return float(cmp.type(y.dtype).sum())
def evaluate_accuracy(net, data_iter):
"""计算在指定数据集上模型的精度"""
if isinstance(net, torch.nn.Module):
net.eval() # 将模型设置为评估模式
metric = Accumulator(2) # 正确预测数、预测总数
with torch.no_grad():
for X, y in data_iter:
X = X.to(try_gpu())
y = y.to(try_gpu())
metric.add(accuracy(net(X), y), y.numel())
return metric[0] / metric[1]
class Accumulator:
"""在n个变量上累加"""
def __init__(self, n):
self.data = [0.0] * n
def add(self, *args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
def reset(self):
self.data = [0.0] * len(self.data)
def __getitem__(self, idx):
return self.data[idx]
def train_epoch(net, train_iter, loss, updater): #@save
"""训练模型一个迭代周期"""
# 将模型设置为训练模式
if isinstance(net, torch.nn.Module):
net.train()
# 训练损失总和、训练准确度总和、样本数
metric = Accumulator(3)
for X, y in train_iter:
X = X.to(try_gpu())
y = y.to(try_gpu())
# 计算梯度并更新参数
y_hat = net(X)
l = loss(y_hat, y)
if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.mean().backward()
updater.step()
else:
# 使用定制的优化器和损失函数
l.sum().backward()
updater(params, lr, batch_size)
metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
# 返回训练损失和训练精度
return metric[0] / metric[2], metric[1] / metric[2]
def train(net, train_iter, test_iter, loss, num_epochs, updater):
"""训练模型"""
for epoch in range(num_epochs):
train_loss, train_acc = train_epoch(net, train_iter, loss, updater)
test_acc = evaluate_accuracy(net, test_iter)
# writer.add_scalar('train_loss', train_loss, epoch)
# writer.add_scalar('train_acc', train_acc, epoch)
# writer.add_scalar('test_acc', test_acc, epoch)
print(f'第{epoch + 1}轮的训练损失为{train_loss}')
print(f'第{epoch + 1}轮的训练精度为{train_acc}')
print(f'第{epoch + 1}轮的测试集精度为{test_acc}')
return train_loss, train_acc, test_acc
if __name__ == '__main__':
batch_size = 256
train_iter, test_iter = load_data_fashion_mnist(batch_size, 4)
# writer = SummaryWriter('./runs/mlp_from_zero') # 设置tb文件保存位置
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = nn.Parameter(torch.randn(
num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(
num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2]
loss = nn.CrossEntropyLoss(reduction='none') # 损失函数
num_epochs, lr = 10, 0.1
optimizer = torch.optim.SGD(params, lr=lr)
train(net, train_iter, test_iter, loss, num_epochs, optimizer)
# writer.close()
多层感知机的从零开始实现与pytorch简洁实现(pycharm版)
需积分: 0 142 浏览量
更新于2024-09-06
收藏 4KB ZIP 举报
可以在pycharm直接运行的两个py文件:一个是从零实现,另一个是简洁实现。
Douglassssssss
- 粉丝: 9789
- 资源: 7
最新资源
- 电子学习资料设计作品全资料交通控制器设计资料
- 基于python的高校社团学生会管理系统(django)源代码(python毕业设计完整源码+LW).zip
- 基于lsb算法与rsa算法的信息隐藏算法实现(django)源代码(python毕业设计完整源码+LW).zip
- 基于Vue和JavaScript的校园二手交易平台设计源码
- 电子学习资料设计作品全资料经典之经典单片机设计
- 基于ArkTS的鸿蒙系统拼图游戏设计源码
- 基于OpenCV全景图像拼接系统源代码(python毕业设计完整源码+LW).zip
- 基于C++和Qt技术的多功能智能家居系统设计源码
- 电子学习资料设计作品全资料具有定时功能的八路数显抢答器的设计
- 基于大数据的电影市场预测分析(django)源代码(python毕业设计完整源码+LW).zip
- 基于3D卷积神经网络的阿尔兹海默智能诊断Web应用设计源码
- 基于HTML的简洁单页个人简历模板设计源码
- 基于混沌系统敏感文本信息加密算法研究(django)源代码(python毕业设计完整源码+LW).zip
- 基于Vue的丰富组件库设计源码,有趣实用欢迎star和pr
- 电子学习资料设计作品全资料开关电源
- 塑料箱堆垛机(sw18可编辑+工程图+bom)全套技术资料100%好用.zip.zip