一、在模型测试的时候,前面会使用:
model.eval() 语句
但是如果不写运行也会正确,因为这个方法是针对在训练网络和测试时采用不同的情况来进行的
如:Batch Normalization 和Dropout
1、Batch Normalization (BN)
主要是针对网络的中间每一层进行批归一化处理,并且使用变换结构(Batch Normalizing Transform)保证每层所提取的特征分布不会被破坏。
在训练时是针对每个mini-batch的,但是测试却是针对单张图片的,不存在minibatch的概念,由于网络训练完毕后参数都是固定的,因此每个批次的均值和方差都是不变的,因此直接结算所有的Batch的均值和方差。
因此,所有Batch Normalization的训练和测试时的操作不同
2、Dropout
Dropout能够克服Overfitting,在每个批次的训练中,通过忽略一般的特征检测器,可以明显减少过拟合现象。
在训练中,每个隐层神经元先乘概率P,然后再进行激活
在测试中,所有的神经元先进行激活,然后每个隐层神经元的输出乘以概率p
二、pytorch的模型加载
1、pyTorch中有个包torchvision,其主要由3个子包组成:torchvision.datasets、torchvision.models、torchvision.transforms
其中,torchvision.models这个包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的网络结构,并且提供了预训练模型,可以通过简单调用来读取网络结构和预训练模型。
2、下载和构建
代码:
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
alexnet = models.alexnet(pretrained=True)
squeezenet = models.squeezenet1_0(pretrained=True)
预训练模型期望的输入是RGB图像的mini-batch:(batch_size, 3, H, W),并且H和W不能低于224。图像的像素值必须在范围[0,1]间,并且用均值mean=[0.485, 0.456, 0.406]和方差std=[0.229, 0.224, 0.225]进行归一化。
三、损失函数
损失函数、优化器是神经网络模型的两个必要的参数。
损失函数是用于计算标签值和预测值之间的差异,典型的有(距离向量、绝对值向量) 平方差、均方差(多维空间中)
Pytorch中的损失函数
3.1、 nn.L1Loss()
取预测值和真实值的绝对误差的平均数。
代码:criterion=nn.L1Loss() loss=criterion(sample,targe) print(loss)
3.2、nn.SmoothL1Loss()
SmoothL1Loss也叫做Huber loss,其误差在(-1,1)上是平方误差,其他情况是L1损失
代码:criterion=nn.SmoothL1Loss() loss=criterion(sample,target) print(loss)
3.3、NN.BCELoss()
二分类用的交叉熵函数,计算公式比较复杂
代码:criterion=nn.BCELoss()
3.4 nn.MSELoss()
平方损失函数 ,计算预测值和真实值之间的平方和的平均数
代码:criterion=nn.MSELoss()
3.5 nn.CrossEntropyLoss
交叉熵损失函数, 该公式用的比较多,如在图像分类神经网络模型中
criterion=nn.CrossEntropyLoss() losss=criterion(sample,target) print(loss)
注意:此函数是用于图像的识别和验证的,对于输入的参数有格式的要求
4.6、 nn.LLLoss()
负对数死然后损失函数(Negative log LIkelihood)
在前面接上一个 LogSoftMax 层就等价于交叉熵损失了。注意这里的 xlabel 和上个交叉熵损失里的不一样,这里是经过 log 运算后的数值。这个损失函数一般也是用在图像识别模型上。
代码:
criterion = F.nll_loss()
loss = criterion(sample, target)
print(loss)
loss=F.nll_loss(sample,target)
注意:Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的!通常都是用在多分类模型中,实际应用中我们一般用 NLLLoss 比较多。
4.7 nn.NLLLoss2d
和上面类似,只是多了几个维度,一般用在图片上
-
input, (N, C, H, W)
-
target, (N, H, W)
比如用全卷积网络做分类时,最后图片的每个点都会预测一个类别标签
代码:criterion=nn.NLLLoss2d()
使用有格式要求