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函数之作用域(python3.5)
Oct 27 Python
Django model序列化为json的方法示例
Oct 16 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 24 Python
Python+Appium自动化测试的实战
Jun 30 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+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
Python实现的统计文章单词次数功能示例
2019/07/08 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
Python bytes string相互转换过程解析
2020/03/05 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
电子商务专业学生职业生涯规划
2014/03/07 职场文书
网站美工岗位职责
2014/04/02 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript