使用tf.nn.*
优于tf.layers.*
是否有任何好处?
例如,文档中的大多数示例都使用tf.nn.conv2d
,但不清楚为什么会这样做。
答案 0 :(得分:33)
正如GBY所提到的,他们使用相同的实现。
参数略有不同。
对于tf.nn.conv2d:
filter: A Tensor. Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels]
对于tf.layers.conv2d:
filters: Integer, the dimensionality of the output space (i.e. the number of filters in the convolution).
我在加载预训练模型时使用tf.nn.conv2d(示例代码:https://github.com/ry/tensorflow-vgg16),并为从头开始训练的模型使用tf.layers.conv2d。
答案 1 :(得分:24)
对于卷积,它们是相同的。更确切地说,tf.layers.conv2d
(实际上_Conv
)使用tf.nn.convolution
作为后端。您可以按照tf.layers.conv2d>Conv2D>Conv2D.apply()>_Conv>_Conv.apply()>_Layer.apply()>_Layer.\__call__()>_Conv.call()>nn.convolution()...
答案 2 :(得分:12)
正如其他人所提到的,参数不同,特别是"过滤器"。 tf.nn.conv2d将张量作为过滤器,这意味着您可以在cifar10 code中指定权重衰减(或可能是其他属性),如下所示。 (你是否想要/需要在转换层中进行重量衰减是另一个问题。)
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')
我不太确定如何在tf.layers.conv2d中设置权重衰减,因为它只使用整数作为过滤器。也许使用kernel_constraint
?
另一方面,如果你使用tf.nn.conv2d,tf.layers.conv2d会自动处理激活和偏置,而你必须为这些代码编写其他代码。
答案 3 :(得分:3)
所有这些其他答复都讨论了参数如何不同,但实际上,tf.nn和tf.layers conv2d的主要区别在于,对于tf.nn,您需要创建自己的过滤张量并将其传递给。该过滤器的大小必须为:[kernel_height, kernel_width, in_channels, num_filters]
答案 4 :(得分:2)
看看这里:tensorflow > tf.layers.conv2d
正如您所看到的,图层版本的参数是:
tf.layers.conv2d(输入,过滤器,kernel_size,strides =(1,1),padding ='有效',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)
和nn版本:
tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu = None,data_format = None,name = None)
我认为你可以选择你想要/需要/喜欢的选项!
答案 5 :(得分:0)
参数差异:
在代码中使用tf.layer *:
# Convolution Layer with 32 filters and a kernel size of 5
conv1 = tf.layers.conv2d(x, 32, 5, activation=tf.nn.relu)
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv1 = tf.layers.max_pooling2d(conv1, 2, 2)
在代码中使用tf.nn *: (请注意,我们需要另外传递权重和偏差作为参数)
strides = 1
# Weights matrix looks like: [kernel_size(=5), kernel_size(=5), input_channels (=3), filters (= 32)]
# Similarly bias = looks like [filters (=32)]
out = tf.nn.conv2d(input, weights, padding="SAME", strides = [1, strides, strides, 1])
out = tf.nn.bias_add(out, bias)
out = tf.nn.relu(out)