6.7.1 LeNet¶

In [1]:
#@save codes_paddle_lenet
# paddle_codes06001_lenet

import paddle
from paddle import nn

class LeNet5(paddle.nn.Layer):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, padding=2),
            nn.Sigmoid(),
            nn.AvgPool2D(kernel_size=2, stride=2),
            nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1),
            nn.Sigmoid(),
            nn.AvgPool2D(kernel_size=2, stride=2)
        )
        self.fc = nn.Sequential(
            nn.Linear(in_features=16*5*5, out_features=120),
            nn.Sigmoid(),
            nn.Linear(in_features=120, out_features=84),
            nn.Sigmoid(),
            nn.Linear(84, 10)
        )

    def forward(self, inputs):
        x = self.features(inputs)
        x = paddle.flatten(x, 1)
        y = self.fc(x)
        return y

可视化模型结构

In [2]:
# paddle_codes06002_lenet_display
model = LeNet5()
paddle.summary(model, (1,1,28,28))  
---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================
   Conv2D-1       [[1, 1, 28, 28]]      [1, 6, 28, 28]          156      
   Sigmoid-1      [[1, 6, 28, 28]]      [1, 6, 28, 28]           0       
  AvgPool2D-1     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0       
   Conv2D-2       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416     
   Sigmoid-2     [[1, 16, 10, 10]]     [1, 16, 10, 10]           0       
  AvgPool2D-2    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0       
   Linear-1          [[1, 400]]            [1, 120]           48,120     
   Sigmoid-3         [[1, 120]]            [1, 120]              0       
   Linear-2          [[1, 120]]            [1, 84]            10,164     
   Sigmoid-4         [[1, 84]]             [1, 84]               0       
   Linear-3          [[1, 84]]             [1, 10]              850      
===========================================================================
Total params: 61,706
Trainable params: 61,706
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.11
Params size (MB): 0.24
Estimated Total Size (MB): 0.35
---------------------------------------------------------------------------

Out[2]:
{'total_params': 61706, 'trainable_params': 61706}

6.7.2 LeNet模型的训练¶

In [3]:
# paddle_codes06003_load_dataset_fashion_mnist
import sys
sys.path.append(r'D:\WorkSpace\DeepLearning\WebsiteV2')   # 定义模块保存位置
from utils import paddle as dl
import paddle

# 载入Fashion_MNIST数据集
train_reader, test_reader = dl.load_dataset_fashion_mnist(batch_size=256)

# 载入MNIST数据集
# train_reader, test_reader = dl.load_dataset_mnist(batch_size=256)

设置训练参数

In [5]:
# paddle_codes06004_train_fashion_mnist
# 1. 设置输入样本的维度、数据类型及名称
input_spec = paddle.static.InputSpec(shape=[None, 1, 28, 28], dtype='float32', name='image')
label_spec = paddle.static.InputSpec(shape=[None, 1], dtype='int64', name='label')

# 2. 载入预先定义好的网络,并实例化model变量
network = LeNet5()   
model = paddle.Model(network, input_spec, label_spec) 

# 3. 设置学习率、优化器、损失函数和评价指标
optimizer = paddle.optimizer.SGD(learning_rate=0.9, parameters=model.parameters()) 
model.prepare(optimizer,
            paddle.nn.CrossEntropyLoss(),
            paddle.metric.Accuracy(topk=(1,5)))

开始训练

In [5]:
# 4. 启动训练过程
total_epoch = 10
dl.train1(model, train_reader, test_reader, total_epoch)
train_loss:0.476, train_acc_top1:0.828, train_acc_top5:0.992, val_acc_top1:0.821, val_acc_top5:0.996
97.1 examples/sec

【参考运行结果】

### Adam, epoch=3
# train_loss:0.539, train_acc_top1:0.805, train_acc_top5:0.992, val_acc_top1:0.831, val_acc_top5:0.996
# 80.6 examples/sec
### Adam,epoch=10
# train_loss:0.369, train_acc_top1:0.852, train_acc_top5:0.996, val_acc_top1:0.860, val_acc_top5:0.998
# 96.1 examples/sec
### SGD,epoch=10
# train_loss:0.476, train_acc_top1:0.828, train_acc_top5:0.992, val_acc_top1:0.821, val_acc_top5:0.996
# 97.1 examples/sec