1.①任何在原地(in-place)改变张量的操作都需要加一个’_’后缀。例如x.copy_(y), x.t_()
操作将改变x
②神经网络的典型训练过程如下:
(一)
1. 定义神经网络模型,它有一些可学习的参数(或者权重);
2. 在数据集上迭代;
3. 通过神经网络处理输入;
4. 计算损失(输出结果和正确值的差距大小)
5. 将梯度反向传播会网络的参数;
6. 更新网络的参数,主要使用如下简单的更新原则: weight = weight - learning_rate * gradient
(二)
- 使用
torchvision
加载和归一化CIFAR10训练集和测试集. - 定义一个卷积神经网络
- 定义损失函数
- 在训练集上训练网络
- 在测试机上测试网络
③torch.nn中必须对单个样本做x.unsqueeze(0)升维(由3->4):
torch.nn
只支持小批量输入,整个torch.nn
包都只支持小批量样本,而不支持单个样本- 例如,
nn.Conv2d
将接受一个4维的张量,每一维分别是sSamples * nChannels * Height * Width(样本数*通道数*高*宽). - 如果你有单个样本,只需使用
input.unsqueeze(0)
来添加其它的维数(HWC->NHWC)
④torchvision的输出是[0,1]的PILImage图像,我们把它转换为归一化范围为[-1, 1]的张量:
transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
⑤
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
⑥彩图是3通道RGB,但是在opencv里的顺序默认是反的(BGR)