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 文件读写操作实例详解
Mar 12 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
python生成词云的实现方法(推荐)
Jun 13 Python
Python金融数据可视化汇总
Nov 17 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
pytorch 修改预训练model实例
Jan 18 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
python微信公众号开发简单流程实现
Mar 09 Python
Python 多进程、多线程效率对比
Nov 19 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 Python
详解OpenCV曝光融合
Apr 29 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
做一个有下拉功能的留言版
2006/10/09 PHP
mysq GBKl乱码
2006/11/28 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
jquery层次选择器的介绍
2019/01/18 jQuery
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
vuex存值与取值的实例
2019/11/06 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
基于Python正确读取资源文件
2020/09/14 Python
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
招商专员岗位职责
2014/02/08 职场文书
排查整治工作方案
2014/06/09 职场文书
委托书怎么写
2014/07/31 职场文书
2014年内勤工作总结
2014/11/24 职场文书