![](/img/trans.png)
[英]Tensorflow: why tf.nn.conv2d runs faster than 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.