3.3.3. 定义模型
nn模块是PyTorch提供的一个用于构建神经网络的高级API,它封装了一些常用的神经网络层和模型,使得构建和训练神经网络变得更加简单和方便。通过使用nn模块,我们可以定义神经网络的结构,包括各种层(如全连接层、卷积层、池化层等)以及激活函数、损失函数等。nn模块还提供了一些优化器(如SGD、Adam等)和学习率调度器等工具,用于训练和优化神经网络模型。
net = nn.Sequential(nn.Linear(2, 1)):
nn.Sequential
是nn模块中的一个类,用于构建一个顺序的神经网络模型。在这个例子中,nn.Sequential
接受一个参数,即一个由多个神经网络层组成的序列。
在这里,nn.Linear(2, 1)
是一个线性层,它接受一个维度为2的输入,输出一个维度为1的结果。具体来说,这个线性层可以看作是一个简单的全连接层,它将输入的维度从2降低到1。
所以,这段代码定义了一个只包含一个线性层的神经网络模型,输入维度为2,输出维度为1。在模型的前向传播过程中,输入数据将通过这个线性层进行计算,得到最终的输出结果。
net[0].weight.data.normal_(0, 0.01)
:这行代码对网络中第一个(索引为0)层的权重进行初始化。net[0]
表示获取网络中的第一个层,.weight
表示获取该层的权重参数,.data
表示获取权重参数的数据,.normal_(0, 0.01)
表示对权重参数进行正态分布初始化,均值为0,标准差为0.01。
net[0].bias.data.fill_(0)
:这行代码对网络中第一个(索引为0)层的偏置进行初始化。net[0]
表示获取网络中的第一个层,.bias
表示获取该层的偏差参数,.data
表示获取偏差参数的数据,.fill_(0)
表示将偏差参数的值填充为0。
综合起来,这两行代码对神经网络模型中的第一个层的权重和偏差进行了初始化操作。权差被初始化为均值为0,标准差为0.01的正态分布,偏差被初始化为0。这些初始化操作可以帮助模型更好地学习数据的特征和模式。
trainer = torch.optim.SGD(net.parameters(), lr=0.03):
这段代码定义了一个优化器(optimizer)对象trainer,使用的是随机梯度下降(Stochastic Gradient Descent,SGD)算法。SGD是一种常用的优化算法,用于更新神经网络模型的参数,以最小化损失函数。
在这里,net.parameters()
表示获取神经网络模型net中所有需要学习的参数,包括权重和偏差。这些参数将被传递给优化器进行更新。
lr=0.03
表示学习率(learning rate)为0.03,学习率决定了每次参数更新的步长大小。较大的学习率可以加快模型的收敛速度,但可能会导致参数跳过最优解;较小的学习率可以提高模型的稳定性,但可能需要更多的迭代次数才能收敛到最优解。
num_epochs = 3 for epoch in range(num_epochs): for X, y in data_iter: l = loss(net(X) ,y) trainer.zero_grad() l.backward() trainer.step() l = loss(net(features), labels) print(f'epoch {epoch + 1}, loss {l:f}')
这段代码是一个简单的训练循环,用于训练神经网络模型。
1. `num_epochs = 3`:定义了训练的总轮数,即总共要进行几次完整的数据遍历。
2. `for epoch in range(num_epochs):`:外层循环,用于控制训练的轮数,每轮称为一个epoch。
3. `for X, y in data_iter:`:内层循环,用于遍历训练数据集。`data_iter`是一个迭代器,每次迭代返回一个小批量的训练样本和对应的标签。
4. `l = loss(net(X) ,y)`:计算当前批量样本的预测值和真实标签之间的损失值。`net(X)`表示将输入X传入神经网络模型进行前向传播得到预测值,`loss()`表示计算预测值和真实标签之间的损失。
5. `trainer.zero_grad()`:清零优化器中之前计算的梯度值。
6. `l.backward()`:根据当前批量样本的损失值,进行反向传播计算梯度。
7. `trainer.step()`:根据计算得到的梯度值,更新模型中的参数。
8. `l = loss(net(features), labels)`:计算整个训练数据集上的损失值,用于打印训练过程中的损失变化。
9. `print(f'epoch {epoch + 1}, loss {l:f}')`:打印当前轮数和损失值。`{epoch + 1}`表示当前轮数加1,`{l:f}`表示将损失值以浮点数的形式进行格式化输出。
综合起来,这段代码实现了一个简单的训练循环,通过多轮的训练,使用随机梯度下降算法更新模型的参数,以最小化损失函数。每轮训练中,遍历训练数据集的每个小批量样本,计算损失值并进行反向传播更新参数。最后,打印每轮训练的损失值。