使用卷积对fashion_mnist数据集进行softmax分类

发布时间 2023-09-08 16:03:44作者: Ann-
import torch
from torch import nn
from d2l import torch as d2l
from torch.nn import functional as F

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

class lin_block(nn.Module):
    def __init__(self):
        super().__init__()
        self.lin1 = nn.Linear(256,128)
        self.lin2 = nn.Linear(128,64)
        nn.init.normal_(self.lin1.weight,std=0.01)
        nn.init.normal_(self.lin2.weight,std=0.01)
        
    def forward(self,X):
        X = F.relu(self.lin1(X))
        X = F.relu(self.lin2(X))
        return X
        
manual_block = lin_block()


#注意当训练函数train_ch3读入小批量X在net中计算的时候,这里的数据维度是没有问题的:
#fashion_mnist数据集中每一张图片的维度是(1,28,28),这里batch_size为256,所以一个小批量的数据的维度其实是(256,1,28,28)
#net中第一层卷积层要求输入图片通道数为1,并且是一张2D图片,这里的图片数据符合这个要求。数据图片维度(1,28,28)可以理解为通道数是1,图片尺寸为(28,28) net
= nn.Sequential(nn.Conv2d(1,1,5,padding=2), nn.Conv2d(1,1,3,padding=1), nn.Flatten(), nn.Linear(784,256), nn.ReLU(), nn.Dropout(0.5), manual_block, nn.ReLU(), nn.Dropout(0.3), nn.Linear(64,10) ) loss = nn.CrossEntropyLoss(reduction='none') num_epochs = 20 updater = torch.optim.SGD(net.parameters(),lr=0.1) d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,updater)

 上面代码先将训练图片经过两个卷积层,卷积核大小分别为5*5和3*3,并在每一层加入padding保持图片尺寸不变(padding总行数等于卷积核尺寸减一,在pytorch中padding参数为总行数的一半)。然后经过若干线性层,最终将数据映射到一个10维的概率分布。

 

训练20个epoch,结果截图: