PaddlePaddle API学习笔记02 卷积

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,卷积计算会添加偏置项。

如果指定了激活函数类型,相应的激活函数会作用在最终结果上。

www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积

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,卷积计算会添加偏置项。

如果指定了激活函数类型,相应的激活函数会作用在最终结果上。

www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积

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)

解释:

www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积

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)
www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积


www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积

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)

解释:

www.zeeklog.com  - PaddlePaddle API学习笔记02 卷积