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类:class创建、数据方法属性及访问控制详解
Jul 25 Python
Python实现端口检测的方法
Jul 24 Python
python实现京东秒杀功能
Jul 30 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
对python字典过滤条件的实例详解
Jan 22 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python 实现超级玛丽游戏
Nov 25 Python
python实现的web监控系统
Apr 27 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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使用pack处理二进制文件的方法
2014/07/03 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
Js获取事件对象代码
2010/08/05 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
JS简单计算器实例
2015/01/20 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
python中函数传参详解
2016/07/03 Python
python实现多线程网页下载器
2018/04/15 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
大学生创业策划书
2014/02/02 职场文书
义诊活动总结
2015/02/04 职场文书
推销搭讪开场白
2015/05/28 职场文书
国博复兴之路观后感
2015/06/02 职场文书