自定义权重初始化 tensorflow tf.layers.dense

新手上路,请多包涵

我正在尝试将自定义初始化程序设置为 tf.layers.dense 我在其中初始化 kernel_initializer 使用我已经拥有的权重矩阵。

 u_1 = tf.placeholder(tf.float32, [784, 784])
first_layer_u = tf.layers.dense(X_, n_params, activation=None,
                              kernel_initializer=u_1,
                              bias_initializer=tf.keras.initializers.he_normal())

这是抛出错误说 ValueError: If initializer is a constant, do not specify shape.

将占位符分配给 kernel_initializer 是个问题还是我遗漏了什么?

原文由 tourist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

至少有两种方法可以实现这一点:

1 创建自己的图层

  W1 = tf.Variable(YOUR_WEIGHT_MATRIX, name='Weights')
  b1 = tf.Variable(tf.zeros([YOUR_LAYER_SIZE]), name='Biases') #or pass your own
  h1 = tf.add(tf.matmul(X, W1), b1)

2 使用 tf.constant_initializer

 init = tf.constant_initializer(YOUR_WEIGHT_MATRIX)
l1 = tf.layers.dense(X, o, kernel_initializer=init)

原文由 Jonathan R 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为您可以定义自己的初始化函数。该函数需要采用 3 个参数: shapedtypepartition_info 。它应该返回一个 tf.Tensor 将用于初始化权重。由于您有一个 numpy 数组,我认为您可以使用 tf.constant 创建此张量。例如:

 def custom_initializer(shape_list, dtype, partition_info):
    # Use np.ones((7, 3)) as an example
    return tf.constant(np.ones((7, 3)))

然后你可以将它传递给 kernel_initializer 。如果尺寸都匹配,它应该可以工作。我在 要点 上举了一个例子,使用 Estimator 构建模型,并使用 LoggingTensorHook dense/kernel 。您应该能够看到重量已正确启动。

编辑:

我刚刚发现使用 tf.constant_initializer 会更好。它用于 tensorflow 指南。你可以做 kernel_initializer=tf.constant_initializer(np.ones((7, 3)))

原文由 Y. Luo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题