1. 代码

import paddle
from paddle.vision.transforms import Compose, Normalize
from paddle.vision.datasets import flowers
import matplotlib.pyplot as plt
import paddle.nn.functional as F
import paddle.nn.layer as layer
import paddle.nn as n
from paddle.metric import Accuracy
import paddle.optimizer


class LeNet(layer.Layer):
    def __init__(self):
        super().__init__()
        self.conv1 = n.Conv2D(in_channels=1, out_channels=6,
                              kernel_size=5, stride=1, padding=2)
        self.max_pool1 = n.MaxPool2D(kernel_size=2, stride=2)
        self.conv2 = n.Conv2D(
            in_channels=6, out_channels=16, kernel_size=5, stride=1)
        self.max_pool2 = n.MaxPool2D(kernel_size=2, stride=2)
        self.linear1 = n.Linear(in_features=16*5*5, out_features=120)
        self.linear2 = n.Linear(in_features=120, out_features=84)
        self.linear3 = n.Linear(in_features=84, out_features=10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.max_pool1(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = self.max_pool2(x)
        x = paddle.flatten(x, start_axis=1, stop_axis=-1)
        x = self.linear1(x)
        x = F.relu(x)
        x = self.linear2(x)
        x = F.relu(x)
        x = self.linear3(x)
        return x


def main():
    print(paddle.__version__)
    transform = Compose([Normalize(mean=[127.5],
                                   std=[127.5],
                                   data_format='CHW')])

    print('Downloading datasets')
    train_dataset = flowers.Flowers(mode='train', transform=transform)
    test_dataset = flowers.Flowers(mode='test', transform=transform)
    print('load finish')
    train_data0, train_label0 = train_dataset[0][0], train_dataset[0][1]
    train_data0 = train_data0.reshape([28, 28])
    plt.figure(figsize=(2, 2))
    plt.imshow(train_data0, cmap=plt.cm.binary)
    print('train_data0 label is ' + str(train_label0))
    model = paddle.Model(LeNet())
    optim = paddle.optimizer.Adam(
        learning_rate=0.001, parameters=model.parameters())
    model.prepare(
        optim,
        n.CrossEntropyLoss(),
        Accuracy()
    )
    model.fit(train_dataset,
              epochs=2,
              batch_size=64,
              verbose=1)

    model.evaluate(test_dataset, batch_size=64, verbose=1)
    input()


if (__name__ == "__main__"):
    main()

2. 总结

这段代码主要实现了一个基于PaddlePaddle深度学习框架的卷积神经网络模型LeNet。首先,导入了所需的库和模块,包括PaddlePaddle、MNIST数据集、flowers数据集等。然后定义了一个LeNet类,该类继承自PaddlePaddle的Layer类,包含了卷积层、池化层和全连接层的定义。在forward方法中,实现了前向传播的过程。 在main函数中,首先打印出PaddlePaddle的版本信息。然后定义了数据预处理操作,对输入数据进行归一化处理。接着下载并加载了flowers数据集,并对训练集和测试集进行了可视化展示。之后创建了一个LeNet模型实例,并设置了优化器、损失函数和评估指标。最后,使用fit方法对模型进行训练,并在训练完成后使用evaluate方法对模型在测试集上的性能进行评估。

3. 解释

  1. __init__(self): 这是LeNet类的构造函数,用于初始化网络的各个层。在这个函数中,我们定义了两个卷积层(conv1和conv2)、两个最大池化层(max_pool1和max_pool2)以及三个全连接层(linear1、linear2和linear3)。这些层都是通过PaddlePaddle库中的类创建的。

  2. forward(self, x): 这是LeNet类的前向传播函数,用于计算输入数据x通过网络后得到的结果。在这个函数中,我们首先将输入数据x通过第一个卷积层conv1,然后应用ReLU激活函数,接着通过最大池化层max_pool1。这个过程会重复两次,以提取出更高层次的特征。接下来,我们将处理后的数据通过第二个卷积层conv2,再次应用ReLU激活函数,然后通过最大池化层max_pool2。最后,我们将处理后的数据展平,并通过三个全连接层linear1、linear2和linear3进行分类。

  3. main(): 这是程序的主函数,用于执行以下操作:

    • 打印PaddlePaddle的版本信息。
    • 定义一个图像预处理操作,即将图像数据归一化到[-1, 1]范围内。
    • 下载并加载Flowers数据集,该数据集包含了多种花卉的图片。
    • 创建一个LeNet模型实例,并使用Adam优化器和交叉熵损失函数进行编译。
    • 使用训练数据集对模型进行训练,训练2个epoch,每个batch包含64个样本。
    • 使用测试数据集评估模型的性能。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐