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模块的方法详解
Sep 18 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
Python之list对应元素求和的方法
Jun 28 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
如何验证python安装成功
Jul 06 Python
python集合的新增元素方法整理
Dec 07 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 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
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
python爬虫获取新浪新闻教学
2018/12/23 Python
python实现可逆简单的加密算法
2019/03/22 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
财务总监岗位职责
2014/03/07 职场文书
安全生产标语
2014/06/06 职场文书
反邪教标语
2014/06/23 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
党支部季度考核意见
2015/06/02 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
Python机器学习之底层实现KNN
2021/06/20 Python
ORACLE中dbms_output.put_line输出问题的解决过程
2022/06/28 Oracle