Paddle内置的网络模型

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paddle内置的网络模型相关的知识,希望对你有一定的参考价值。

简 介: 本文根据文档 模型组网 中给出的信息,总结了在Paddle建立常见到的网络的三种方法。

关键词 paddlenet内置网络

内置模型
文章目录
nn简介
Sequential组网
SubClass组网
飞桨内置函数
模型总结

 

§01 置模型


1.1 nn简介

  飞桨框架2.0中,组网相关的API都在paddle.nn目录下,你可以通过 SequentialSubClass 的方式构建具体的模型。组网相关的API类别与具体的API列表如下表:

功能API名称
ConvConv1D、Conv2D、Conv3D、Conv1DTranspose、Conv2DTranspose、Conv3DTranspose
PoolAdaptiveAvgPool1D、AdaptiveAvgPool2D、AdaptiveAvgPool3D、 AdaptiveMaxPool1D、AdaptiveMaxPool2D、AdaptiveMaxPool3D、 AvgPool1D、AvgPool2D、AvgPool3D、MaxPool1D、MaxPool2D、MaxPool3D
PaddingPad1D、Pad2D、Pad3D
ActivationELU、GELU、Hardshrink、Hardtanh、HSigmoid、LeakyReLU、LogSigmoid、 LogSoftmax、PReLU、ReLU、ReLU6、SELU、Sigmoid、Softmax、Softplus、 Softshrink、Softsign、Tanh、Tanhshrink
NormlizationBatchNorm、BatchNorm1D、BatchNorm2D、BatchNorm3D、GroupNorm、 InstanceNorm1D、InstanceNorm2D、InstanceNorm3D、LayerNorm、SpectralNorm、 SyncBatchNorm
Recurrent NNBiRNN、GRU、GRUCell、LSTM、LSTMCell、RNN、RNNCellBase、SimpleRNN、 SimpleRNNCell
TransformerTransformer、TransformerDecoder、TransformerDecoderLayer、 TransformerEncoder、TransformerEncoderLayer
DropoutAlphaDropout、Dropout、Dropout2d、Dropout3d
LossBCELoss、BCEWithLogitsLoss、CrossEntropyLoss、CTCLoss、KLDivLoss、L1Loss MarginRankingLoss、MSELoss、NLLLoss、SmoothL1Loss

1.2 Sequential组网

  针对顺序的线性网络结构你可以直接使用Sequential来快速完成组网,可以减少类的定义等代码编写。具体代码如下:

import paddle
# Sequential形式组网
mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

1.3 SubClass组网

  针对一些比较复杂的网络结构,就可以使用Layer子类定义的方式来进行模型代码编写,在__init__构造函数中进行组网Layer的声明,在forward中使用声明的Layer变量进行前向计算。子类组网方式也可以实现sublayer的复用,针对相同的layer可以在构造函数中一次性定义,在forward中多次调用。

# Layer类继承方式组网
class Mnist(paddle.nn.Layer):
    def __init__(self):
        super(Mnist, self).__init__()

        self.flatten = paddle.nn.Flatten()
        self.linear_1 = paddle.nn.Linear(784, 512)
        self.linear_2 = paddle.nn.Linear(512, 10)
        self.relu = paddle.nn.ReLU()
        self.dropout = paddle.nn.Dropout(0.2)

    def forward(self, inputs):
        y = self.flatten(inputs)
        y = self.linear_1(y)
        y = self.relu(y)
        y = self.dropout(y)
        y = self.linear_2(y)

        return y

mnist_2 = Mnist()

1.4 飞桨内置函数

  你除了可以通过上述方式组建模型外,还可以使用飞桨框架内置的模型,路径为 paddle.vision.models

1.4.1 列出所有内置函数

  具体列表如下:

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *

import paddle

print("Inner Model of Paddle:", paddle.vision.models.__all__)
Inner Model of Paddle: ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152', 'VGG', 'vgg11', 'vgg13', 'vgg16', 'vgg19', 'MobileNetV1', 'mobilenet_v1', 'MobileNetV2', 'mobilenet_v2', 'LeNet']

ResNet resnet18
resnet34 resnet50
resnet101 resnet152
VGG vgg11
vgg13 vgg16
vgg19 MobileNetV1
mobilenet_v1 MobileNetV2
mobilenet_v2 LeNet

from headm import *

strid = 8
strall = tspgetdopstring(strid)
strall = strall.replace(':', '')
strall = strall.replace('\\'', '').replace(']','').replace('[','').replace(':','').split(',')

maxlen = max(len(s.strip(' ')) for s in strall)
strall = [s.strip(' ')+' '*(maxlen - len(s)) for s in strall]

for s in list(zip(*([iter(strall)]*2))):
    printff(*s)

1.4.2 显示网络结构

(1)LeNet

lenet = paddle.vision.models.LeNet()
paddle.summary(lenet, (64,1,28,28))
---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================
   Conv2D-1      [[64, 1, 28, 28]]     [64, 6, 28, 28]          60       
    ReLU-1       [[64, 6, 28, 28]]     [64, 6, 28, 28]           0       
  MaxPool2D-1    [[64, 6, 28, 28]]     [64, 6, 14, 14]           0       
   Conv2D-2      [[64, 6, 14, 14]]     [64, 16, 10, 10]        2,416     
    ReLU-2       [[64, 16, 10, 10]]    [64, 16, 10, 10]          0       
  MaxPool2D-2    [[64, 16, 10, 10]]     [64, 16, 5, 5]           0       
   Linear-1         [[64, 400]]           [64, 120]           48,120     
   Linear-2         [[64, 120]]            [64, 84]           10,164     
   Linear-3          [[64, 84]]            [64, 10]             850      
===========================================================================
Total params: 61,610
Trainable params: 61,610
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 7.03
Params size (MB): 0.24
Estimated Total Size (MB): 7.46
---------------------------------------------------------------------------

'total_params': 61610, 'trainable_params': 61610

  通过测试,初步使用 summary显示网络结构,只有LeNet是可以,其它的网络都不可以。

 

型总结 ※


  文根据文档 模型组网 中给出的信息,总结了在Paddle建立常见到的网络的三种方法。


■ 相关文献链接:

以上是关于Paddle内置的网络模型的主要内容,如果未能解决你的问题,请参考以下文章

森说AI:用paddle2.x完成resnet50模型转写并实现前向对齐

森说AI:用paddle2.x完成resnet50模型转写并实现前向对齐

模型压缩75%,推理速度提升20%,Paddle Lite v2.3发布

paddle学习图像分类

Paddle关于[paddle.load]文档超链接显示问题的PR日志

Paddle 点灯人 之 10分钟快速上手Paddle