【深度学习】使用PaddlePaddle进行花卉分类训练和评估
这段代码主要实现了一个基于PaddlePaddle深度学习框架的卷积神经网络模型LeNet。首先,导入了所需的库和模块,包括PaddlePaddle、MNIST数据集、flowers数据集等。然后定义了一个LeNet类,该类继承自PaddlePaddle的Layer类,包含了卷积层、池化层和全连接层的定义。在forward方法中,实现了前向传播的过程。在main函数中,首先打印出PaddlePad
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. 解释
-
__init__(self): 这是LeNet类的构造函数,用于初始化网络的各个层。在这个函数中,我们定义了两个卷积层(conv1和conv2)、两个最大池化层(max_pool1和max_pool2)以及三个全连接层(linear1、linear2和linear3)。这些层都是通过PaddlePaddle库中的类创建的。 -
forward(self, x): 这是LeNet类的前向传播函数,用于计算输入数据x通过网络后得到的结果。在这个函数中,我们首先将输入数据x通过第一个卷积层conv1,然后应用ReLU激活函数,接着通过最大池化层max_pool1。这个过程会重复两次,以提取出更高层次的特征。接下来,我们将处理后的数据通过第二个卷积层conv2,再次应用ReLU激活函数,然后通过最大池化层max_pool2。最后,我们将处理后的数据展平,并通过三个全连接层linear1、linear2和linear3进行分类。 -
main(): 这是程序的主函数,用于执行以下操作:- 打印PaddlePaddle的版本信息。
- 定义一个图像预处理操作,即将图像数据归一化到[-1, 1]范围内。
- 下载并加载Flowers数据集,该数据集包含了多种花卉的图片。
- 创建一个LeNet模型实例,并使用Adam优化器和交叉熵损失函数进行编译。
- 使用训练数据集对模型进行训练,训练2个epoch,每个batch包含64个样本。
- 使用测试数据集评估模型的性能。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)