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正则分组的应用
Nov 10 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python 中如何获取列表的索引
Jul 02 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
python实现飞船大战
Apr 24 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
Python如何用re模块实现简易tokenizer
May 02 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
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
Python的条件语句与运算符优先级详解
2015/10/13 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python进度条显示之tqmd模块
2020/08/22 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
会计系中文个人求职信
2013/12/24 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
企业工会工作总结2015
2015/05/13 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang