代码:
import torch
from torch import nn
from d2l import torch as d2l
# Flatten()函数将28x28的区域平铺为一维向量
# Linear()函数定义一个全连接神经网络层(密集层),将784个输入转换为256个隐藏单元
# ReLU()函数表示对第一个隐藏层的输出调用ReLU激活函数
# 再定义第二个全连接神经网络层
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10))
# 初始化所有线性全连接层的权重,使用均值为0,标准差为0.01的正态分布
# 参数m表示神经网络里的某个层,每个层都是nn.Module的一个模块
# 在调用apply()函数时,该函数会递归地对模型网络里的每个层都调用init_weights()函数
# 因此,第一句if的作用便是判断这个神经层是不是全连接线性层(隐藏层&输出层)
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
# 为模型应用权重初始化
net.apply(init_weights)
# 执行训练操作,基本大同小异
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)