import matplotlib.pyplot as plt用来处理图像,from torch.utils.data import DataLoader用来下载数据集。
用一个super_param这样一个字典来存储超参数,其中batch_size代表一次训练所选取的样本数,device代表是用CPU还是使用CUDA(GPU),epoch是训练的次数,lr代表学习率。然后采取EasyDict,即super_param = EasyDict(super_param),EasyDict是可以使得以属性的方式去访问字典的值。
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3081,)) #正则化
]
其中transform.ToTensor()是将图像处理为张量(我自己的理解是将图片处理成Tensor的张量类型),然后后面的Normalize就是标准化一个Tensor。
nn.Conv2d(in_channels=1,out_channels=10,kernel_size=5,stride=1,padding=0),# b*1*28*28-->b*10*24*24
其中,in_channels代表输入通道数,因为灰白图是一维的,所以设置输入通道数为1。out_channels代表输出通道数,由于输出10个特征,所以输出通道数设为10。将卷积核大小设置为5×5。stride等于1为其步长。padding=0是指映射时无需跳跃间隔。
由于卷积核为5×5大小,即按照公式得到的特征图像大小应为(28-5/1+1)即为24。
nn.ReLU(),
我对于激励函数的理解就是使提取出的特征更明显,忽略掉一些无效的特征。
nn.MaxPool2d(2),# b*10*24*24-->b*10*12*12
这是指池化层,采取MAX POOLING进行处理,将其缩小一半。
nn.Conv2d(10,20,3,1,0),# b*10*12*12-->b*20*10*10
这一层输入通道数为10即10个特征,输出通道数设为20,即需要输出20个特征,卷积核大小为3×3,步长为1,padding为0。其经公式计算为10*10的特征图像大小。
nn.ReLU(),
再次进行激励函数,凸显特征。
nn.Flatten(),#b*20*10*10-->b*2000
张量flatten操作是卷积神经网络中的一种常见操作。这是因为传递给全连接层的卷积层的输出必须在全连接层接受输入之前进行flatten。所以这个就是将20×10×10的灰度图扁平化张量。
nn.Linear(2000,500),#b*2000-->b*500
将2000个神经元全连接连为500个神经元。
nn.ReLU(),
再次激励。
nn.Linear(500,10),#b*500-->b*10
将500个神经元全连接连为10个神经元。
nn.ReLU(),
再次激励。
nn.Softmax(),
归一化。
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),lr=super_param.lr)
SGD:随机梯度下降。每次随机选择一个mini-batch去计算梯度,在minibatch-loss上的梯度显然是original-loss上的梯度的无偏估计,因此利用minibatch-loss上的梯度可以近似original-loss上的梯度,并且每走一步只需要遍历一个minibatch(一~几百)的数据。
def train_model_epoch(model,train_loader,super_param,criterion,optimzer,epoch):
将搭建的卷积神经网络模型,下载的训练集,设置的超参数,以及损失函数、优化函数(梯度下降)传入单个epoch函数。