pytorch相关知识(BN、dropoutput+模型加载+损失函数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qxqsunshine/article/details/84037308

一、在模型测试的时候,前面会使用:

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()

使用有格式要求


 

猜你喜欢

转载自blog.csdn.net/qxqsunshine/article/details/84037308
今日推荐