关于 Transforms.Compose 的小问题
🎨关于 Transforms.Compose 的小问题
- 今天简单的玩了一下
pytorch
自带的CIFAR10
数据集构建多分类预测模型,使用torchvision.transforms.Compose
时,发现了一个小小的BUG。
- 我已经训练好了
CIFAR10
的预测模型,而我要对模型进行简单的验证。
导入相关模块和已经构建好的神经网络结构模型
1 | import torch |
编写主程序代码
1 | image_path = './image/img.png' |
- 当我找了一张小狗的图片进行验证时,结果是 airplane ,什么!!!飞机?我的天~
![]() |
![]() |
- 我的第一反应是我的预测模型训练迭代不好造成的,于是我对
CIFAR10
模型训练增长到35次,这次应该没问题了吧。但是这次竟然给我预测成了 frog,不应该呀!
![]() |
![]() |
- 于是我又找了一张小猫的图片,竟然也是 frog ,这么一来说明我验证的全不对了。怎么回事呢?
🐎去看官方文档,在Compose
并没有找到答案,在我捣鼓了半天后,突然发现了一个问题!!!
1 | transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor(), |
- 当我将
ToTensor
与Resize
两个 object 互换位置后,发现预测的结果正确了!而且再试了多个不同图片也预测正确了!😵🤔
![]() |
![]() |
🐟晕,为什么会这样呢,还得慢慢学习,查找原因。
原因
- 经过对Pytorch框架的学习,回看这篇博客,回复一下当初初学DL时的问题。
- transforms.Compose() 是按照顺序将输入的list中的图像处理方法逐一对图像进行预处理的,torch中ToTensor()方法是将原数据类型转换为Pytorch的张量(tensor)数据类型,且还包含了数据归一化处理。Resize()方法是采用插值方法将图片的分辨率调整为指定的大小。
- 如果先对图像进行Totensor(),图像中的像素由整数转换为浮点数,再进行Resize(),会导致图像的像素值精度出现极大误差,引入不精确的像数值,导致图像失真。