前言
记录下如何用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.。
官方文档一览
②卷积神经网络
“”“
逻辑:①定义第一层卷积
②在卷积之后加上激活函数,然后池化提取最大化特征
③重复过程,等到特征足够少时,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高;卷积神经网络参数较前者少,但是在某些分类任务上表现一般。