Tensorflow tf.layers.conv2d和tf.layers.dense中默认的内核初始值设定项是什么?
官方Tensorflow API文档声称,对于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
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'
insideConv2D
keras.glorot_uniform_initializer是Xavier normal吗?我的理解正确吗?