在上一篇文章中,笔者介绍了什么是Softmax回归及其原理。因此在接下来的这篇文章中,我们就来开始动手实现一下Softmax回归,并且最后要完成利用Softmax模型对Fashion MINIST进行分类的任务。在开始实现Softmax之前,我们先来了解一下Fashion MINIST这一数据集。
1 数据集
1.1 FashionMNIST
数据集FashionMNIST虽然名字里面有’MNIST’这个词,但是其与手写体识别一点关系也没有,仅仅只是因为FashionMNIST数据集在数据集规模、类别数量和图片大小上与MINIST手写体数据集一致。
如图1所示便为Fashion MNIST数据集的部分可视化结果,其包含有训练集6万张和测试集1万张,每张图片的大小为[28,28]
。在Pytorch中,我们可以通过如下代码对其进行载入:
def load_dataset():
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=True,transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False, download=True,transform=transforms.ToTensor())
return mnist_train, mnist_test
其中参数root
表示指定数据集的保存目录;train
表示返回训练集还是测试集;download
表示数据集不存在时是否需要下载;transform
表示指定一种转换方法,而指定transforms.ToTensor()
就是将尺寸为(H x W x C)且数据位于[0,255]的PIL图片或者数据类型为np.unit8
的numpy数组转换为尺寸为(C x H x W)且数据类型为torch.float32
,范围在 [ 0.0 , 1.0 ] [0.0,1.0] [0.0,1.0]的Tensor
。
同时,我们还可以通过代码image= mnist_train[0][0]
和label=mnist_train[0][1]
来分别访问一张图片和其对应的标签值。
1.2 构造数据集
在模型实际训练过程中,数据读取经常是训练的性能瓶颈。同时,为了能够更好的训练模型我们通常会对数据进行打乱,以及分批(batch)的将数据输入的模型中。在Pytorch中,我们可以通过DataLoader
这个类来方便的完成上述功能。
start = time.time()
train_iter = torch.utils.data.DataLoader(mnist_test, batch_size=1024, shuffle=True, num_workers=2)
for x_test, y_test in train_iter:
print(x_test.shape)
print('%.2f sec' % (time.time() - start))
#结果
torch.Size([1024, 1, 28, 28])
torch.Size([1024, 1, 28, 28])
torch.Size([1024, 1, 28, 28])
torch.Size([1024, 1, 28, 28])
torch.Size([1024