pytorch 带batch的tensor类型图像显示操作


Posted in Python onMay 20, 2021

项目场景

pytorch训练时我们一般把数据集放到数据加载器里,然后分批拿出来训练。训练前我们一般还要看一下训练数据长啥样,也就是训练数据集可视化。

那么如何显示dataloader里面带batch的tensor类型的图像呢?

显示图像

绘图最常用的库就是matplotlib:

pip install matplotlib

显示图像会用到matplotlib.pyplot.imshow方法。查阅官方文档可知,该方法接收的图像的通道数要放到后面:

pytorch 带batch的tensor类型图像显示操作

数据加载器中数据的维度是[B, C, H, W],我们每次只拿一个数据出来就是[C, H, W],而matplotlib.pyplot.imshow要求的输入维度是[H, W, C],所以我们需要交换一下数据维度,把通道数放到最后面,这里用到pytorch里面的permute方法(transpose方法也行,不过要交换两次,没这个方便,numpy中的transpose方法倒是可以一次交换完成)

用法示例如下:

>>> x = torch.randn(2, 3, 5)
>>> x.size()
torch.Size([2, 3, 5])
>>> x.permute(1, 2, 0).size()
torch.Size([3, 5, 2])

代码示例

#%% 导入模块
import torch
import matplotlib.pyplot as plt
from torchvision.utils import make_grid
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
#%% 下载数据集
train_file = datasets.MNIST(
    root='./dataset/',
    train=True,
    transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
    ]),
    download=True
)
#%% 制作数据加载器
train_loader = DataLoader(
    dataset=train_file,
    batch_size=9,
    shuffle=True
)
#%% 训练数据可视化
images, labels = next(iter(train_loader))
print(images.size())  # torch.Size([9, 1, 28, 28])
plt.figure(figsize=(9, 9))
for i in range(9):
    plt.subplot(3, 3, i+1)
    plt.title(labels[i].item())
    plt.imshow(images[i].permute(1, 2, 0), cmap='gray')
    plt.axis('off')
plt.show()

这里以mnist数据集为例,演示一下显示效果。我这个代码其实还有一点小问题。数据增强的时候我不是进行标准化了嘛,就是在第7行代码:Normalize((0.1307,), (0.3081,))。

所以,如果你想查看训练集的原始图像,还得反标准化。

标准化:image = (image-mean)/std

反标准化:image = image*std+mean

我拿imagenet中的一个蚂蚁和蜜蜂的子集做了一下实验,标准化前后的区别还是很明显的:

pytorch 带batch的tensor类型图像显示操作

最终效果

pytorch 带batch的tensor类型图像显示操作

补充:PIL,plt显示tensor类型的图像

该方法针对显示Dataloader读取的图像

PIL 与plt中对应操作不同,但原理是一样的,我试过用下方代码Image的方法在plt上show失败了,原因暂且不知。

# 方法1:Image.show()
 # transforms.ToPILImage()中有一句
 # npimg = np.transpose(pic.numpy(), (1, 2, 0))
 # 因此pic只能是3-D Tensor,所以要用image[0]消去batch那一维
 img = transforms.ToPILImage(image[0])
 img.show()

 # 方法2:plt.imshow(ndarray)
 img = image[0] # plt.imshow()只能接受3-D Tensor,所以也要用image[0]消去batch那一维
 img = img.numpy() # FloatTensor转为ndarray
 img = np.transpose(img, (1,2,0)) # 把channel那一维放到最后
 # 显示图片
 plt.imshow(img)
 plt.show()
 cnt += 1

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python获得一个月有多少天的方法
Jun 04 Python
用python写的一个wordpress的采集程序
Feb 27 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
python3 实现验证码图片切割的方法
Dec 07 Python
python中dict()的高级用法实现
Nov 13 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
Python绘图之二维图与三维图详解
Aug 04 Python
python字典与json转换的方法总结
Dec 28 Python
python lambda的使用详解
Feb 26 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
pytorch 中nn.Dropout的使用说明
May 20 #Python
Python 线程池模块之多线程操作代码
May 20 #Python
pytorch中[..., 0]的用法说明
May 20 #Python
浅谈pytorch中stack和cat的及to_tensor的坑
May 20 #Python
pytorch实现手写数字图片识别
解决python3安装pandas出错的问题
May 20 #Python
python 如何在list中找Topk的数值和索引
May 20 #Python
You might like
php intval的测试代码发现问题
2008/07/27 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
javascript实现的listview效果
2007/04/28 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
简明 Python 基础学习教程
2007/02/08 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Python中turtle库的使用实例
2019/09/09 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
某公司部分笔试题
2013/11/05 面试题
90后毕业生的求职信范文
2013/09/21 职场文书
网络工程师个人的自我评价范文
2013/10/01 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
付款委托书范本
2014/04/04 职场文书
创文明城市标语
2014/06/16 职场文书
人民调解协议书范本
2014/10/11 职场文书
撤诉状格式范本
2015/05/19 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server