#@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
可视化模型结构
# 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 ---------------------------------------------------------------------------
{'total_params': 61706, 'trainable_params': 61706}
# 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)
设置训练参数
# 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)))
开始训练
# 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