如何在Tensorflow 2.0中使用预制的致密层进行训练?

时间:2019-10-09 14:18:56

标签: python python-3.x tensorflow tensorflow2.0

我正在重写与TF 2.0兼容的代码。不幸的是,网站提供的几乎每个示例都使用keras API。但是,我想用原始的tensorflow函数编写代码。

在某些时候,在训练过程中计算和应用梯度的新方法看起来像这样(从here窃取的代码):

# Optimization process. 
def run_optimization(x, y):
    # Wrap computation inside a GradientTape for automatic differentiation.
    with tf.GradientTape() as g:
        pred = logistic_regression(x)
        loss = cross_entropy(pred, y)

    # Compute gradients.
    gradients = g.gradient(loss, [W, b])

    # Update W and b following gradients.
    optimizer.apply_gradients(zip(gradients, [W, b]))

在这里引起问题的是我必须指定可训练变量的事实。在这种特殊情况下,这很容易,因为W和b是手动创建的。通过使用model.trainable_variables使用keras模型也很容易。

在我的模型中,我正在使用由tensorflow提供的致密层,例如tf.keras.layers.Dense。 tensorflow 1.x中为该用例提供的功能为tf.trainable_variables(),但现在不存在。

如何获取它们的内部权重以将其传递给GradientTape?

2 个答案:

答案 0 :(得分:1)

所有Keras图层都具有属性trainable_variables,您可以使用该属性来访问它们。还有trainable_weights,但在大多数情况下两者是相同的。请注意,在构建图层之前,这实际上是一个空列表,您可以通过调用layer.build(input_shape)来完成。或者,将在第一次在输入上调用该层时构建该层。

答案 1 :(得分:0)

您在Keras中有一个tf.trainable_variables()的等价物,即tf.keras.layers.Layer.trainable_variables

Here是一个更真实的示例,说明如何在Keras模型中使用渐变带。