TensorFlow中CNN相关函数
卷积函数
tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on=None,name=None)
input:需要做卷积的出入数量,注意是一个4维的张量([batch,in_height,in_width,in_channels]),要求类型为float32或float64其中之一
filter:卷积核。[filter_height,filter_with,in_channels,out_channels]
padding:定义匀速边框与元素内容之间的空间。"SAME"或"VALID",这个值决定了不同的卷积方式,当为"SAME"时,表示边缘填充,适用于全尺寸操作;当为"valid"时,表示边缘不填充
user_cudnn_on_gpu:bool类型,是否使用CUDNN加速
name:改操作名称
返回值:返回一个tensor,即feature map
python
import tensorflow as tf
import numpy as np
input_data = tf.Variable(np.random.rand(10,9,9,4),dtype=np.float32)
filter_data = tf.Variable(np.random.rand(3,3,4,2),dtype=np.float32)
# y = tf.nn.conv2d(input_data,filter_data,strides=[1,1,1,1],padding='VALID')
y = tf.nn.conv2d(input_data,filter_data,strides=[1,1,1,1],padding='SAME')
print(input_data.shape)
print(y.shape)
池化函数
池化函数定义在tensorflow/python/ops下的nn.py和gen_nn_ops.py文件中:
最大池化:tf.nn.max_pool(value,ksize,strides,padding,name=None)
平均池化:tf.nn.avg_pool(value,ksize,strides,padding,name=None)
- value:需要池化的输入,一版池化层姐在卷积层后面,所以输入通常conv2d所输出的feature map,依然是4维的张量([batch,height,width,channels])
- ksize:池化窗口的大小,由于一版不在batch和channel上做池化,所以ksize一版是[1,height,width,1]
- strides:图像每一维的步长,是一个一维向量,长度为4
- padding:和卷积函数中padding含义一样
- name:改操作的名称
- 返回值:返回一个tensor
python
import tensorflow as tf
import numpy as np
input_data = tf.Variable(np.random.rand(10,6,6,4),dtype=np.float32)
filter_data = tf.Variable(np.random.rand(2,2,4,2),dtype=np.float32)
# y = tf.nn.conv2d(input_data,filter_data,strides=[1,1,1,1],padding='VALID')
y = tf.nn.conv2d(input_data,filter_data,strides=[1,1,1,1],padding='SAME')
# 最大池化
output = tf.nn.max_pool(input=y,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
print(input_data.shape)
print(y.shape)
print(output.shape)
# 最小池化
avg_output = tf.nn.avg_pool(input=y,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
print(input_data.shape)
print(y.shape)
print(avg_output.shape)