在使用it技术时,使用tf.nn.*
是否比使用tf.layers.*
更具优势?
例如,文档中的大多数示例使用tf.nn.conv2d
,但不清楚为什么要这样做。
在使用it技术时,使用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).
当加载一个预训练模型时,我会使用tf.nn.conv2d(示例代码:https://github.com/ry/tensorflow-vgg16),而对于从头开始训练的模型,则会使用tf.layers.conv2d。
filter
参数和filters
参数是有区别的! - Sergey Bushmanovtf.nn.conv2d
,需要明确指定input_channels
(作为filter
的一部分)是否也是一个主要区别?而tf.contrib.layers.conv2d
似乎隐含地确定了这一点?另外,在任何情况下,input_channels
是否可能与input.shape[-1]
(输入的最后一个维度)不同? - Honeybeartf.layers.conv2d
?因为 tf.nn.conv2d
可以让您初始化过滤器,从而加快训练时间。 - Abhiseklayer = tf.layers.conv2d(..., kernel_initializer=tf.contrib.layers.xavier_initializer())
我之所以更喜欢tf.layers中的这种方法,是因为它使用内核维度而不是自己设置张量,然后将其作为参数传递。 - Mircea在卷积方面,它们是相同的。更准确地说,tf.layers.conv2d
(实际上是_Conv
)使用tf.nn.convolution
作为后端。您可以遵循以下调用链:tf.layers.conv2d>Conv2D>Conv2D.apply()>_Conv>_Conv.apply()>_Layer.apply()>_Layer.\__call__()>_Conv.call()>nn.convolution()...
正如其他人所提到的,参数是不同的,特别是“filter(s)”。
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,则必须编写额外的代码来处理这些内容。
[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)
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)
tf.nn.conv2d(input, weights, activation=tf.nn.relu)
的激活函数,而不是 out = tf.nn.relu(out)
。 - twostarxx