Tensorflow tf.layers.conv2d和tf.layers.dense中默认的内核初始值设定项是什么?

Tensorflow tf.layers.conv2d和tf.layers.dense中默认的内核初始值设定项是什么?,tensorflow,Tensorflow,官方Tensorflow API文档声称,对于tf.layers.conv2d和tf.layers.dense,参数kernel\u初始值设定项默认为None 但是,在阅读layers教程()时,我注意到代码中没有设置此参数。例如: 卷积层1 conv1=tf.layers.conv2d( 输入=输入层, 过滤器=32, 内核大小=[5,5], padding=“相同”, 激活=tf.nn.relu) 教程中的示例代码运行时没有任何错误,因此我认为默认的kernel\u初始值设定项不是None

官方Tensorflow API文档声称,对于
tf.layers.conv2d
tf.layers.dense
,参数
kernel\u初始值设定项默认为
None

但是,在阅读layers教程()时,我注意到代码中没有设置此参数。例如:

卷积层1 conv1=tf.layers.conv2d( 输入=输入层, 过滤器=32, 内核大小=[5,5], padding=“相同”, 激活=tf.nn.relu)
教程中的示例代码运行时没有任何错误,因此我认为默认的
kernel\u初始值设定项
不是
None
。那么,使用哪个初始值设定项


在另一段代码中,我没有设置conv2d和稠密层的
kernel\u初始值设定项
,一切都很好。然而,当我试图将
内核\u初始值设定项设置为
tf.truncated\u normal\u初始值设定项(stddev=0.1,dtype=tf.float32)
时,我得到了一个错误。这是怎么回事?有人能帮忙吗?

好问题!这真是个骗局

  • 如您所见,在中没有记录
  • 如果查看的定义,您会看到函数调用
    variable\u scope.get\u variable
代码:

self.kernel=vs.get_变量('kernel',
形状=内核形状,
初始值设定项=self.kernel\u初始值设定项,
正则化器=self.kernel\u正则化器,
可训练的,
dtype=self.dtype)
下一步:

这里写着:

如果初始值设定项为
None
(默认值),则传入默认初始值设定项 使用构造函数。如果那一个也是
None
,我们就使用一个新的
glorot\u uniform\u初始值设定项

所以答案是:它使用

为完整起见,此初始值设定项的定义如下:

Glorot统一初始值设定项,也称为Xavier统一初始值设定项。 它从[-limit,limit]范围内的均匀分布中提取样本 其中
limit
sqrt(6/(扇入+扇出))
其中,
fan_in
是权重张量中的输入单位数 而
fan_out
是权重张量中的输出单位数。 参考:

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

>根据Andrew Ng和,如果你使用<强> Relu < /St>作为激活函数,最好将默认权重初始化器(< <强>沙维尔制服< /强>)改为<强>沙维尔常态< /强>:

y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )

2.0兼容答案:即使在Tensorflow 2.0中,
tf.keras.layers.Conv2D
tf.keras.layers.Dense
中默认的
内核初始值设定项

这在Tensorflow.org网站上有详细说明

Conv2D
的链接是

而稠密
的链接是


也许NaN有不同的原因?我使用的是kernel\u initializer=tf.truncated\u normal\u initializer(stddev=0.001,dtype=tf.float32),它可以按预期工作。我有同样的问题。根据tensorboard中的内核图,似乎内核是从某个均匀分布中初始化的。即
keras.initializers.glorot_normal(seed=None)
或简单地
kernel_initializer='glorot_normal'
inside
Conv2D
keras.glorot_uniform_initializer是Xavier normal吗?我的理解正确吗?