cv2.imread读取图像结果none_PyTorch 42.图像操作

1c1d49cd3b9f6adb38f304ab7f6534aa.png

本文转载自:

知乎用户​www.zhihu.com

1. 读取训练集

pytorch读取训练集是非常便捷的,只需要使用到2个类:

(1)torch.utils.data.Dataset

(2)torch.utils.data.DataLoader

常用数据集的读取

1、torchvision.datasets的使用

对于常用数据集,可以使用torchvision.datasets直接进行读取。torchvision.dataset是torch.utils.data.Dataset的实现

该包提供了以下数据集的读取

  • MNIST
  • COCO (Captioning and Detection)
  • LSUN Classification
  • ImageFolder
  • Imagenet-12
  • CIFAR10 and CIFAR100
  • STL10

下面以cifar10为例:

import 

2、实例化torch.utils.data.DataLoader

mytransform 

下面就可以进行读取数据的显示,以进行简单测试是否读取成功:

for 

注意这里的transforms.ToTensor()函数:

  • 将numpy的ndarray或PIL.Image读的图片转换成形状为(C,H,W)的Tensor格式,且/255归一化到[0,1.0]之间。
  • 通道的具体顺序与cv2读的还是PIL.Image读的图片有关系:
    cv2:(B,G,R)
    PIL.Image:(R,G,B)
import 

输出结果 :

a327df7981b50f871d5526f52b6b9b49.png

自定义标签数据集的读取

1、实现torch.utils.data.Dataset

假设我们有一个标签test_images.txt,内容如下:

2c131db81c56113994e576300065174b.png

对应的图像位于images目录下。

首先要继承torch.utils.data.Dataset类,完成图像及标签的读取。

import 

2、实例化torch.utils.data.DataLoader

mytransform 

2. 图像基本操作

为了方便进行数据的操作,pytorch团队提供了一个torchvision.transforms包,我们可以用transforms进行以下操作:

  • PIL.Image/numpy.ndarray与Tensor的相互转化;
  • 归一化;
  • 对PIL.Image进行裁剪、缩放等操作。

通常,在使用torchvision.transforms,我们通常使用transforms.Compose将transforms组合在一起。

PIL.Image/numpy.ndarray与Tensor的相互转换

PIL.Image/numpy.ndarray转化为Tensor,常常用在训练模型阶段的数据读取,而Tensor转化为PIL.Image/numpy.ndarray则用在验证模型阶段的数据输出

我们可以使用 transforms.ToTensor() 将 PIL.Image/numpy.ndarray 数据转化为torch.FloadTensor,并归一化到[0, 1.0]:

  • 取值范围为[0, 255]的PIL.Image,转换成形状为[C, H, W],取值范围是[0, 1.0]的torch.FloadTensor。
  • 形状为[H, W, C]的numpy.ndarray,转换成形状为[C, H, W],取值范围是[0, 1.0]的torch.FloadTensor。

transforms.ToPILImage则是将Tensor转化为PIL.Image。如果,我们要将Tensor转化为numpy,只需要使用 .numpy() 即可。如下:

img_path 

472545601c4ec4de87effbda182492ac.png
转化方法

归一化

归一化对神经网络的训练是非常重要的,那么我们如何归一化到[-1.0, -1.0]呢?只需要将上面的transform1改为如下所示:

transform2 

(1)transforms.Compose就是将transforms组合在一起;

(2)transforms.Normalize使用如下公式进行归一化:

channel=(channel-mean)/std

这样一来,我们的数据中的每个值就变成了[-1,1]的数了。

PIL.Image的缩放裁剪等操作

此外,transforms还提供了裁剪,缩放等操作,以便进行数据增强。下面就看一个随机裁剪的例子,这个例子中,仍然使用 Compose 将 transforms 组合在一起,如下:

# transforms.RandomCrop()

3. 模型的搭建保存加载

使用pytorch进行网络模型的搭建、保存与加载,是非常快速、方便的、妙不可言的。

搭建ConvNet

所有的网络都要继承torch.nn.Module,然后在构造函数中使用torch.nn中的提供的接口定义layer的属性,最后,在forward函数中将各个layer连接起来。

下面,以LeNet为例:

class 

这样一来,我们就搭建好了网络模型,是不是很简洁明了呢?此外,还可以使用torch.nn.Sequential,更方便进行模块化的定义,如下:

class 

Module有很多属性,可以查看权重、参数等等;如下:

net 

那么,如何进行参数初始化呢?使用 torch.nn.init ,如下:

def 

保存ConvNet

使用torch.save()对网络结构和模型参数的保存,有两种保存方式:

  • 保存整个神经网络的的结构信息和模型参数信息save的对象是网络net
  • 保存神经网络的训练模型参数save的对象是net.state_dict()
torch

加载ConvNet

对应上面两种保存方式,重载方式也有两种。

  • 对应第一种完整网络结构信息,重载的时候通过torch.load(‘.pth’)直接初始化新的神经网络对象即可。
  • 对应第二种只保存模型参数信息,需要首先导入对应的网络,通过net.load_state_dict(torch.load('.pth'))完成模型参数的重载。

在网络比较大的时候,第一种方法会花费较多的时间,所占的存储空间也比较大。

# 保存和加载整个模型  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值