PaddlePaddle API学习笔记02 卷积
本文参考了PaddlePaddle官方文档,融合整理而成,官方文档地址:
卷积有两组输入:特征图和卷积核,依据输入特征和卷积核的形状、Layout不同、计算方式的不同。
在Fluid里,有针对变长序列特征的一维卷积,有针对定长图像特征的二维(2D Conv)、三维卷积(3D Conv),同时也有卷积计算的逆向过程。
下面先介绍Fluid里的2D/3D卷积,再来介绍序列卷积。
2D/3D卷积
卷积输入参数:
卷积运算需要依据
滑动步长(stride)、
填充长度(padding)、
卷积核窗口大小(filter size)、
分组数(groups)、
扩张系数(dilation rate)
来决定如何计算。
groups最早在 AlexNet 中引入, 可以理解为将原始的卷积分为独立若干组卷积计算。
注意: 同cuDNN的方式,Fluid目前只支持在特征图上下填充相同的长度,左右也是。
输入输出Layout:
2D卷积输入特征的Layout为[N, C, H, W]或[N, H, W, C], N即batch size,C是通道数,H、W是特征的高度和宽度,输出特征和输入特征的Layout一致。
(相应的3D卷积输入特征的Layout为[N, C, D, H, W]或[N, D, H, W, C],
但 注意,Fluid的卷积当前只支持[N, C, H, W],[N, C, D, H, W]。)
卷积核的Layout:
Fluid中2D卷积的卷积核(也称权重)的Layout为[C_o, C_in / groups, f_h, f_w]。
C_o、C_in表示输出、输入通道数,f_h、f_w表示卷积核窗口的高度和宽度,按行序存储。
(相应的3D卷积的卷积核Layout为[C_o, C_in / groups, f_d, f_h, d_w],同样按行序存储。)
深度可分离卷积(depthwise separable convolution):
在深度可分离卷积中包括depthwise convolution和pointwise convolution两组,这两个卷积的接口和上述普通卷积接口相同。
前者可以通过给普通卷积设置groups来做,后者通过设置卷积核filters的大小为1x1。
深度可分离卷积减少参数的同时减少了计算量。
对于depthwise convolution,可以设置groups等于输入通道数
此时,2D卷积的卷积核形状为[C_o, 1, f_h, f_w]。
对于pointwise convolution,卷积核的形状为[C_o, C_in, 1, 1]。
注意:Fluid针对depthwise convolution的GPU计算做了高度优化,您可以通过在 fluid.layers.conv2d 接口设置 use_cudnn=False 来使用Fluid自身优化的CUDA程序。
空洞卷积(dilated convolution):
空洞卷积相比普通卷积而言,卷积核在特征图上取值时不在连续,而是间隔的,这个间隔数称作dilation,等于1时,即为普通卷积,空洞卷积相比普通卷积的感受野更大。
1D序列卷积
Fluid可以表示变长的序列结构,这里的变长是指不同样本的时间步(step)数不一样,通常是一个2D的Tensor和一个能够区分的样本长度的辅助结构来表示。
假定,2D的Tensor的形状是shape,shape[0]是所有样本的总时间步数,shape[1]是序列特征的大小。
基于此数据结构的卷积在Fluid里称作序列卷积,也表示一维卷积。
同图像卷积,序列卷积的输入参数有卷积核大小、填充大小、滑动步长,但与2D卷积不同的是,这些参数个数都为1。注意,目前仅支持stride为1的情况,输出序列的时间步数和输入序列相同。
假如:输入序列形状为(T, N), T即该序列的时间步数,N是序列特征大小;卷积核的上下文步长为K,输出序列长度为M,则卷积核权重形状为(K * N, M),输出序列形状为(T, M)。
另外,参考DeepSpeech,Fluid实现了行卷积row convolution, 或称 look ahead convolution , 该卷积相比上述普通序列卷积可以减少参数。
conv2d
用法:
paddle.fluid.layers.conv2d(
input,
num_filters,
filter_size,
stride=1,
padding=0,
dilation=1,
groups=None,
param_attr=None,
bias_attr=None,
use_cudnn=True,
act=None,
name=None,
data_format="NCHW")
参数含义:
input (Variable) - 形状为 [N,C,H,W] 或 [N,H,W,C] 的4-D Tensor,N是批尺寸,
C是通道数,H是特征高度,W是特征宽度,数据类型为float16, float32或float64。
num_filters (int) - 滤波器(卷积核)的个数。和输出图像通道相同。
filter_size (int|list|tuple) - 滤波器大小。如果它是一个列表或元组,
则必须包含两个整数值:(filter_size_height,filter_size_width)。
若为一个整数,filter_size_height = filter_size_width = filter_size。
stride (int|list|tuple,可选) - 步长大小。滤波器和输入进行卷积计算时滑动的步长。
如果它是一个列表或元组,则必须包含两个整型数:(stride_height,stride_width)。
若为一个整数,stride_height = stride_width = stride。默认值:1。
padding (int|list|tuple|str,可选) - 填充大小。
如果它是一个字符串,可以是"VALID"或者"SAME",表示填充算法,
计算细节可参考上述 padding = "SAME"或 padding = "VALID" 时的计算公式。
如果它是一个元组或列表,它可以有3种格式:
(1)包含4个二元组:当 data_format 为"NCHW"时为 [[0,0], [0,0], [padding_height_top, padding_height_bottom], [padding_width_left, padding_width_right]],当 data_format 为"NHWC"时为[[0,0], [padding_height_top, padding_height_bottom], [padding_width_left, padding_width_right], [0,0]];
(2)包含4个整数值:[padding_height_top, padding_height_bottom, padding_width_left, padding_width_right];
(3)包含2个整数值:[padding_height, padding_width],此时padding_height_top = padding_height_bottom = padding_height, padding_width_left = padding_width_right = padding_width。若为一个整数,padding_height = padding_width = padding。默认值:0。
dilation (int|list|tuple,可选) - 膨胀比例大小。
空洞卷积时会使用该参数,滤波器对输入进行卷积时,感受野里每相邻两个特征点之间的空洞信息。
如果膨胀比例为列表或元组,则必须包含两个整型数:(dilation_height,dilation_width)。
若为一个整数,dilation_height = dilation_width = dilation。默认值:1。
groups (int,可选) - 二维卷积层的组数。
根据Alex Krizhevsky的深度卷积神经网络(CNN)论文中的成组卷积:
当group=n,输入和滤波器分别根据通道数量平均分为n组,第一组滤波器和第一组输入进行卷积计算,
第二组滤波器和第二组输入进行卷积计算,……,第n组滤波器和第n组输入进行卷积计算。默认值:1。
param_attr (ParamAttr,可选) - 指定权重参数属性的对象。默认值为None,
表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。
bias_attr (ParamAttr|bool,可选)- 指定偏置参数属性的对象。若 bias_attr 为bool类型,
只支持为False,表示没有偏置参数。默认值为None,表示使用默认的偏置参数属性。
具体用法请参见 ParamAttr 。
use_cudnn (bool,可选)- 是否使用cudnn内核。只有已安装cudnn库时才有效。默认值:True。
act (str,可选) - 激活函数类型, 如tanh、softmax、sigmoid,relu等,
支持列表请参考 激活函数 。
如果设为None,则未添加激活函数。默认值:None。
name (str,可选) – 具体用法请参见 cn_api_guide_Name ,一般无需设置,默认值:None。
data_format (str,可选) - 输入和输出的数据格式,可以是"NCHW"和"NHWC"。
N是批尺寸,C是通道数,H是特征高度,W是特征宽度。默认值:"NCHW"。
返回:4-D Tensor,数据类型与 input 一致。如果未指定激活层,则返回卷积计算的结果,
如果指定激活层,则返回卷积和激活计算之后的最终结果。
返回类型:Variable。
抛出异常:
ValueError - 如果 use_cudnn 不是bool值。
ValueError - 如果 data_format 既不是"NCHW"也不是"NHWC"。
ValueError - 如果 input 的通道数未被明确定义。
ValueError - 如果 padding 是字符串,既不是"SAME"也不是"VALID"。
ValueError - 如果 padding 含有4个二元组,与批尺寸对应维度的值不为0
或者与通道对应维度的值不为0。
代码示例:
import paddle.fluid as fluid
import numpy as np
data = fluid.layers.data(name='data', shape=[3, 32, 32], dtype='float32')
param_attr = fluid.ParamAttr(
name='conv2d.weight',
initializer=fluid.initializer.Xavier(uniform=False),
learning_rate=0.001)
res = fluid.layers.conv2d(
input=data,
num_filters=2,
filter_size=3,
act="relu",
param_attr=param_attr)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
x = np.random.rand(1, 3, 32, 32).astype("float32")
output = exe.run(feed={"data": x}, fetch_list=[res])
print(output)
解释:
该OP(conv2d)是二维卷积层(convolution2D layer)根据
输入、
滤波器、
步长(stride)、
填充(padding)、
膨胀比例(dilations)一组参数计算输出特征层大小。
输入和输出是NCHW或NHWC格式,其中N是批尺寸,C是通道数,H是特征高度,W是特征宽度。
滤波器是MCHW格式,M是输出图像通道数,C是输入图像通道数,H是滤波器高度,W是滤波器宽度。
如果组数(groups)大于1,C等于输入图像通道数除以组数的结果。详情请参考UFLDL’s : 卷积 。如果bias_attr不为False,卷积计算会添加偏置项。
如果指定了激活函数类型,相应的激活函数会作用在最终结果上。
conv3d
用法:
paddle.fluid.layers.conv3d(
input,
num_filters,
filter_size,
stride=1,
padding=0,
dilation=1,
groups=None,
param_attr=None,
bias_attr=None,
use_cudnn=True,
act=None,
name=None,
data_format="NCDHW")
参数含义:
input (Variable) - 形状为 [N,C,D,H,W] 或 [N,D,H,W,C] 的5-D Tensor,N是批尺寸,
C是通道数,D是特征深度,H是特征高度,W是特征宽度,数据类型为float16, float32或float64。
num_fliters (int) - 滤波器(卷积核)的个数。和输出图像通道相同。
filter_size (int|list|tuple) - 滤波器大小。如果它是一个列表或元组,则必须包含三个整数值:
(filter_size_depth, filter_size_height,filter_size_width)。
若为一个整数,
则filter_size_depth = filter_size_height = filter_size_width = filter_size。
stride (int|list|tuple,可选) - 步长大小。滤波器和输入进行卷积计算时滑动的步长。
如果它是一个列表或元组,则必须包含三个整型数:
(stride_depth, stride_height, stride_width)。
若为一个整数,stride_depth = stride_height = stride_width = stride。默认值:1。
padding (int|list|tuple|str,可选) - 填充大小。
如果它是一个字符串,可以是"VALID"或者"SAME",表示填充算法,
计算细节可参考上述 padding = "SAME"或 padding = "VALID" 时的计算公式。
如果它是一个元组或列表,它可以有3种格式:
(1)包含5个二元组:
当 data_format 为"NCDHW"时为 [[0,0], [0,0], [padding_depth_front, padding_depth_back],
[padding_height_top, padding_height_bottom], [padding_width_left,
padding_width_right]],
当 data_format 为"NDHWC"时为[[0,0], [padding_depth_front, padding_depth_back],
[padding_height_top, padding_height_bottom],
[padding_width_left, padding_width_right], [0,0]];
(2)包含6个整数值:[padding_depth_front, padding_depth_back, padding_height_top,
padding_height_bottom, padding_width_left, padding_width_right];
(3)包含3个整数值:[padding_depth, padding_height, padding_width],
此时 padding_depth_front = padding_depth_back = padding_depth,
padding_height_top = padding_height_bottom = padding_height,
padding_width_left = padding_width_right = padding_width。
若为一个整数,padding_depth = padding_height = padding_width = padding。默认值:0。
dilation (int|list|tuple,可选) - 膨胀比例大小。
空洞卷积时会使用该参数,滤波器对输入进行卷积时,感受野里每相邻两个特征点之间的空洞信息。
如果膨胀比例为列表或元组,则必须包含三个整型数:
(dilation_depth, dilation_height,dilation_width)。
若为一个整数,dilation_depth = dilation_height = dilation_width = dilation。默认值:1。
groups (int,可选) - 三维卷积层的组数。
根据Alex Krizhevsky的深度卷积神经网络(CNN)论文中的成组卷积:
当group=n,输入和滤波器分别根据通道数量平均分为n组,
第一组滤波器和第一组输入进行卷积计算,第二组滤波器和第二组输入进行卷积计算,
……,第n组滤波器和第n组输入进行卷积计算。默认值:1。
param_attr (ParamAttr,可选) - 指定权重参数属性的对象。
默认值为None,表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。
bias_attr (ParamAttr|bool,可选)- 指定偏置参数属性的对象。
若 bias_attr 为bool类型,只支持为False,表示没有偏置参数。
默认值为None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。
use_cudnn (bool,可选)- 是否使用cudnn内核。只有已安装cudnn库时才有效。默认值:True。
act (str,可选) - 激活函数类型, 如tanh、softmax、sigmoid,relu等,
支持列表请参考 激活函数 。
如果设为None,则未添加激活函数。默认值:None。
name (str,可选) – 具体用法请参见 cn_api_guide_Name ,一般无需设置,默认值:None。
data_format (str,可选) - 输入和输出的数据格式,可以是"NCDHW"和"NDHWC"。
N是批尺寸,C是通道数,D是特征深度,H是特征高度,W是特征宽度。默认值:"NCDHW"。
返回:5-D Tensor,数据类型与 input 一致。如果未指定激活层,则返回卷积计算的结果,
如果指定激活层,则返回卷积和激活计算之后的最终结果。
返回类型:Variable。
抛出异常:
ValueError - 如果 use_cudnn 不是bool值。
ValueError - 如果 data_format 既不是"NCDHW"也不是"NDHWC"。
ValueError - 如果 input 的通道数未被明确定义。
ValueError - 如果 padding 是字符串,既不是"SAME"也不是"VALID"。
ValueError - 如果 padding 含有5个二元组,与批尺寸对应维度的值不为0或者与通道对应维度的值不为0。
代码示例:
import paddle.fluid as fluid
import numpy as np
data = fluid.layers.data(name='data', shape=[3, 12, 32, 32], dtype='float32')
param_attr = fluid.ParamAttr(
name='conv3d.weight',
initializer=fluid.initializer.Xavier(uniform=False),
learning_rate=0.001)
res = fluid.layers.conv3d(
input=data,
num_filters=2,
filter_size=3,
act="relu",
param_attr=param_attr)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
x = np.random.rand(1, 3, 12, 32, 32).astype("float32")
output = exe.run(feed={"data": x}, fetch_list=[res])
print(output)
解释:
该OP(conv3d)是三维卷积层(convolution3D layer)。
根据输入、滤波器、步长(stride)、填充(padding)、膨胀比例(dilations)一组参数计算得到输出特征层大小。
输入和输出是NCDHW或NDWHC格式,其中N是批尺寸,C是通道数,D是特征层深度,H是特征层高度,W是特征层宽度。
三维卷积(Convlution3D)和二维卷积(Convlution2D)相似,但多了一维深度信息(depth)。
如果bias_attr不为False,卷积计算会添加偏置项。
如果指定了激活函数类型,相应的激活函数会作用在最终结果上。
conv2d_transpose
用法:
paddle.fluid.layers.conv2d_transpose(
input,
num_filters,
output_size=None,
filter_size=None,
padding=0,
stride=1,
dilation=1,
groups=None,
param_attr=None,
bias_attr=None,
use_cudnn=True,
act=None,
name=None,
data_format='NCHW')
参数含义:
input (Variable)- 形状为 [N,C,H,W] 或 [N,H,W,C] 的4-D Tensor,N是批尺寸,C是通道数,
H是特征高度,W是特征宽度。数据类型:float32或float64。
num_filters (int) - 滤波器(卷积核)的个数,与输出图片的通道数相同。
output_size (int|tuple,可选) - 输出图片的大小。
如果output_size是一个元组,则必须包含两个整型数,
(output_size_height,output_size_width)。
如果output_size=None,则内部会使用filter_size、padding和stride来计算output_size。
如果output_size和filter_size是同时指定的,那么它们应满足上面的公式。
默认:None。output_size和filter_size不能同时为None。
filter_size (int|tuple,可选) - 滤波器大小。
如果filter_size是一个元组,则必须包含两个整型数,
(filter_size_height, filter_size_width)。
否则,filter_size_height = filter_size_width = filter_size。
如果filter_size=None,则必须指定output_size, conv2d_transpose
内部会根据output_size、padding和stride计算出滤波器大小。
默认:None。output_size和filter_size不能同时为None。
padding (int|list|tuple|str,可选) - 填充padding大小。
padding参数在输入特征层每边添加 dilation * (kernel_size - 1) - padding 个0。
如果它是一个字符串,可以是"VALID"或者"SAME",表示填充算法,
计算细节可参考上述 padding = "SAME"或 padding = "VALID" 时的计算公式。
如果它是一个元组或列表,它可以有3种格式:
(1)包含4个二元组:
当 data_format 为"NCHW"时为 [[0,0], [0,0],
[padding_height_top, padding_height_bottom],
[padding_width_left, padding_width_right]],
当 data_format 为"NHWC"时为[[0,0],
[padding_height_top, padding_height_bottom],
[padding_width_left, padding_width_right], [0,0]];
(2)包含4个整数值:[padding_height_top, padding_height_bottom,
padding_width_left, padding_width_right];
(3)包含2个整数值:[padding_height, padding_width],
此时padding_height_top = padding_height_bottom = padding_height,
padding_width_left = padding_width_right = padding_width。
若为一个整数,padding_height = padding_width = padding。默认值:0。
stride (int|tuple,可选) - 步长stride大小。
滤波器和输入进行卷积计算时滑动的步长。
如果stride是一个元组,则必须包含两个整型数,形式为(stride_height,stride_width)。
否则,stride_height = stride_width = stride。默认:stride = 1。
dilation (int|tuple,可选) - 膨胀比例(dilation)大小。
空洞卷积时会指该参数,滤波器对输入进行卷积时,感受野里每相邻两个特征点之间的空洞信息,
根据 可视化效果图 较好理解。
如果膨胀比例dilation是一个元组,那么元组必须包含两个整型数,
形式为(dilation_height, dilation_width)。
否则,dilation_height = dilation_width = dilation。默认:dilation= 1。
groups (int,可选) - 二维转置卷积层的组数。
从Alex Krizhevsky的CNN Deep论文中的群卷积中受到启发,
当group=2时,输入和滤波器分别根据通道数量平均分为两组,
第一组滤波器和第一组输入进行卷积计算,
第二组滤波器和第二组输入进行卷积计算。默认:group = 1。
param_attr (ParamAttr,可选) :指定权重参数属性的对象。默认值为None,
表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。
conv2d_transpose算子默认的权重初始化是Xavier。
bias_attr (ParamAttr|False,可选)- 指定偏置参数属性的对象。
默认值为None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。
conv2d_transpose算子默认的偏置初始化是0.0。
use_cudnn (bool,可选) - 是否使用cudnn内核,只有已安装cudnn库时才有效。默认:True。
act (str,可选) - 激活函数类型,如果设置为None,则不使用激活函数。默认:None。
name (str,可选) – 具体用法请参见 cn_api_guide_Name ,一般无需设置,默认值为None。
data_format (str,可选) - 输入和输出的数据格式,可以是"NCHW"和"NHWC"。
N是批尺寸,C是通道数,H是特征高度,W是特征宽度。默认值:"NCHW"。
返回:4-D Tensor,数据类型与 input 一致。如果未指定激活层,则返回转置卷积计算的结果,
如果指定激活层,则返回转置卷积和激活计算之后的最终结果。
返回类型:Variable
抛出异常:
ValueError : 如果输入的shape、filter_size、stride、padding和groups不匹配,抛出ValueError
ValueError - 如果 data_format 既不是"NCHW"也不是"NHWC"。
ValueError - 如果 padding 是字符串,既不是"SAME"也不是"VALID"。
ValueError - 如果 padding 含有4个二元组,与批尺寸对应维度的值不为0或者与通道对应维度的值不为0。
代码示例:
import paddle.fluid as fluid
import numpy as np
data = fluid.layers.data(
name='data',
shape=[3, 32, 32],
dtype='float32')
param_attr = fluid.ParamAttr(
name='conv2d.weight',
initializer=fluid.initializer.Xavier(uniform=False),
learning_rate=0.001)
res = fluid.layers.conv2d_transpose(
input=data,
output_size=66,
num_filters=2,
filter_size=3,
act="relu",
param_attr=param_attr)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
x = np.random.rand(1, 3, 32, 32).astype("float32")
output = exe.run(feed={"data": x}, fetch_list=[res])
print(output)
解释:
conv3d_transpose
用法:
paddle.fluid.layers.conv3d_transpose(
input,
num_filters,
output_size=None,
filter_size=None,
padding=0,
stride=1,
dilation=1,
groups=None,
param_attr=None,
bias_attr=None,
use_cudnn=True,
act=None,
name=None,
data_format='NCDHW')
参数:
input (Variable)- 形状为 [N,C,D,H,W] 或 [N,D,H,W,C] 的5-D Tensor,
N是批尺寸,C是通道数,D是特征深度,H是特征高度,W是特征宽度,数据类型:float32或float64。
num_filters (int) - 滤波器(卷积核)的个数,与输出的图片的通道数相同。
output_size (int|tuple,可选) - 输出图片的大小。
如果output_size是一个元组,则必须包含三个整型数,
(output_size_depth,output_size_height,output_size_width)。
如果output_size=None,则内部会使用filter_size、padding和stride来计算output_size。
如果output_size和filter_size是同时指定的,那么它们应满足上面的公式。
默认:None。output_size和filter_size不能同时为None。
filter_size (int|tuple,可选) - 滤波器大小。
如果filter_size是一个元组,则必须包含三个整型数,
(filter_size_depth,filter_size_height, filter_size_width)。
否则,filter_size_depth = filter_size_height = filter_size_width = filter_size。
如果filter_size=None,则必须指定output_size,
conv2d_transpose 内部会根据output_size、padding和stride计算出滤波器大小。
默认:None。output_size和filter_size不能同时为None。
padding (int|list|tuple|str,可选) - 填充padding大小。
padding参数在输入特征层每边添加 dilation * (kernel_size - 1) - padding 个0。
如果它是一个字符串,可以是"VALID"或者"SAME",表示填充算法,
计算细节可参考上述 padding = "SAME"或 padding = "VALID" 时的计算公式。
如果它是一个元组或列表,它可以有3种格式:
(1)包含5个二元组:当 data_format 为"NCDHW"时为 [[0,0], [0,0],
[pad_depth_front, pad_depth_back], [pad_height_top, pad_height_bottom],
[pad_width_left, pad_width_right]],当 data_format 为"NDHWC"时为[[0,0],
[pad_depth_front, pad_depth_back], [pad_height_top, pad_height_bottom],
[pad_width_left, pad_width_right], [0,0]];
(2)包含6个整数值:[pad_depth_front, pad_depth_back, pad_height_top,
pad_height_bottom, pad_width_left, pad_width_right];
(3)包含3个整数值:[pad_depth, pad_height, pad_width],
此时 pad_depth_front = pad_depth_back = pad_depth,
pad_height_top = pad_height_bottom = pad_height,
pad_width_left = pad_width_right = pad_width。
若为一个整数,pad_depth = pad_height = pad_width = padding。默认值:0。
stride (int|tuple,可选) - 步长stride大小。滤波器和输入进行卷积计算时滑动的步长。
如果stride是一个元组,那么元组的形式为(stride_depth,stride_height,stride_width)。
否则,stride_depth = stride_height = stride_width = stride。默认:stride = 1。
dilation (int|tuple,可选) - 膨胀比例dilation大小。
空洞卷积时会指该参数,滤波器对输入进行卷积时,感受野里每相邻两个特征点之间的空洞信息,
根据 可视化效果图 较好理解。如果膨胀比例dilation是一个元组,
那么元组的形式为(dilation_depth,dilation_height, dilation_width)。
否则,dilation_depth = dilation_height = dilation_width = dilation。默认:dilation= 1。
groups (int,可选) - 三维转置卷积层的组数。
从Alex Krizhevsky的CNN Deep论文中的群卷积中受到启发,
当group=2时,输入和滤波器分别根据通道数量平均分为两组,
第一组滤波器和第一组输入进行卷积计算,
第二组滤波器和第二组输入进行卷积计算。默认:group = 1。
param_attr (ParamAttr,可选) :指定权重参数属性的对象。
默认值为None,表示使用默认的权重参数属性。
具体用法请参见 ParamAttr 。conv3d_transpose算子默认的权重初始化是Xavier。
bias_attr (ParamAttr|False,可选)- 指定偏置参数属性的对象。
默认值为None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。
conv3d_transpose算子默认的偏置初始化是0.0。
use_cudnn (bool,可选) - 是否使用cudnn内核,只有已安装cudnn库时才有效。默认:True。
act (str,可选) - 激活函数类型,如果设置为None,则不使用激活函数。默认:None。
name (str,可选) – 具体用法请参见 cn_api_guide_Name ,一般无需设置,默认值为None。
data_format (str,可选) - 输入和输出的数据格式,可以是"NCDHW"和"NDHWC"。
N是批尺寸,C是通道数,H是特征高度,W是特征宽度。默认值:"NCDHW"。
返回:5-D Tensor,数据类型与 input 一致。如果未指定激活层,则返回转置卷积计算的结果,
如果指定激活层,则返回转置卷积和激活计算之后的最终结果。
返回类型:Variable
抛出异常:
ValueError : 如果输入的shape、filter_size、stride、padding和groups不匹配,抛出ValueError
ValueError - 如果 data_format 既不是"NCHW"也不是"NHWC"。
ValueError - 如果 padding 是字符串,既不是"SAME"也不是"VALID"。
ValueError - 如果 padding 含有5个二元组,与批尺寸对应维度的值不为0或者与通道对应维度的值不为0。
代码示例:
import paddle.fluid as fluid
import numpy as np
data = fluid.layers.data(
name='data',
shape=[3, 12, 32, 32],
dtype='float32')
param_attr = fluid.ParamAttr(
name='conv3d.weight',
initializer=fluid.initializer.Xavier(uniform=False),
learning_rate=0.001)
res = fluid.layers.conv3d_transpose(
input=data,
output_size=(14, 66, 66),
num_filters=2,
filter_size=3,
act="relu",
param_attr=param_attr)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
x = np.random.rand(1, 3, 12, 32, 32).astype("float32")
output = exe.run(feed={"data": x}, fetch_list=[res])
print(output)
sequence_conv
用法:
paddle.fluid.layers.sequence_conv(
input,
num_filters,
filter_size=3,
filter_stride=1,
padding=True,
padding_start=None,
bias_attr=None,
param_attr=None,
act=None,
name=None)
参数:
input (Variable) - 维度为 (M,K) 的二维LoDTensor,仅支持lod_level为1。
其中M是mini-batch的总时间步数,K是输入的 hidden_size 特征维度。
数据类型为float32或float64。
num_filters (int) - 滤波器的数量。
filter_size (int) - 滤波器的高度(H);不支持指定滤波器宽度(W),
宽度固定取值为输入的 hidden_size 。默认值为3。
filter_stride (int) - 滤波器每次移动的步长。目前只支持取值为1,默认为1。
padding (bool) - 此参数不起任何作用,将在未来的版本中被移除。
无论 padding 取值为False或者True,默认地,
该函数会自适应地在每个输入序列的两端等长地填充全0数据,以确保卷积后的输出序列长度和输入长度一致。
默认填充是考虑到输入的序列长度可能会小于卷积核大小,这会导致无正确计算卷积输出。
填充为0的数据在训练过程中不会被更新。默认为True。
padding_start (int) - 表示对输入序列填充时的起始位置,可以为负值。
负值表示在每个序列的首端填充 |padding_start| 个时间步(time_step)的全0数据;
正值表示对每个序列跳过前 padding_start 个时间步的数据。
同时在末端填充 filter_size+padding_start−1 个时间步的全0数据,
以保证卷积输出序列长度和输入长度一致。
如果 padding_start 为None,则在每个序列的两端填充 filter_size2 个时间步的全0数据;
如果 padding_start 设置为0,则只在序列的末端填充 filter_size−1 个时间步的全0数据。默认为None。
bias_attr (ParamAttr) - 指定偏置参数属性的对象。
默认值为None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。
param_attr (ParamAttr) - 指定权重参数属性的对象。
默认值为None,表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。
act (str) – 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,
支持列表请参考 激活函数 ,默认值为None。
name (str,可选) – 具体用法请参见 Name ,一般无需设置,默认值为None。
返回:和输入序列等长的LoDTensor,数据类型和输入一致,为float32或float64。
返回类型:Variable
代码示例:
import paddle.fluid as fluid
x = fluid.layers.data(
name='x',
shape=[10,10],
append_batch_size=False,
dtype='float32')
x_conved = fluid.layers.sequence_conv(x,2)
解释:
注意:该OP的输入只能是LoDTensor,如果您需要处理的输入是Tensor类型,请使用conv2d函数(fluid.layers. conv2d )。
该OP在给定的卷积参数下(如卷积核数目、卷积核大小等),对输入的变长序列(sequence)LoDTensor进行卷积操作。
默认情况下,该OP会自适应地在每个输入序列的两端等长地填充全0数据,以确保卷积后的序列输出长度和输入长度一致。
支持通过配置 padding_start 参数来指定序列填充的行为。
提示: 参数 padding 为无用参数,将在未来的版本中被移除。
这里详细介绍数据填充操作的细节:
对于一个min-batch为2的变长序列输入,分别包含3个、1个时间步(time_step),
假设输入input是一个[4, N]的float类型LoDTensor,为了方便,这里假设N = 2
input.data = [[1, 1],
[2, 2],
[3, 3],
[4, 4]]
input.lod = [[0, 3, 4]]
即输入input总共有4个词,每个词被表示为一个2维向量。
Case1:
若 padding_start = -1,filter_size = 3,
则两端填充数据的长度分别为:
up_pad_len = max(0, -padding_start) = 1
down_pad_len = max(0, filter_size + padding_start - 1) = 1
则以此填充后的输入数据为:
data_aftet_padding = [[0, 0, 1, 1, 2, 2],
[1, 1, 2, 2, 3, 3],
[2, 2, 3, 3, 0, 0],
[0, 0, 4, 4, 0, 0]]
它将和卷积核矩阵相乘得到最终的输出,假设num_filters = 3:
output.data = [[ 0.3234, -0.2334, 0.7433],
[ 0.5646, 0.9464, -0.1223],
[-0.1343, 0.5653, 0.4555],
[ 0.9954, -0.1234, -0.1234]]
output.shape = [4, 3] # 3 = num_filters
output.lod = [[0, 3, 4]] # 保持不变
row_conv
用法:
paddle.fluid.layers.row_conv(input, future_context_size, param_attr=None, act=None)
该接口为行卷积(Row-convolution operator)或称之为超前卷积(lookahead convolution),最早介绍于DeepSpeech2论文中,论文链接:
http://www.cs.cmu.edu/~dyogatam/papers/wang+etal.iclrworkshop2016.pdf
参数含义:
input (Variable) -- 支持输入为LodTensor和Tensor,输入类型可以是[float32, float64],
它支持可变时间长度的输入序列。当输入input为LodTensor时,
其内部张量是一个具有形状(T x N)的矩阵,其中T是这个mini batch中的总的timestep,N是输入数据维数。
当输入input为Tensor时,其形状为(B x T x N)的三维矩阵,B为mini batch大小,
T为每个batch输入中的最大timestep,N是输入数据维数。
当输入input为LoDTensor,形状为[9, N],LoD信息为[2, 3, 4],
等价于输入input为形状是[3, 4, N]的Tensor。
future_context_size (int) -- 下文大小。
请注意,卷积核的shape是[future_context_size + 1, N],N和输入input的数据维度N保持一致。
param_attr (ParamAttr) -- 参数的属性,包括名称、初始化器等。
act (str) -- 非线性激活函数。
返回:表示row_conv计算结果的Variable,数据类型、维度和输入input相同。
代码示例
import paddle.fluid as fluid
# LoDTensor input
x = fluid.layers.data(name='x', shape=[9, 16],
dtype='float32', lod_level=3,
append_batch_size=False)
out = fluid.layers.row_conv(input=x, future_context_size=2)
# Tensor input
x = fluid.layers.data(name='x', shape=[9, 4, 16],
dtype='float32',
append_batch_size=False)
out = fluid.layers.row_conv(input=x, future_context_size=2)
解释: