如何在两次训练之间的中间层的每个时期更新参数? (张量流渴望执行)

时间:2020-03-27 02:22:35

标签: python tensorflow keras layer eager-execution

我有一个顺序的keras模型,并且有一个类似于以下示例的自定义图层,名为“ CounterLayer”。我正在使用tensorflow 2.0(渴望执行)

class CounterLayer(tf.keras.layers.Layer):
  def __init__(self, stateful=False,**kwargs):
    self.stateful = stateful
    super(CounterLayer, self).__init__(**kwargs)


  def build(self, input_shape):
    self.count = tf.keras.backend.variable(0, name="count")
    super(CounterLayer, self).build(input_shape)

  def call(self, input):
    updates = []
    updates.append((self.count, self.count+1))
    self.add_update(updates)
    tf.print('-------------')
    tf.print(self.count)
    return input

例如,当我运行epoch = 5之类的命令时,self.count的值不会随着每次运行而更新。它始终保持不变。我从https://stackoverflow.com/a/41710515/10645817那里得到了这个例子。我需要几乎与此类似的东西,但我想知道这项工作是否在急于执行tensorflow或我该怎么做才能获得预期的输出。

我已经尝试实现了一段时间,但无法弄清楚。有人可以帮我吗。谢谢...

1 个答案:

答案 0 :(得分:0)

是的,我的问题已解决。我遇到了一些内置方法来更新这种类型的变量(这是为了在各个时期之间保持持久状态,如上述案例)。 基本上我需要做的例如:

  def build(self, input_shape):
    self.count = tf.Variable(0, dtype=tf.float32, trainable=False)
    super(CounterLayer, self).build(input_shape)

  def call(self, input):
    ............
    self.count.assign_add(1)
    ............
    return input

一个人可以用来在call函数中计算更新的值,也可以通过调用self.count.assign(some_updated_value)来分配它。 https://www.tensorflow.org/api_docs/python/tf/Variable中提供了此类操作的详细信息。谢谢。