好问题!找出它是一个绝招!
- 如您所见,
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)
它说:
如果初始值设定项为
None
(默认值),则使用在构造函数中传递的默认初始值设定项。如果那也是None
,我们将使用新的glorot_uniform_initializer
。
答案是:它使用glorot_uniform_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来验证初始化看起来像这样!
0
Tensorflow API官方文档声称
tf.layers.conv2d
和tf.layers.dense
的参数kernel_initializer
默认为None
。但是,在阅读图层教程( https://www.tensorflow.org/tutorials/layers )时,我注意到在代码中未设置此参数。例如:
本教程中的示例代码运行无任何错误,因此我认为默认的
kernel_initializer
不是None
。那么,使用哪个初始化器?在另一个代码,我没有设置
kernel_initializer
的conv2d和致密层的,一切都还顺利。但是,当我尝试将kernel_initializer
设置为tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32)
,出现了NaN错误。这里发生了什么?有人可以帮忙吗?