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

最近在学习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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值