tensorflow 1.0 学习:卷积层
在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化。
一、旧版本(1.0以下)的卷积函数:tf.nn.conv2d
conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None )
该函数定义在tensorflow/python/ops/gen_nn_ops.py
。
参数:
input
:一个4维Tensor(N,H,W,C)
. 类型必须是以下几种类型之一:half
,float32
,float64
.filter
:卷积核
. 类型和input
必须相同,4维tensor,[filter_height, filter_width, in_channels, out_channels],如[5,5,3,32]
strides
: 在input
上切片采样时,每个方向上的滑窗步长,必须和format指定的维度同阶,如[1, 2, 2, 1]padding
: 指定边缘填充类型:"SAME", "VALID"
. SAME表示卷积后图片保持不变,VALID则会缩小。use_cudnn_on_gpu
: 可选项,bool型。表示是否在GPU上用cudnn进行加速,默认为True.data_format
: 可选项,指定输入数据的格式:"NHWC"或 "NCHW"
, 默认为"NHWC"
。
NHWC格式指[batch, in_height, in_width, in_channels]
NCHW格式指[batch, in_channels, in_height, in_width]
name
: 操作名,可选.
示例:
conv1=tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
二、1.0版本中的卷积函数:tf.layers.conv2d
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, trainable=True, name=None, reuse=None )
定义在tensorflow/python/layers/convolutional.py
.
参数多了很多,但实际用起来,却更简单。
inputs
: 输入数据,4维tensor.filters
: 卷积核个数。kernel_size
:卷积核大小,如【5,5】。如果长宽相等,也可以直接设置为一个数,如kernel_size=5strides
: 卷积过程中的滑动步长,默认为[1,1]. 也可以直接设置为一个数,如strides=2padding
: 边缘填充,'same' 和'valid‘选其一。默认为valid-
data_format
: 输入数据格式,默认为channels_last
,即(batch, height, width, channels),也可以设置为
channels_first
对应(batch, channels, height, width)
. -
dilation_rate
: 微步长卷积,这个比较复杂一些,请百度. activation
: 激活函数.use_bias
: Boolean型,是否使用偏置项.kernel_initializer
: 卷积核的初始化器.bias_initializer
: 偏置项的初始化器,默认初始化为0.kernel_regularizer
: 卷积核化的正则化,可选.bias_regularizer
: 偏置项的正则化,可选.activity_regularizer
: 输出的正则化函数.trainable
: Boolean型,表明该层的参数是否参与训练。如果为真则变量加入到图集合中GraphKeys.TRAINABLE_VARIABLES
(seetf.Variable
).name
: 层的名字.reuse
: Boolean型, 是否重复使用参数.
示例:
conv1=tf.layers.conv2d( inputs=x, filters=32, kernel_size=5, padding="same", activation=tf.nn.relu,
kernel_initializer=tf.TruncatedNormal(stddev=0.01))
更复杂一点的:
conv1 = tf.layers.conv2d(batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu, kernel_initializer=tf.TruncatedNormal(stddev=0.01) bias_initializer=tf.Constant(0.1), kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003), bias_regularizer=tf.contrib.layers.l2_regularizer(0.003), name='conv1')