上海网站优化哪家好,网站建设不完整,个人做电梯网站,做网站的技巧#xff01;#xff01;#xff01;梯度的产生是由于反向传播#xff0c;在自定义从零开始编写代码时#xff0c;第一次反向传播前应该对params参数的梯度进行判断
import torch
import numpy as np
import torch.utils.data as Data
import torchvision.datasets
import…梯度的产生是由于反向传播在自定义从零开始编写代码时第一次反向传播前应该对params参数的梯度进行判断
import torch
import numpy as np
import torch.utils.data as Data
import torchvision.datasets
import torchvision.transforms as transforms
import syssys.path.append(路径)
import d2lzh_pytorch as d2l
--------------------------------------------------获取和读取数据batch_size 256
train_mnist torchvision.datasets.FashionMNIST(root路径,downloadTrue, trainTrue, transformtransforms.ToTensor())
test_mnist torchvision.datasets.FashionMNIST(root路径,downloadTrue, trainFalse, transformtransforms.ToTensor())
train_iter Data.DataLoader(train_mnist, batch_sizebatch_size, shuffleTrue)
test_iter Data.DataLoader(test_mnist, batch_sizebatch_size, shuffleFalse)
--------------------------------------------------定义模型参数num_inputs 784
num_outputs 10
num_hidden 256
# 有几个隐藏层就要设置几个参数简洁实现中linear网络会自动配置初始参数自己可以使用init.normal_()设置参数初始值
w1 torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hidden)), dtypetorch.float)
b1 torch.zeros(num_hidden, dtypetorch.float)
w2 torch.tensor(np.random.normal(0, 0.1, (num_hidden, num_outputs)), dtypetorch.float)
b2 torch.zeros(num_outputs, dtypetorch.float)
params [w1, b1, w2, b2]
for param in params:param.requires_grad_(requires_gradTrue)---------------------------------------------定义激活函数
def relu(X):return torch.max(inputX, othertorch.tensor(0.0))
---------------------------------------------------定义模型
# 使用view函数将输入的样本转换成inputs特征数大小的图像
def net(X):X X.view((-1, num_inputs))H relu(torch.matmul(X, w1) b1) # torch.mm(X, w1) b1得到隐藏层输出# 对隐藏层变量进行激活函数变换然后作为下一个全连接层的输入# 第一层不是隐藏层直接线性计算隐藏层输出作为输出层输入的时候对隐藏层进行非线性变换然后传入输入层return torch.matmul(H, w2) b2 # 隐藏层作为输出层的输入 n层layer有最多n-2个激活函数
-----------------------------------------------------定义损失函数loss torch.nn.CrossEntropyLoss() # 包含了softmax运算和交叉熵运算
------------------------------------------------------softmax操作用于训练模型中训练集准确率调用
def softmax(X):X_exp X.exp() # 幂指数化partition X_exp.sum(dim1, keepdimTrue) # 求和每行的元素值return X_exp / partition # 做比值得预测概率
----------------------------------------------------测试集准确率函数训练模型中测试集准确率调用
def evaluate_accuracy(test_data):acc_num, num 0.0, 0for X, y in test_data: # X,y分别是一个元组acc_num (softmax(net(X)).argmax(dim1) y).float().sum().item()num y.shape[0]return acc_num / num
------------------------------------------------------训练模型num_epochs, lr 5, 100def train():for epoch in range(num_epochs):train_acc, train_l, test_acc, n, num 0.0, 0.0, 0.0, 0, 0for X, y in train_iter: #l loss(net(X), y) # CrossEntropyLoss 函数已经是对一个批次内所有样本的平均损失计算了if params[0].grad is not None: # 第一次训练迭代前是没有梯度产生的梯度是由于反向传播才产生的for param in params: # 参数梯度清零param.grad.data.zero_()l.backward() # 反向传播d2l.sgd(params, lr, batch_size) # 梯度下降操作train_l l.item()# net(X)返回每个样本各个类别的预测值有n个样本返回train_acc (softmax(net(X)).argmax(dim1) y).float().sum().item() # 累加预测正确个数n y.shape[0]num 1test_acc evaluate_accuracy(test_iter)print(fepoch %d, loss %.4f, train_acc %.3f, test_acc %.3f% (epoch 1, train_l / num, train_acc / n, test_acc))train()