PyTorch dropout设置训练和测试模式的实现

看代码吧~

class Net(nn.Module):
…
model = Net()
…
model.train() # 把module设成训练模式,对Dropout和BatchNorm有影响
model.eval() # 把module设置为预测模式,对Dropout和BatchNorm模块有影响

补充:Pytorch遇到的坑——训练模式和测试模式切换

由于训练的时候Dropout和BN层起作用,每个batch BN层的参数不一样,dropout在训练时随机失效点具有随机性,所以训练和测试要区分开来。

使用时切记要根据实际情况切换:

model.train()
model.eval()

补充:Pytorch在测试与训练过程中的验证结果不一致问题

引言

今天在使用Pytorch导入此前保存的模型进行测试,在过程中发现输出的结果与验证结果差距甚大,经过排查后发现是forward与eval()顺序问题。

现象

此前的错误代码是

    input_cpu = torch.ones((1, 2, 160, 160))
    target_cpu =torch.ones((1, 2, 160, 160))
    target_gpu, input_gpu = target_cpu.cuda(), input_cpu.cuda()
    model.set_input_2(input_gpu, target_gpu)
    model.eval()
    model.forward()

应该改为

    input_cpu = torch.ones((1, 2, 160, 160))
    target_cpu =torch.ones((1, 2, 160, 160))
    target_gpu, input_gpu = target_cpu.cuda(), input_cpu.cuda()
    model.set_input_2(input_gpu, target_gpu)
    # 先forward再eval
    model.forward()
    model.eval()

当时有个疑虑,为什么要在forward后面再加eval(),查了下相关资料,主要是在BN层以及Dropout的问题。当使用eval()时,模型会自动固定BN层以及Dropout,选取训练好的值,否则则会取平均,可能导致生成的图片颜色失真。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • pytorch 中nn.Dropout的使用说明

    看代码吧~ Class USeDropout(nn.Module): def __init__(self): super(DropoutFC, self).__init__() self.fc = nn.Linear(100,20) self.dropout = nn.Dropout(p=0.5) def forward(self, input): out = self.fc(input) out = self.dropout(out) return out Net = USeDropout()

  • pytorch Dropout过拟合的操作

    如下所示: import torch from torch.autograd import Variable import matplotlib.pyplot as plt torch.manual_seed(1) N_SAMPLES = 20 N_HIDDEN = 300 # training data x = torch.unsqueeze(torch.linspace(-1, 1, N_SAMPLES), 1) y = x + 0.3 * torch.normal(torch.zeros(

  • 浅谈pytorch中的dropout的概率p

    最近需要训练一个模型,在优化模型时用了dropout函数,为了减少过拟合. 训练的时候用dropout,测试的时候不用dropout.刚开始以为p是保留神经元的比率,训练设置0.5,测试设置1,loss根本没减小过,全设置成1也是一样的效果,后来就考虑到是不是p设置错了. 上网一搜,果然是的!!!p的含义理解错了!不是保留的,而是不保留的! 具体的代码为: x2 = F.dropout(x1, p) x1是上一层网络的输出,p是需要删除的神经元的比例. 当p=0时,保留全部神经元更新.当p=1时

  • pytorch 实现在测试的时候启用dropout

    我们知道,dropout一般都在训练的时候使用,那么测试的时候如何也开启dropout呢? 在pytorch中,网络有train和eval两种模式,在train模式下,dropout和batch normalization会生效,而val模式下,dropout不生效,bn固定参数. 想要在测试的时候使用dropout,可以把dropout单独设为train模式,这里可以使用apply函数: def apply_dropout(m): if type(m) == nn.Dropout: m.tra

  • PyTorch 实现L2正则化以及Dropout的操作

    了解知道Dropout原理 如果要提高神经网络的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,复杂的网络也意味着更加容易过拟合. 于是就有了Dropout,大部分实验表明其具有一定的防止过拟合的能力. 用代码实现Dropout Dropout的numpy实现 PyTorch中实现dropout import torch.nn.functional as F import torch.nn.init as init import torch from torch.autograd

  • PyTorch dropout设置训练和测试模式的实现

    看代码吧~ class Net(nn.Module): - model = Net() - model.train() # 把module设成训练模式,对Dropout和BatchNorm有影响 model.eval() # 把module设置为预测模式,对Dropout和BatchNorm模块有影响 补充:Pytorch遇到的坑--训练模式和测试模式切换 由于训练的时候Dropout和BN层起作用,每个batch BN层的参数不一样,dropout在训练时随机失效点具有随机性,所以训练和测试要

  • pytorch 准备、训练和测试自己的图片数据的方法

    大部分的pytorch入门教程,都是使用torchvision里面的数据进行训练和测试.如果我们是自己的图片数据,又该怎么做呢? 一.我的数据 我在学习的时候,使用的是fashion-mnist.这个数据比较小,我的电脑没有GPU,还能吃得消.关于fashion-mnist数据,可以百度,也可以点此 了解一下,数据就像这个样子: 下载地址:https://github.com/zalandoresearch/fashion-mnist 但是下载下来是一种二进制文件,并不是图片,因此我先转换成了图

  • 解决Pytorch 训练与测试时爆显存(out of memory)的问题

    Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache()删除一些不需要的变量代码示例如下: try: output = model(input) except RuntimeError as exception: if "out of memory" in str(exception): print("WARNING: out of

  • pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    如下所示: device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#第一行代码 model.to(device)#第二行代码 首先是上面两行代码放在读取数据之前. mytensor = my_tensor.to(device)#第三行代码 然后是第三行代码.这句代码的意思是将所有最开始读取数据时的tersor变量copy一份到device所指定的GPU上去,之后的运算都在GPU上

  • Pytorch Mac GPU 训练与测评实例

    目录 正文 加速原理 环境配置 跑一个MNIST 跑一下VAE模型 一个愿景 正文 Pytorch的官方博客发了Apple M1 芯片 GPU加速的文章,这是我期待了很久的功能,因此很兴奋,立马进行测试,结论是在MNIST上,速度与P100差不多,相比CPU提速1.7倍.当然这只是一个最简单的例子,不能反映大部分情况.这里详细记录操作的一步步流程,如果你也感兴趣,不妨自己上手一试. 加速原理 苹果有自己的一套GPU实现API Metal,而Pytorch此次的加速就是基于Metal,具体来说,使

  • PyTorch使用GPU训练的两种方法实例

    目录 Pytorch 使用GPU训练 方法一 .cuda() 方法二 .to(device) 附:一些和GPU有关的基本操作汇总 总结 Pytorch 使用GPU训练 使用 GPU 训练只需要在原来的代码中修改几处就可以了. 我们有两种方式实现代码在 GPU 上进行训练 方法一 .cuda() 我们可以通过对网络模型,数据,损失函数这三种变量调用 .cuda() 来在GPU上进行训练 # 将网络模型在gpu上训练 model = Model() model = model.cuda() # 损失

  • 解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题

    背景 在公司用多卡训练模型,得到权值文件后保存,然后回到实验室,没有多卡的环境,用单卡训练,加载模型时出错,因为单卡机器上,没有使用DataParallel来加载模型,所以会出现加载错误. 原因 DataParallel包装的模型在保存时,权值参数前面会带有module字符,然而自己在单卡环境下,没有用DataParallel包装的模型权值参数不带module.本质上保存的权值文件是一个有序字典. 解决方法 1.在单卡环境下,用DataParallel包装模型. 2.自己重写Load函数,灵活.

  • 用pandas划分数据集实现训练集和测试集

    1.使用model_select子模块中的train_test_split函数进行划分 数据:使用kaggle上Titanic数据集 划分方法:随机划分 # 导入pandas模块,sklearn中model_select模块 import pandas as pd from sklearn.model_select import train_test_split # 读取数据 data = pd.read_csv('.../titanic_dataset/train.csv') # 将特征划分到

  • 测试模式 - XSL教程 - 5

    xslt支持的测试模式语句,用于条件判断,主要有:<xsl:if> 和<xsl:choose>及其下的<xsl:when>和<xsl:otherwise>   还是在匹配模式中使用的用户列表数据源. 1:使用xsl:if <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet version="1.0" xmlns:xsl=&

随机推荐