トレーニング実行間の中間レイヤー内の各エポックでパラメーターを更新するにはどうすればよいですか?(tensorflow熱心な実行)

ハサンジャワド

シーケンシャル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から入手しました。これにほぼ似たものが必要ですが、テンソルフローの熱心な実行でこれが機能するのか、期待される出力を得るために何をしなければならないのか疑問に思いました。

私はかなり長い間これを実装しようとしてきましたが、それを理解することができませんでした。誰か助けてくれませんか。ありがとうございました...

ハサンジャワド

はい、私の問題は解決しました。この種の変数を更新するための組み込みメソッドのいくつかに出くわしました(これは、上記の私の場合のように、エポック間で永続的な状態を維持することです)。基本的に私がする必要があるのは例えば:

  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で入手できますありがとう。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ