Tendorflow中提供了对一维数据、二维数据、三维数据的卷积操作,分别是tf.nn.conv1d()、tf.nn.conv2d()、tf.nn.conv3d().
以tf.nn.conv2d()函数做操作说明:
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format = None, name=None)
input: 输入数据。这是一个4维张量,每一维的含义是:[batch的大小, 图片的高度, 图片的宽度,图片的通道数]。 第一个batch大小的意思是:我们做训练时,通常不会一个一个样本去训练,二是会好多个样本一块输入,目的是为了让学习过程不要抖动太剧烈,收敛方向更加一致。batch的大小通常会对收敛速度和最后效果有一定影响。第二个和第三个值表示图片的高和宽的像素值。第四个值表示图片的通道数。比如,输入的图片可能是RGB这个3颜色通道的,在经过多个卷积核之后,也会变成和卷积核个数对应的通道数。
filter:卷积核的参数。这也是一个4维张量,每一维的含义是:[卷积核的高,卷积核的宽,输入的通道数,输出的通道数]。前面两个值分别是两个卷积核的高和宽,第三个值表示进行卷积操作时输入的数据有多少个通道,第四个值是输出的通道数,相当于这一层的卷积运算有多少个卷积核。
strides:步长。这是一个长度为4 的向量。第一个值表示batch的大小,第二个值表示在卷积核进行移动时垂直方向上每次移动的距离,第三个值表示在卷积进行移动时水平方向上每次移动的距离,第四个值表示通道数。
padding:表示在进行卷积操作时,是否进行边缘填充。取值类型是字符串,可选取的值有SAME(补零)和VALID。
VALID模式下:输出结果的大小为:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1])) #strides[1]垂直方向上移动的步长
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2])) #strides[3水平方向上移动的步长
SAME模式下,输出结果的大小:
out_height = ceil(float(in_height) / float(strides[1])) #strides[1]垂直方向上移动的步长
out_width = ceil(float(in_width) / float(strides[2])) #strides[3水平方向上移动的步长
use_cudnn_on_gpu: bool类型,是否使用cuDNN加速,默认为true。
data_format: 字符串类型,可选值为“NHWC”和“NCHW”。默认值为“NHWC”,表示输入数据的格式是[batch,height,width,channels],其中字母N、H、W和C分别代表batch个数、height(高度)、width(宽度)和channels(通道个数)。
name:名字,操作的自定义名字,为字符串类型。
TensoerFlow的池化操作:
最大池化和平均池化,对应tensorflow中的函数是tf.nn.max_pool和tf.nn.avg_pool。
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
value:输入数据,和前面的卷积的输入数据的含义一样,是一个4维张量,每一维的值的含义是:[batch大小,图片高度,图片宽度,图片的通道数]。
ksize: 池化窗口的大小,是一个具有4个长度大小的向量[batch, height, width, channels],其中第一个值是batch的大小。第二个值是池化窗口的高度,第三个值是池化窗口的宽度,第四个值是图片的通道数。
strides: 步长。其含义和卷积操作的步长参数一样,
padding:填充参数,其含义和卷积操作的padding参数一样。
data_format: 输入数据的格式,它为字符串类型,可选的值有NHWC和NCHW,其含义和卷积函数中的data_format 一样。
name:操作的名字,为字符串类型。