Tensorflow实现卷积神经网络

    技术2022-07-11  86

    Tensorflow实现卷积神经网络

    Tensorflow实现卷积神经网络卷积层池化层归一化层实现简单的卷积神经网络

    Tensorflow实现卷积神经网络

    卷积层

    卷积核,步福,填充,多通道卷积,激活函数,卷积函数。 主要函数使用: 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))
    Processed: 0.009, SQL: 9