解决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,选取训练好的值,否则则会取平均,可能导致生成的图片颜色失真。
PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval
使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!!!!!!
eg:
Class Inpaint_Network() ...... Model = Inpaint_Nerwoek() #train: Model.train(mode=True) ..... #test: Model.eval()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Pytorch evaluation每次运行结果不同的解决
这两天跑测试图时,发现用同样的model,同样的测试图,每次运行结果不同; 经过漫长的debug发现,在net architure中有dropout,如下(4): (conv_block): Sequential( (0): ReflectionPad2d((1, 1, 1, 1)) (1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1)) (2): InstanceNorm2d(256, eps=1e-05, momentum=0.1,
-
踩坑:pytorch中eval模式下结果远差于train模式介绍
首先,eval模式和train模式得到不同的结果是正常的.我的模型中,eval模式和train模式不同之处在于Batch Normalization和Dropout.Dropout比较简单,在train时会丢弃一部分连接,在eval时则不会.Batch Normalization,在train时不仅使用了当前batch的均值和方差,也使用了历史batch统计上的均值和方差,并做一个加权平均(momentum参数).在test时,由于此时batchsize不一定一致,因此不再使用当前batch的均
-
pytorch加载预训练模型与自己模型不匹配的解决方案
pytorch中如果自己搭建网络并且加载别人的与训练模型的话,如果模型和参数不严格匹配,就可能会出问题,接下来记录一下我的解决方法. 两个有序字典找不同 模型的参数和pth文件的参数都是有序字典(OrderedDict),把字典中的键转为列表就可以在for循环里迭代找不同了. model = ResNet18(1) model_dict1 = torch.load('resnet18.pth') model_dict2 = model.state_dict() model_list1 = lis
-
解决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(
-
解决Pytorch训练过程中loss不下降的问题
在使用Pytorch进行神经网络训练时,有时会遇到训练学习率不下降的问题.出现这种问题的可能原因有很多,包括学习率过小,数据没有进行Normalization等.不过除了这些常规的原因,还有一种难以发现的原因:在计算loss时数据维数不匹配. 下面是我的代码: loss_function = torch.nn.MSE_loss() optimizer.zero_grad() output = model(x_train) loss = loss_function(output, y_train)
-
Pytorch训练网络过程中loss突然变为0的解决方案
问题 // loss 突然变成0 python train.py -b=8 INFO: Using device cpu INFO: Network: 1 input channels 7 output channels (classes) Bilinear upscaling INFO: Creating dataset with 868 examples INFO: Starting training: Epochs: 5 Batch size: 8 Learning rate: 0.001
-
解决Pytorch中Batch Normalization layer踩过的坑
1. 注意momentum的定义 Pytorch中的BN层的动量平滑和常见的动量法计算方式是相反的,默认的momentum=0.1 BN层里的表达式为: 其中γ和β是可以学习的参数.在Pytorch中,BN层的类的参数有: CLASS torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) 每个参数具体含义参见文档,需要注意的是,affine定义了BN层的
-
解决Pytorch半精度浮点型网络训练的问题
用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1.网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2.模型参数转换为half型,不必索引到每层,直接model.cuda().half()即可 3.对于半精度模型,优化算法,Adam我在使用过程中,在某些参数的梯度为0的时候,更新权重后,梯度为零的权重变成了NAN,这非常奇怪,但是Adam算法对于全精度数据类型却没有这个问题. 另外,SGD算法对于半精度和全精度计算均没有问题. 还有一个问题是不知道是不是网络
-
Linux部署Tomcat发布项目过程中各种问题及解决方法
部署项目到项目现场测试环境 JDK1.8 Tomcat8.5 Maven打包好的war Linux-----Centos 不知道谁给现场的Tomcat,将其上传到Linux平台******目录,并且进行解压.直接启动 图1: 问题1 因为是第一次启动Tocmat,没有日志文件.所以直接启动 ./startup.sh.后续可以使用以下命令动态的查看日志信息.执行后提示没有执行权限 ./startup.sh & tailf ../logs/catalina.out 问题分析: .sh可执行文件 当前
-
解决pytorch load huge dataset(大数据加载)
问题 最近用pytorch做实验时,遇到加载大量数据的问题.实验数据大小在400Gb,而本身机器的memory只有256Gb,显然无法将数据一次全部load到memory. 解决方法 首先自定义一个MyDataset继承torch.utils.data.Dataset,然后将MyDataset的对象feed in torch.utils.data.DataLoader()即可. MyDataset在__init__中声明一个文件对象,然后在__getitem__中缓慢读取数据,这样就不会一次把所
-
解决pytorch下出现multi-target not supported at的一种可能原因
在使用交叉熵损失函数的时候,target的形状应该是和label的形状一致或者是只有batchsize这一个维度的. 如果target是这样的[batchszie,1]就会出现上述的错误. 改一下试试,用squeeze()函数降低纬度, 如果不知道squeeze怎么用的, 可以参考这篇文章.pytorch下的unsqueeze和squeeze用法 这只是一种可能的原因. 补充:pytorch使用中遇到的问题 1. load模型参数文件时,提示torch.cuda.is_available() i
-
PyTorch梯度裁剪避免训练loss nan的操作
近来在训练检测网络的时候会出现loss为nan的情况,需要中断重新训练,会很麻烦.因而选择使用PyTorch提供的梯度裁剪库来对模型训练过程中的梯度范围进行限制,修改之后,不再出现loss为nan的情况. PyTorch中采用torch.nn.utils.clip_grad_norm_来实现梯度裁剪,链接如下: https://pytorch.org/docs/stable/_modules/torch/nn/utils/clip_grad.html 训练代码使用示例如下: from torch
-
pytorch DistributedDataParallel 多卡训练结果变差的解决方案
DDP 数据shuffle 的设置 使用DDP要给dataloader传入sampler参数(torch.utils.data.distributed.DistributedSampler(dataset, num_replicas=None, rank=None, shuffle=True, seed=0, drop_last=False)) . 默认shuffle=True,但按照pytorch DistributedSampler的实现: def __iter__(self) -> Ite
随机推荐
- Flex设置LinkButton的背景色有思路有源码
- Angular2平滑升级到Angular4的步骤详解
- Swift教程之下标详解
- linux find命令之xargs简单概述
- DB2常用傻瓜问题1000问(一)第1/2页
- MongoDB 3.4 安装以 Windows 服务方式运行的详细步骤
- Oracle 11g控制文件全部丢失从零开始重建控制文件
- 一段眼睛跟着鼠标转动的跟踪眼代码
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- 详解Python中的条件判断语句
- js通过location.search来获取页面传来的参数
- php 字符串替换的方法
- python动态参数用法实例分析
- c# 计算时间间隔的简单方法(推荐)
- Android NDK开发的环境搭建与简单示例
- Docker占满磁盘空间的问题解决办法
- 完美实现八种js焦点轮播图(下篇)
- Javascript日期对象的dateAdd与dateDiff方法
- 基本jquery的控制tabs打开的数量的代码
- SQL Server日期计算第1/2页