《动手学深度学习》-4.3-笔记
import torch
from torch import nn
from d2l import torch as d2l
导入必要的库和模块
net = nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10))def init_weights(m):if type(m) == nn.Linear:nn.init.normal_(m.weight, std=0.01)net.apply(init_weights);
定义了一个简单的两层神经网络,并使用自定义的权重初始化函数对网络的权重进行初始化。
-
nn.Sequential
:这是一个容器,用于按顺序堆叠多个神经网络层。它会自动处理层之间的输入和输出传递。 -
nn.Flatten()
:将输入张量从多维展平为二维张量。例如,对于形状为(batch_size, 28, 28)
的输入(如 MNIST 图像),nn.Flatten()
会将其展平为(batch_size, 784)
。 -
nn.Linear(784, 256)
:全连接层,将输入的 784 个特征映射到 256 个隐藏单元。 -
nn.ReLU()
:ReLU 激活函数,用于引入非线性。 -
nn.Linear(256, 10)
:全连接层,将 256 个隐藏单元映射到 10 个输出单元(对应 10 个类别)。
总结 -
定义一个简单的两层神经网络,包含输入层、隐藏层和输出层。
-
使用自定义的权重初始化函数
init_weights
,对网络中的全连接层的权重进行初始化,初始化方式为均值为 0、标准差为 0.01 的正态分布。
报错,修改,PyTorch 的自动梯度计算(
autograd
)机制在尝试对非标量输出进行反向传播时引发了问题。具体来说,d2l.train_ch3
函数在内部调用模型的前向传播和反向传播时,可能没有正确处理损失函数的输出。
loss = nn.CrossEntropyLoss(reduction='none')这意味着损失函数会为每个样本单独计算损失值,返回一个形状为 (batch_size,)
的张量
PyTorch 的 backward()
方法要求输入是一个标量(即单个数值)。如果直接对非标量(如形状为 (batch_size,)
的张量)调用 backward()
,就会报这个错误:
RuntimeError: grad can be implicitly created only for scalar outputs
报错原因跟前面的4.2一样
batch_size, lr, num_epochs = 256, 0.1, 10#每次训练时使用的样本数量。这里设置为 256,训练轮数,表示整个训练数据集将被遍历的次数。这里设置为 10
loss = nn.CrossEntropyLoss(reduction='mean') # 或者 reduction='sum'#交叉熵损失函数,适用于多分类任务。
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)#调用 D2L 库中的训练函数,执行神经网络的训练和评估过程。
用于训练一个神经网络模型来解决分类任务,例如 Fashion-MNIST 数据集。它涵盖了数据加载、模型定义、损失函数选择、优化器配置以及模型训练和评估的全过程。
多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层