本文主要用于积累自己学习过程中搭建神经网络的常见代码,如有不准确之处,欢迎各路大神指出!谢谢!
训练网络
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
criterion = nn.NLLLoss()
- optim.SGD ()用于优化神经网络,使得训练过程更快,节省训练时间,但需在括号中传入网络的各种参数。torch.optim是实现各种优化算法的包。lr即learning rate(学习率),.parameters()提供了网络的其他参数,比较方便。
- nn.NLLLoss()是一种损失函数,其输入是图片分类后的得分向量,损失函数的结果越小,表示预测的越准确。
# 运行主训练循环
for epoch in range(epochs):
for batch_idx, (data, target) in enumerate(train_loader):
data, target = Variable(data), Variable(target)
# 将数据大小从 (batch_size, 1, 28, 28) 变为 (batch_size, 28*28)
data = data.view(-1, 28*28)
optimizer.zero_grad()
net_out = net(data)
loss = criterion(net_out, target)
loss.backward()
optimizer.step()
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.data[0]))
- 神经网络的训练通常用梯度下降法,如果训练数据过多, 无法一次性将所有数据送入计算(epoch),现将数据分成几个部分(batch)。
-
data, target = Variable(data), Variable(target)
将data和target转换为PyTorch变量。本数据集的大小是(batch_size, 1, 28, 28),当从数据加载器中提取数据时,这个4D的张量更适合卷积神经网络,而不太适合我们的全连接网络。因此,我们需要将(1,28,28)数据平展为28 × 28 = 784个输入节点的单一维度。
-
data = data.view(-1, 28*28)
.view()函数对PyTorch变量进行操作,以改变它们的形状。如果我们不知道给定维度的大小,我们可以在大小定义中使用“-1”。
-
optimizer.zero_grad()
使模型中的所有梯度归零(重置),以便为下一次反向传播做好准备。
-
net_out = net(data)
将输入数据传入模型,实际上是调用Net类中的forward()方法,变量net_out保存神经网络的log softmax输出。
-
loss = criterion(net_out, target)
criterion()是一种损失函数,用来计算神经网络输出和目标数据之间的负对数似然损失。
-
loss.backward()
从损失变量通过神经网络进行反向传播操作。
-
optimizer.step()
optimzier优化器原理:根据神经网络反向传播的梯度信息来更新网络的参数,以起到降低损失函数计算值的作用。优化器起到优化作用,首先需要知道当前的网络的参数空间,所以正式训练前需要将网络的参数传入优化器,即前面提到的optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9);另外需要知道反向传播的梯度信息,即前面提到的optimizer.step()。
-
if batch_idx % log_interval == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.data[0]))
最后,当迭代达到一定次数时,我们打印出一些结果。
Train Epoch: 9 [52000/60000 (87%)] Loss: 0.015086
Train Epoch: 9 [52000/60000 (87%)] Loss: 0.015086
Train Epoch: 9 [54000/60000 (90%)] Loss: 0.030631
Train Epoch: 9 [56000/60000 (93%)] Loss: 0.052631
Train Epoch: 9 [58000/60000 (97%)] Loss: 0.052678
参考文章:
在PyTorch中创建神经网络(逐句解释代码) - 知乎 (zhihu.com)