繁体   English   中英

tf.nn.conv2d 与 tf.layers.conv2d

[英]tf.nn.conv2d vs tf.layers.conv2d

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

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

正如 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).

在加载预训练模型(示例代码: https : //github.com/ry/tensorflow-vgg16 )时,我会使用 tf.nn.conv2d,而对于从头开始训练的模型,我会使用 tf.layers.conv2d。

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

正如其他人提到的,参数是不同的,尤其是“过滤器”。 tf.nn.conv2d 将张量作为过滤器,这意味着您可以在cifar10 代码中指定权重衰减(或其他属性),如下所示 (您是否想要/需要在 conv 层中进行权重衰减是另一个问题。)

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.nn 和 tf.layers conv2d 的主要区别在于,对于 tf.nn,您需要创建自己的过滤张量并将其传入。这个过滤器需要的大小为: [kernel_height, kernel_width, in_channels, num_filters]

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

参数差异:

在代码中使用 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)

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

在这里:张量流> 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=无,bias_initializer=tf.zeros_initializer(),kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,trainable=True,name=None,reuse=None)

和 nn 版本:

tf.nn.conv2d(输入,过滤器,步幅,填充,use_cudnn_on_gpu=None,data_format=None,name=None)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM