参考链接:https://stackoverflow.com/questions/42785026/tf-nn-conv2d-vs-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=init_ops.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None, trainable=True,
name=None, reuse=None)
tf.nn.conv2d(input, filter, strides, padding,
use_cudnn_on_gpu=None, data_format=None, name=None)
对于卷积来说,两者作用是一样的。最大的区别在于:
- layers中 filters:一个整数,代表滤波器的个数,也就是卷积核数或者输出空间的维数
- nn中 filter: 一个四维张量,[filter_height, filter_width, in_channels, out_channels]
相当于nn中的filter在layers中被拆成了filters和kernel_size两个参数。
此外:
- layers更适合从头到尾训练模型,因为activation和bias自动实现,而nn则需要你显示地创建placeholder并进行相关计算
- nn更适合加载已经预训练好的模型,因为filter由tf.Variable生成,在加载预训练的权值时更快
- nn可以用权重衰减(因为权重矩阵是你显示定义的,layers中根据参数为你自动定义weights)如下:
kernel = _variable_with_weight_decay('weights', shape=[5, 5, 3, 64], stddev=5e-2, wd=0.0) conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')