使用paddle动态图搭建网络(入门)

前言

记录下如何用paddle2.0搭建一个网络,在动态图模式下用容易上手的高层api复现多种网络


使用paddle2.0动态图搭建网络(超简易)

环境

Aistudio项目 Notebook线上环境
paddle版本 : 2.0
使用动态图模式(默认)

参考

•多层感知机模型
•卷积网络
•学习目录
•以上均来自课程: https://aistudio.baidu.com/aistudio/course/introduce/11939?directly=1&shared=1

编写模型

①感知机模型

上代码,多层感知机模型构建的网络如下:

首先定义模型,在__init__里写层,在forward方法里写过程。但是前者与后者之间没有顺序可言,后者是网络的前向传播过程。然后用paddle.model进行模型的封装,model.prepare进行模型配置,model.fit进行模型训练。只要知道自己要做的是什么,之后比葫芦画瓢就行。

PS:在定义网络时要继承paddle.nn.Layer。然后具体网络实现的各种API可以在官方文档下查阅

# 定义感知机
"""
逻辑:①拍扁为28 x 28 = 784的features。
	 ②加一层隐藏层,设隐藏层单元数量为128个。
	 ③用激活函数σ\sigmaσ进行非线性转化,即relu一下
	 ④把经过隐藏层激活的输出值进行线性加权,从128维线性转化为10维,得到输出层
"""
class MLPModel(paddle.nn.Layer):
    def __init__(self):
        super(MLPModel, self).__init__()
        self.flatten=paddle.nn.Flatten()
        self.hidden=paddle.nn.Linear(in_features=784,out_features=128)
        self.output=paddle.nn.Linear(in_features=128,out_features=10)
        
    def forward(self, x):
        x=self.flatten(x)
        x=self.hidden(x) #经过隐藏层
        x=F.relu(x) #经过激活层
        x=self.output(x)
        return x
 
#封装模型
model=paddle.Model(MLPModel())
#配置模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())
#训练模型
model.fit(train_dataset,
          epochs=5,
          batch_size=64,
          verbose=1)

经过5轮epoch训练,分类准确率达到0.9827。测试集上的分类准确率达到0.9742.。
使用paddle动态图搭建网络(入门)_第1张图片

							官方文档一览

②卷积神经网络

“”“
逻辑:①定义第一层卷积
	 ②在卷积之后加上激活函数,然后池化提取最大化特征
	 ③重复过程,等到特征足够少时,flatten拍平
	 ④再用多层线性层,线性层后面记得跟relu激活函数
	 ⑤总结:卷积神经网络与前者相比能减少参数
”“”
#定义模型
class LeNetModel(paddle.nn.Layer):
    def __init__(self):
        super(LeNetModel, self).__init__()
        # 创建卷积和池化层块,每个卷积层后面接着2x2的池化层
        #卷积层L1
        self.conv1 = paddle.nn.Conv2D(in_channels=1,
                                      out_channels=6,
                                      kernel_size=5,
                                      stride=1)
        #池化层L2
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2,
                                         stride=2)
        #卷积层L3
        self.conv2 = paddle.nn.Conv2D(in_channels=6,
                                      out_channels=16,
                                      kernel_size=5,
                                      stride=1)
        #池化层L4
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2,
                                         stride=2)
        #线性层L5
        self.fc1=paddle.nn.Linear(256,120)
        #线性层L6
        self.fc2=paddle.nn.Linear(120,84)
        #线性层L7
        self.fc3=paddle.nn.Linear(84,10)

    #正向传播过程
    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.pool1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = paddle.flatten(x, start_axis=1,stop_axis=-1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        x = F.relu(x)
        out = self.fc3(x)
        return out

经过5个epoch世代迭代,LeNet5模型在CIFAR10图像分类任务上的准确度仅在60.25%左右。

总结&对比

通过高层api直观感受到网络结构。
本例中:感知机模型参数多,网络结构不够灵活,但在某些分类任务上acc高;卷积神经网络参数较前者少,但是在某些分类任务上表现一般。

你可能感兴趣的:(Paddle,python,paddlepaddle)