欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一文详细描述Paddle的Conv2d使用方法

程序员文章站 2022-03-05 13:18:53
最近在学习Paddle,使用过程中有了些许的理解,所以把这部分内容记录下来,分享给大家,如果有问题也可以留言一起探讨~进入正文部分,Paddle下Conv2d这个API的使用说明,首先来看一下Conv2d的声明部分:paddle.fluid.dygraph.Conv2D(num_channels, num_filters, filter_size, \stride=1, padding=0, dilation=1, groups=None, param_attr=None, \bias_att...

最近在学习Paddle,使用过程中有了些许的理解,所以把这部分内容记录下来,分享给大家,如果有问题也可以留言一起探讨~

进入正文部分,Paddle下Conv2d这个API的使用说明,首先来看一下Conv2d的声明部分:

paddle.fluid.dygraph.Conv2D(num_channels, num_filters, filter_size, \
stride=1, padding=0, dilation=1, groups=None, param_attr=None, \
bias_attr=None, use_cudnn=True, act=None, dtype='float32')

主要参数如下:

  • num_channels:输入的通道数,这个没什么好讲的;
  • num_filters:卷积核的数目,也就是输出的通道数,这里torch是out_channels,而TF则是filters,各不相同,各位同学使用的时候要注意下;
  • filter_size:卷积核的大小,可以是int或者是tuple,int就是卷积核长和宽一致,而tuple则是两个int组成,第一个表示卷积核的长,第二个表示卷积核的宽,这里,TF和torch保持了一致,都是kernel_size,不知道paddle为什么这样子设计;
  • stride:步长,卷积核的步长,和torch一样,TF是复数形式strides;
  • padding:填充大小,可以是int或是tuple,表示长宽各自的填充0的大小,这里和torch一样,TF则是'same','valid'等;而torch提供了多一个的padding_mode,支持'same','valid'等的填充方式,不愧是业界标杆~
  • dilation:空洞率,可以是int或是tuple,与torch一致,而TF则是dilation_rate,怎么就你不一样呢;
  • groups:卷积层组数,与torch一致,而TF没有这个参数,实现分组卷积;
  • param_attr:weight的参数对象,可以用来自定义weight的初始化;这里tf和torch都没有对应的参数,但是torch可以通过使用conv2d+自定义weight、bias的方式实现Conv2d;而tf则可以通过kernel_initializer来初始化weight;这里由于底层的不一致,上层使用上也是各不相同;
  • bias_attr:bias的参数对象,可以用来定义bias的初始化;与weight类似,不做过多的说明;
  • use_cudnn:要不要使用cudnn核.....
  • act:激活函数,torch没有支持act,毕竟直接在外面加一层就可以,还是很方便的;而tf则是叫activation,2020年了,真的不嫌全名写起来很长么...
  • dtype:数据类型,默认float32,tf和torch都没有对应的参数;一般用不太到的参数;

简单的做个总结,paddle的Conv2d支持的功能还是蛮全的,比如dilation和groups,但是,参数名字有些就怪怪的,比如num_filters,远远没有out_channels来的清晰直观;还有paddle自定义的数据类型param_attr,使用起来要费一些心思;

对比就是这么多,组网的时候,Paddle也可以通过继承Layer的方式,完成模型的构建,比如AlexNet,代码如下:

import paddle.fluid as fluid
from paddle.fluid.dygraph import Conv2d, Linear, Pool2D

class AlexNet(fluid.dygraph.Layer):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.conv1 = Conv2d(num_channels=3, num_filters=96, filter_size=11, stride=2, padding=2, act="relu")
        self.max_pool1 = Pool2D(pool_size=3, pool_type='max', pool_stride=2)
        self.conv2 = Conv2d(num_channels=96, num_filters=256, filter_size=5, stride=1, padding=2, act="relu")
        self.max_pool2 = Pool2D(pool_size=3, pool_type='max', pool_stride=2)  
        self.conv3 = Conv2d(num_channels=256, num_filters=384, filter_size=3, stride=1, padding=1, act="relu")
        self.conv4 = Conv2d(num_channels=384, num_filters=384, filter_size=3, stride=1, padding=1, act="relu")
        self.conv5 = Conv2d(num_channels=384, num_filters=256, filter_size=3, stride=1, padding=1, act="relu")
        self.max_pool5 = Pool2D(pool_size=3, pool_type='max', pool_stride=2)
        self.linear6 = Linear(input_dim=9216, output_dim=4096, act="relu")
        self.linear7 = Linear(input_dim=4096, output_dim=4096, act="relu")
        self.linear8 = Linear(input_dim=4096, output_dim=50)
        
    def forward(self, inputs, label=None):
        x = self.conv1(inputs)
        x = self.max_pool1(x)
        x = self.conv2(x)
        x = self.max_pool2(2)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = self.max_pool5(x)
        x = fluid.layers.reshape(x, [-1, 9216])
        x = self.linear6(x)
        x = self.linear7(x)
        x = self.linear8(x)
        return x

本文地址:https://blog.csdn.net/tanggebai0654/article/details/107641132

相关标签: 深度学习