官方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.dense到kernel_initializer,我得到NaN的错误.这里发生了什么?有人可以帮忙吗?
rme*_*ens 99
好问题!找出来是一个很好的伎俩!
tf.layers.conv2dvariable_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也是,我们使用新的glorot_uniform_initializer.
所以答案是:它使用了 glorot_uniform_initializer
为了完整性,此初始化程序的定义:
Glorot统一初始化器,也称为Xavier统一初始化器.它吸引样本内的均匀分布[-limit,限制],其中
limit是sqrt(6 / (fan_in + fan_out))其中fan_in是在重量张量输入单元的数量和fan_out是在重量张量输出单元的数量.参考:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
编辑:这是我在代码和文档中找到的.也许你可以通过在权重上运行eval来验证初始化看起来像这样!
| 归档时间: |
|
| 查看次数: |
26407 次 |
| 最近记录: |