点击关注我的GitHub

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),最后打印效果观看





posted @ 2022-02-09 11:40  justkeen  阅读(126)  评论(0编辑  收藏  举报