深入浅出Pytorch
手写数字识别:LeNet
深度学习工程的结构
常见的深度学习工程文件排列
project/ #project 代表工程目录
data.py #负责数据导入的模块。包含和数据载入相关的 Dataset 类和 DataLoader 类
utils.py #包含深度学习工程中常用的一些工具。比如,对于模型的模块和参数的一些预处理等
model.py #模型的核心部分。所有的模型中包含的模块和子模块一般都在这个文件中定义
train.py #代表模型训练部分的代码
inference.py #代表模型预测(推断)部分的代码
csrc/ #由于 Pytorch 代码中可以引入 C/C++ 语言编写 的模块,加速模块的计算速度,
#或者实现一些 Pytorch 没有的模块,因此,在一些情况下可以引入 C/C++ 语言编写的代码,
#并且使用 pybind1 库导入供 Pytorch 使用,在这种情况下,csrc 目录就可以用来放置对应的代码,
#编译后的动态链接库可以到处为接口,以包的形式提供给 Pytorch 导入和调用
MINIST数据集的准备
首先是前面所述的 MINIST 数据集的载入。Lenet 神经网络的输入是 32 * 32,因此这里首先需要把 MINIST的输入 28 * 28 进行缩放,使其大小为 32 * 32。
# data.py
from torchvision.datasets import MNIST
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
data_path = './data'
data_train = MNIST(data_path, train=True, download=True,
transform=transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor()
]))
data_test = MNIST(data_path, train=False, download=True,
transform=transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor()
]))
data_train_loader = DataLoader(data_train, batch_size=256,shuffle=True) #num_workers=0
data_test_loader = DataLoader(data_test, batch_size=1024) ##num_workers=0
有了数据集之后,使用一些画图工具(如 Matlplotlib)对 MINIST 数据集的输出绘图,检查输出的图像是否正确
# MINIST 数据展示代码
import matplotlib.pyplot as plt
figure = plt.figure
num_of_image = 60
for imgs, targets in data_train_loader:
break
for index in range(num_of_image):
plt.subplot(6, 10, index+1)
plt.axis('off')
img = imgs[index, ...]
plt.imshow(img.squeeze(), cmap='gray_r')
plt.show()
LeNet 网络的搭建
LeNet 整个神经网络一共有6个组成部分,