tf.layers.conv2d和tf.layers.dense中的默认内核初始化器是什么?

78

官方Tensorflow API文档声称tf.layers.conv2dtf.layers.dense函数的参数kernel_initializer默认为None

然而,在阅读图层教程时(https://www.tensorflow.org/tutorials/layers),我注意到代码中没有设置该参数。例如:

# Convolutional Layer #1
conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu)
教程中的示例代码没有出现任何错误,因此我认为默认的“kernel_initializer”不是“None”。那么,使用了哪个初始化器呢?
在另一段代码中,我没有设置conv2d和dense层的“kernel_initializer”,一切都很好。然而,当我尝试将“kernel_initializer”设置为“tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32)”时,我得到了NaN错误。这是怎么回事?有人能帮忙吗?

也许NaN的原因不同?我使用kernel_initializer = tf.truncated_normal_initializer(stddev=0.001, dtype=tf.float32),它按预期工作。 - JirkaV
3个回答

110

很棒的问题!找到答案确实有点技巧性!

  • 正如您所看到的,在tf.layers.conv2d中没有记录
  • 如果您查看该函数的定义,您会发现该函数调用了variable_scope.get_variable

代码如下:

self.kernel = vs.get_variable('kernel',
                                  shape=kernel_shape,
                                  initializer=self.kernel_initializer,
                                  regularizer=self.kernel_regularizer,
                                  trainable=True,
                                  dtype=self.dtype)

下一步: 当initializer为None时变量作用域(variable scope)的作用是什么?

这里说:

如果initializer为None(默认值),那么会使用在构造函数中传入的默认initializer。如果那个initializer也是 None,我们就使用一个新的glorot_uniform_initializer。

因此答案是:它使用glorot_uniform_initializer

为了完整起见,这个initializer的定义如下:

Glorot均匀初始化器(也称为Xavier均匀初始化器)。 它从[-limit, limit]的均匀分布中抽取样本, 其中limit是sqrt(6 / (fan_in + fan_out)), 而fan_in和fan_out分别是权重张量中的输入单元数和输出单元数。 参考:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

编辑:这是我在代码和文档中找到的东西。也许您可以通过对权重运行eval来验证初始化是否如此!


1
我有同样的问题。根据TensorBoard中的内核图,似乎内核是从某个均匀分布中初始化的。 - EXP0

3
根据Andrew Ng的这门课程Xavier文档,如果您使用ReLU作为激活函数,最好将默认的权重初始化器(即Xavier均匀分布)改为Xavier正态分布,方法如下:
y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )

2
在Keras中,Conv2D 中的 kernel_initializer= 'glorot_normal'keras.initializers.glorot_normal(seed=None)表示高斯分布的Xavier/Glorot初始化器。 - bit_scientist
glorot_uniform_initializer 是 Xavier normal 吗?我的理解正确吗? - johnnn123

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接