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网络编程示例(客户端与服务端)
Apr 24 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
Python函数中apply、map、applymap的区别
Nov 27 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批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php的ddos攻击解决方法
2015/01/08 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
php类自动加载器实现方法
2015/07/28 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
自动适应iframe右边的高度
2016/12/22 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python写的一个文本编辑器
2014/01/23 Python
详解Python中for循环的使用方法
2015/05/14 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
python实现的生成word文档功能示例
2019/08/23 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
房地产财务部员工岗位职责
2014/03/12 职场文书
客户答谢会活动方案
2014/08/31 职场文书
谢师宴学生致辞
2015/07/27 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
Nginx实现负载均衡的项目实践
2022/03/18 Servers