卷积核,步福,填充,多通道卷积,激活函数,卷积函数。
主要函数使用:
1.conv2d函数
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
对一个四维的输入数据和四维的卷积核进行操作,然后对输入数据进行一个二维的卷积操作,最后得到卷积之后的结果。
主要参数说明:
·input:需要做卷积的输入图像数据,是一个张量,要求具有[batch,in_height,in_width,in_channels]的shape,数据类型必须是float32或者float64。batch表示运算时一个batch的张量数量,in_height和in_width为图像高度和宽度,in_channels标识图像通道数。
·filter:过滤器,也称卷积核(kernel),是一个张量,要求具有[filter_height,filter_width,in_channels,out_channels]的shape,数据类型必须是与input输入的数据类型相同。
·strides:一个长度是4的一维整数类型数组[image_batch_size_stride,image_height_stride,image_width_stride,image_channels_stride],每一维度对应的是input中每一维的对应移动步数。
·padding:定义当过滤器落在边界外时,如何做边界填充,值为字符串,取值为SAME或者VALID;SAME表示卷积核可以从图像的边缘开始处理。
·use_cudnn_on_gpu:一个可选布尔值,默认情况下是True。
·name:为操作取一个名字,结果返回一个Tensor,这个输出就是feature map。
2.tf.layers.conv2d
tf.layers.conv2d(inputs,filters,kernel_size,strides=(1, 1),padding=‘valid’,
data_format=‘channels_last’,dilation_rate=(1, 1),activation=None,use_bias=True,
kernel_initializer=None,bias_initializer=tf.zeros_initializer(),kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,trainable=True,name=None,reuse=None)
layers模块是TensorFlow1.5之后用于深度学习的更高层次封装的API,利用它我们可以轻松地构建模型。主要参数说明:
·inputs:必需,即需要进行操作的输入数据。
·filters:必需,是一个数字,代表了输出通道的个数,即output_channels。
·kernel_size:必需,卷积核大小,必须是一个数字(高和宽都是此数字)或者长度为2的列表(分别代表高、宽)。
·strides:可选,默认为(1,1),卷积步长,必须是一个数字(高和宽都是此数字)或者长度为2的列表(分别代表高、宽)。
·padding:可选,默认为valid,padding的模式有valid和same两种,大小写不区分。
·activation:可选,默认为None,如果为None则是线性激活。
·activity_regularizer:可选,默认为None,施加在输出上的正则项。
·name:可选,默认为None,卷积层的名称。
·reuse:可选,默认为None,布尔类型,如果为True,那么name相同时,会重复利用。
·返回值:卷积后的Tensor。
在TensorFlow中,最大池化使用tf.nn.max_pool,平均池化使用tf.nn.avg_pool。实际应用中,最大池化比其他池化方法更常用。它们的具体格式如下:
tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
·value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch,height,width,channels]这样的shape。
·ksize:池化窗口的大小,取一个四维向量,一般是[1,height,width,1],因为不想在batch和channels上做池化,所以这两个维度设为了1。
·strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1,stride,stride,1]。
·padding:和卷积类似,可以取VALID或者’SAME’。
·data_format:有两个选项,NHWC(默认)和NCHW。指明输入数据和输出数据的格式,对于NHWC,数据存储的格式为[batch,in_height,in_width,in_channels];对于NCHW,数据存储顺序为[batch,in_channels,in_height,in_width]。
·name:为操作取一个名字。结果返回一个Tensor类型不变,shape仍然是[batch,height,width,channels]这种形式。
在卷积神经网络ImageNet中采用另一种归一化方法,这种方法用TensorFlow来表示就是:tf.nn.local_response_normalization。ImageNet卷积神经网络利用该层对来自tf.nn.relu的输出进行归一化,因激活函数ReLU是无界函数,对其输出进行归一化有利于更有效识别那些高频特征。
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
#以3*3单通道的图像为例
#用1*1的卷积核
#步常为1
#最后得到3*3的feature map
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([1,1,5,1]))
conv2d_1 = tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='VALID')
#5*5图像
#3*3卷积核
#1步长
#3*3的输出
input = tf.Variable(tf.random_normal([1,5,5,5]))
filter = tf.Variable(tf.random_normal([3,3,5,1]))
conv2d_2 = tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='VALID')
#padding的值为'SAME'表示卷积核可以停留在图像边缘
#输出5*5的feature map
conv2d_3 = tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='SAME')
#步长不为1的情况只有两维
#通常strides取[1,image_height_stride,image_width_stride,1]
#修改out_channel为3
#输出3张为3*3的feature map
input = tf.Variable(tf.random_normal([1,5,5,5]))
filter = tf.Variable(tf.random_normal([3,3,5,1]))
conv2d_4 = tf.nn.conv2d(input,filter,strides=[1,2,2,1],padding='SAME')
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print("Example 1:")
print(sess.run(conv2d_1))
print("Example 2:")
print(sess.run(conv2d_2))
print("Example 3:")
print(sess.run(conv2d_3))
print("Example 4:")
print(sess.run(conv2d_4))