数据预处理
心得笔记
首先要理解一下pytorch中的神经网络的数据格式,通过print打印mnist数据的shape可以知道,输入pytorch中nn.model中的数据的shape格式如下:
[[batch_size, 1, 28, 28]]
其中,batch_size就是每次该网络同时处理的图片数,设置合理的baich_size可以加快训练的运行速度与模型的稳定性(亲测如此)。然后‘1’就是通道数,因为我打印的时mnist数据集的shape,它是灰度图片,所以通道数为1, 如果图片为彩色图片,其通道数为3。最后两个‘28’就是图片的像素大小了,可以通过该图片文件的属性中的详细属性看到。
代码分析
需要用到的包
import torch
from torchvision import datasets, tranforms
from torch.utils.data import DataLoader
如何预处理自己的图片文件
网上有很多关于mnist数据集的预处理方法,但当我们自己要处理自己的图片文件时,就显得有些不知所措,详细请看代码:
import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
'''
定义一个转化函数,目的就是可以把我们常见的图片文件(jpg,png等)通过torchvision.transforms.ToTensor()函数
转化成tensor格式,然后再通过torchvision.transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
函数进行图片归一化,即将tensor中的值都限定在-1到1之间。
'''
transfroms = torchvision.transforms.Compose([torchvision.transforms.ToTensor()],
torchvision.transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]))
'''
读取目录下的图片文件,你的文件夹格式应该为如下情况:
directory/
├── class_x
│ ├── xxx.jpg
│ ├── xxy.jpg
│ └── ...
│ └── xxz.jpg
└── class_y
├── 123.jpg
├── nsdf3.jpg
└── ...
└── asd932_.jpg
即,directory下面有各种各样的类别文件夹,然后在这个类别文件夹下才是你自己的图片文件,之所以需要这样
是因为,它这个torchvision.datasets.DatasetFolder函数能够根据你的class_x的名字来自动定义标签,
如上,class_x文件夹下的图片的标签就是0,class_y下的图片标签就是1,以此类推。
'''
imagenet_data = torchvision.datasets.DatasetFolder('path/to/directory/', transform=transfroms )
'''
最后就是构造一个迭代器了,batch_size就是接下来要批量处理的数量,shffle标志是否给imagenet_data中的数据打乱,顺序随机一下。
'''
data_loader = torch.utils.data.DataLoader(imagenet_data,
batch_size=4,
shuffle=True)
'''
最后就是可以处理数据了,我们先假设我们已经构造好了模型为model, 损失函数为criterion,优化函数为optimizer
'''
model = ’自己的网络结构‘
optimizer = optim.Adam(model.parameters(), lr=0.0001) # 优化方法,学习率为lr的值
criterion = nn.MSELoss() # 损失函数,即计算模型的预测值和真实标签label的差异大小的函数
epoch = 200 # 将整个数据集训练200次
for i in range(epoch):
for data in data_loader:
imgs, labels = data #提出图片和该图片的标签
# ======前向传播=======
outputs = model(img)
loss = criterion(outputs, labels)
# ======反向传播=======
optimizer.zero_grad()
loss.backward()
optimizer.step()