目录
书籍目录:
笔记1:数据预览和数据装载 书6.4
原书代码整理:
执行结果:
代码详解:
transforms.Compose() 多种数据变换,容器
transforms.ToTensor() 数据类型转换
transforms.Normalize() 标准化变换
torch.utils.data.DataLoader()数据装载
iter()生成迭代器
next()返回迭代器的下一个项目
torchvision.utils.make_grid() 将一个批次的图片构造成网格模式
transpose() 改变维度顺序
我遇到的坑
首先说,感觉这本书超级适合新手入门的!!!就是从python开始那种
我是已经乱七八糟的学过python,包括一些plt、numpy、opencv,复习了一遍线性代数,尝试学习过一丢丢神经网络才拿到这本书的,所以感觉嗯,1/3 的内容直接略过了(每当这种情况我都有点心疼书钱)但是对于新手我觉得这本书很好的,内容都是有用的,方面都比较全,虽然不是很详细,但是可以对应再查嘛
import torch
from torchvision import datasets,transforms
import torchvision
from torch.autograd import Variable
import numpy as np
import cv2
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])])
data_train=datasets.MNIST(root="./data", transform=transform, train=True,
download=True
)
data_test=datasets.MNIST(root="./data", transform=transform, train=False)
data_loader_train=torch.utils.data.DataLoader(dataset=data_train,
batch_size=16,
shuffle=True)
data_loader_test=torch.utils.data.DataLoader(dataset=data_test,
batch_size=16,
shuffle=True)
images,labels=next(iter(data_loader_train))
img=torchvision.utils.make_grid(images)
img=img.numpy().transpose(1,2,0)
#cv2.imshow('win',img);
std=[0.5,0.5,0.5]
mean=[0.5,0.5,0.5]
img=img*std+mean
print([labels[i] for i in range(16)])
cv2.imshow('win',img);
key_pressed=cv2.waitKey(0);
引入包就不说了 *略
#数据变换
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])])
transforms.Compose() 相当一种容器,对多种数据变换组合,实例代码中进行了两种变换
将数据转换为Tensor类型,才能再Pytorch中进行计算
#下载训练集和测试集
data_train=datasets.MNIST(root="./data",
transform=transform,
train=True,
download=True
)
data_test=datasets.MNIST(root="./data",
transform=transform,
train=False)
下载训练集和测试集,下载到了当前路径中,实现下载的代码是torchvision.dataset.MNIST
transform用于指定变换,transform之前已经定义过
train=True 代表载入的是数据集的训练集部分,=False:测试集部分
#数据装载
data_loader_train=torch.utils.data.DataLoader(dataset=data_train, #指定数据集
batch_size=64,
shuffle=True)
data_loader_test=torch.utils.data.DataLoader(dataset=data_test, batch_size=64, shuffle=True)
batch_size 需要将图片打包送给模型训练,设定每个包的大小(图片数量)
shuffle 是否将图片打乱
images,labels=next(iter(data_loader_train))
#网格变换前,四个维度(batch_size,channel,height,weight)
img=torchvision.utils.make_grid(images) #三个维度 (channel,height,weight)
img=img.numpy().transpose(1,2,0) #改变维度顺序(height,weight,channel)
一个批次的图片整合在了一起(如执行结果),减去了batch_size维度
(channel,height,weight) --> img=img.numpy().transpose(1,2,0) -->(height,weight,channel)
std=[0.5,0.5,0.5]
mean=[0.5,0.5,0.5]
img=img*std+mean
这步处理我没有懂,列出前后对比吧
#打印这批次图片的标签
print([labels[i] for i in range(16)])
#显示
cv2.imshow('win',img);
key_pressed=cv2.waitKey(0);
书中显示是用的plt,但是我的plt不显示图片。。。
1.torchvision 我用的是windows,而Anaconda Cloud 里torchvision没有win版本的,其实直接用 pip install torchvision 就可以
但是我的安装成功了,import torchvision却会报错,原以为我之前都是conda安装的,所以pip安装不在一个解析器下所以不好使,但是经历了一天半(包括想放弃win而安装ubuntu虚拟机吧啦吧啦)后,终于发现哪出了问题:
我的pillow 包版本低,所以找不到image模块 所以 conda update pillow 之后就ok了,import torchvision终于正常
2. 我用matplotlib中的pyplot时(plt) plt.imshow()不显示图片,受到之前的教训,把matplotlib升级试了试,问题来了,在它升级过程中,不知道它和pillow有什么关系,竟将pillow降级了,可想而知,我的torchvision又不能用了
所以最后又把pillow给更新了,用cv2代替plt的显示功能