tf.nn.conv2d与tf.layers.conv2d
python
tensorflow
5
0

tf.layers.*相比,使用tf.nn.*有什么优势吗?

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

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

对于卷积,它们是相同的。更准确地说, tf.layers.conv2d (实际上是_Conv )使用tf.nn.convolution作为后端。您可以遵循以下调用链: tf.layers.conv2d>Conv2D>Conv2D.apply()>_Conv>_Conv.apply()>_Layer.apply()>_Layer.\__call__()>_Conv.call()>nn.convolution()...

收藏
评论

如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用于从头开始训练的模型。

收藏
评论

所有这些其他答复都讨论了参数如何不同,但实际上,tf.nn和tf.layers conv2d的主要区别在于,对于tf.nn,您需要创建自己的过滤器张量并将其传递。需要具有以下大小: [kernel_height, kernel_width, in_channels, num_filters]

本质上,tf.nn的级别低于tf.layers的级别。不幸的是,这个答案不再适用,因为tf.layers已过时

收藏
评论

在这里看看: tensorflow> tf.layers.conv2d

和这里: tensorflow> conv2d

如您所见,layers版本的参数为:

tf.layers.conv2d(输入,过滤器,kernel_size,步幅=(1,1),填充='有效',data_format ='channels_last',dilation_rate =(1、1),激活=无,use_bias = True,kernel_initializer =无,bias_initializer = tf.zeros_initializer(),kernel_regularizer =无,bias_regularizer =无,activity_regularizer =无,可训练=真,名称=无,重用=无)

和nn版本:

tf.nn.conv2d(输入,过滤器,步幅,填充,use_cudnn_on_gpu =无,data_format =无,名称=无)

我认为您可以选择一个想要/需要/喜欢的选项!

收藏
评论

正如其他提到的,参数是不同的,尤其是“过滤器”。 tf.nn.conv2d采用张量作为过滤器,这意味着您可以像cifar10代码中那样指定权重衰减(或其他属性)。 (是否要/需要在转换层中减小重量是另一个问题。)

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.layers.conv2d自动处理激活和偏差,如果您使用tf.nn.conv2d,则必须为此编写其他代码。

收藏
评论

参数差异:

在代码中使用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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号