使用标准python包将数据加载成numpy数组格式,然后转换成torch.*Tensor
自定义数据集制作与使用
视觉工具包:torchvision(封装数据)
可以加载数据并归一化
- 公共数据集的数据加载模块–torchvision.datasets
- 图像数据的数据加载模块–torch.utils.data.Dataloader
#torchvision数据集的输出是范围在[0,1]之间的PILImage,我们将其转化成归一化范围为[-1,1]之间的张量Tensors.
import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
[transforms.ToTensor(), #变成张量
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) #归一化
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, #导入训练集
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, #dataloader封装几个为一批
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')
👆加载数据——定义网络net—(见1、4)—定义loss和优化器——训练分类器(迭代)👇
for epoch in range(2): # 用训练集对模型进行两次训练
running_loss = 0.0 #初始化
for i, data in enumerate(trainloader, 0): #对次数和样本进行迭代 计算每个样本的误差
# get the inputs
inputs, labels = data #提取输入及其标签
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # 每两千个样本 打印一次loss
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
输出
#[第几次输入训练集,训练了一个训练集中的多少个] loss为多少
[1, 2000] loss: 2.187
[1, 4000] loss: 1.852
[1, 6000] loss: 1.672
[1, 8000] loss: 1.566
[1, 10000] loss: 1.490
[1, 12000] loss: 1.461
[2, 2000] loss: 1.389
[2, 4000] loss: 1.364
[2, 6000] loss: 1.343
[2, 8000] loss: 1.318
[2, 10000] loss: 1.282
[2, 12000] loss: 1.286
Finished Training
图片尺寸预处理
torchvision.transforms
数据集图片并不是同样的尺寸。绝大多数神经网络都假定图片的尺寸相同。因此我们需要做一些预处理。
transforms = transforms.Compose(
[transforms.Resize([opt.img_size,opt.img_size]), #尺寸
#transforms.RandomHorizontalFlip(), #水平翻转
#transforms.CenterCrop((size, size)), #以图象中心为中心点裁剪
transforms.ToTensor(), #做数据归一化之前必须要把PIL Image转成Tensor
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])