LeNet的基于Pytorch框架的实现
前文已经详细介绍了LeNet的原理https://www.cnblogs.com/justkeen/p/15874085.html,本章主要使用Pytorch来对LeNet进行实现,并查看其运行的结果。
1 #将输入X变成批量数不变,通道数为1,大小为28*28的X
2 class Reshape(torch.nn.Module):
3
4 def forward(self,X):
5 return X.view(-1,1,28,28)
6
7 net = torch.nn.Sequential(
8 Reshape(),nn.Conv2d(1,6,kernel_size=5,padding=2),#第一个卷积层输入通道1,输出通道6
9 nn.sigmoid(),nn.AvgPool2d(kernel_size=2,stride=2),
10 nn.Conv2d(6,16,kernel_size=5),#输出通道数为16
11 nn.Sigmoid(),
12 nn.AvgPool2d(kernel_size=2,strid=2),
13 nn.Flatten(),
14 nn.Linear(16*5*5,120),
15 nn.Sigmoid(),
16 nn.Linear(120,84),
17 nn.Sigmoid(),
18 nn.Linear(84,10))
#对模型进行检查
19)
X = torch.rand(size=(1,1,28,28),dtype=torch.float32)
for layer in net:
X = layer(X)
print(layer.__class__.__name__,'output shape:\t',X.shape)
#换个数据集,在更难的FashionMINST数据集上的变现
batch_size = 256
train_iter,test_iter = data_load.load_data_fashion_mnist(batch_size=batch_size)
#对evaluate_accuracy函数进行轻微的修改
def evaluate_accuracy_gpu(net,data_iter,device=None):
#使用GPU计算模型在数据集上的精度,对自己使用的函数做一下修改
if isintance(net,nn.Module):
net.eval()
if not device:
device = net(iter(net.parameters())).device
metric = d2l.Accumulator(2)
for X,y in data_iter:
if isinstance(X,list):
X=[x.to(device) for x in X]
else:
x = X.to(device)
y=y.to(device)
metric.add(d2l.accuracy(net(X),y),y.numel())
return metric[0]/metric[1]
#下一步使用自己定义的training函数在GPU上进行训练
#使用Xavier初始化weight,随机梯度下降得到Lossfunction
#记得要net.to(device),最后打印效果观看