シーケンシャル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]
コメントを追加