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爬虫
Dec 25 Python
Python中threading模块join函数用法实例分析
Jun 04 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
python随机数分布random测试
Aug 27 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
Python 如何解决稀疏矩阵运算
May 26 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目录与文件操作
2011/12/30 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
对python判断是否回文数的实例详解
2019/02/08 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
详解Python中namedtuple的使用
2020/04/27 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
开办加工厂创业计划书
2014/01/03 职场文书
出国英文推荐信
2014/05/10 职场文书
预防传染病方案
2014/06/14 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
民事申诉状范本
2015/05/20 职场文书
Golang jwt身份认证
2022/04/20 Golang