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

Tensorflow API官方文档声称tf.layers.conv2dtf.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)

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

在另一个代码,我没有设置kernel_initializer的conv2d和致密层的,一切都还顺利。但是,当我尝试将kernel_initializer设置为tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32) ,出现了NaN错误。这里发生了什么?有人可以帮忙吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

好问题!找出它是一个绝招!

  • 如您所见, 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 (默认值),则使用在构造函数中传递的默认初始值设定项。如果那也是None ,我们将使用新的glorot_uniform_initializer

答案是:它使用glorot_uniform_initializer

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

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

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

收藏
评论

根据Andrew Ng和Xavier文档的 课程 ,如果您使用ReLU作为激活函数,则最好通过以下方式将默认的权重初始值设定项( Xavier Unified )更改为Xavier normal

y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号