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

dan*_*szw 66 tensorflow

官方Tensorflow API文档声称对于tf.layers.conv2d和tf.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)
Run Code Online (Sandbox Code Playgroud)

本教程中的示例代码运行时没有任何错误,因此我认为默认kernel_initializer值不是None.那么,使用哪个初始化程序?

在另一个代码中,我没有设置tf.layers.conv2dconv2d和密集层,一切都很好.然而,当我试图设置tf.layers.densekernel_initializer,我得到NaN的错误.这里发生了什么?有人可以帮忙吗?

rme*_*ens 99

好问题!找出来是一个很好的伎俩!

  • 如您所见,它没有记录在案 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)
Run Code Online (Sandbox Code Playgroud)

下一步:当初始化程序为None时,变量作用域的作用是什么?

这里说:

如果初始化程序是None(默认值),则使用构造函数中传递的默认初始值设定项.如果那个None也是,我们使用新的 glorot_uniform_initializer.

所以答案是:它使用了 glorot_uniform_initializer

为了完整性,此初始化程序的定义:

Glorot统一初始化器,也称为Xavier统一初始化器.它吸引样本内的均匀分布[-limit,限制],其中limitsqrt(6 / (fan_in + fan_out)) 其中fan_in是在重量张量输入单元的数量和fan_out是在重量张量输出单元的数量.参考:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

编辑:这是我在代码和文档中找到的.也许你可以通过在权重上运行eval来验证初始化看起来像这样!