在BP手写识别MINIST中,存在很多杂乱的知识点,很多知识点大家已经了解,就不会赘述它,我所认为的难理解或者不熟悉的知识点在每个部分都会注释出来,如果大家的基础知识比较牢固,可以直接跳过去看完整代码及运算结果。
简介
MINIST数据集即手写数字数据集,共有70000张图像,其中训练集60000张,测试集10000张。
所有图像都是28×28的灰度图像,每张图像包含一个手写数字。
共10个类别,每个类别代表0~9之间的一个数字,每张图像只有一个类别。
分部分描述代码
导入库
import torch.nn
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import matplotlib
#设置字体为楷体
matplotlib.rcParams['font.sans-serif'] = ['KaiTi'
其中,torchvision是计算机的视觉库
torchvision.transforms是数据转换模块
构建BP网络模型
class BPnetwork(torch.nn.Module):
def __init__(self):
super(BPnetwork, self).__init__() # 调用父类初始化方法
self.linear1 = torch.nn.Linear(28 * 28, 128)
self.ReLU1 = torch.nn.ReLU()
self.linear2 = torch.nn.Linear(128, 64)
self.ReLU2 = torch.nn.ReLU()
self.linear3 = torch.nn.Linear(64, 10)
self.softmax = torch.nn.LogSoftmax(dim=1)
def forward(self, x):
x=x.reshape(x.shape[0],-1)
x = self.linear1(x)
x = self.ReLU1(x)
x = self.linear2(x)
x = self.ReLU2(x)
x = self.linear3(x)
x = self.softmax(x)
return x
其中,输入层为图片的大小,即28*28
self.linear为隐藏层的定义,linear1-linear2分别表示两个隐藏层,而linear3为输出层
self.ReLu为使用ReLu激活函数来将其激活
最后,使用LogSoftmax来进行归一化处理
我们先来复习一下Softmax
而logsoftmax与softmax有什么