tf.nn.conv2d vs tf.layers.conv2d

时间:2017-03-14 11:41:17

标签: python tensorflow

使用tf.nn.*优于tf.layers.*是否有任何好处?

例如,文档中的大多数示例都使用tf.nn.conv2d,但不清楚为什么会这样做。

6 个答案:

答案 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

在这里:tensorflow > 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)