モデルがサブクラス化によって構築されている場合、カスタムコールバック内から中間レイヤーにアクセスする際の「レイヤーが接続されていません」の問題

2020-07-01 python tensorflow machine-learning keras deep-learning

私は単純なモデルであり、中間予測を取得するためにカスタムコールバック内の中間レイヤーにアクセスする必要があります。

import tensorflow as tf
import numpy as np

X = np.ones((8,16))
y = np.sum(X, axis=1)

class CustomCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        get_output = tf.keras.backend.function(
            inputs = self.model.layers[0].input,
            outputs = self.model.layers[1].output
        )
        print("\nLayer output: ", get_output(X))

以下のようなサブクラス化によってモデルを構築する場合:

class Model(tf.keras.Model):
    def build(self, input_shape):
        self.dense1 = tf.keras.layers.Dense(units=32)
        self.dense2 = tf.keras.layers.Dense(units=1)
        
    def call(self, input_tensor):
        x = self.dense1(input_tensor)
        x = self.dense2(x)
        return x

model = Model()
model.compile(optimizer='adam',loss='mean_squared_error', metrics='accuracy')
model.fit(X,y, epochs=2, callbacks=[CustomCallback()])

次のエラーが発生します:

<ipython-input-8-bab75191182e> in on_epoch_end(self, epoch, logs)
      2     def on_epoch_end(self, epoch, logs=None):
      3         get_output = tf.keras.backend.function(
----> 4             inputs = self.model.layers[0].input,
      5             outputs = self.model.layers[1].output
      6         )
.
.
AttributeError: Layer dense is not connected, no input to return.

一方、以下のような関数型APIを使用してモデルを構築すると、期待どおりに機能します。

initial = tf.keras.layers.Input((16,))
x = tf.keras.layers.Dense(units=32)(initial)
final = tf.keras.layers.Dense(units=1)(x)

model = tf.keras.Model(initial, final)
model.compile(optimizer='adam',loss='mean_squared_error', metrics='accuracy')
model.fit(X,y, epochs=2, callbacks=[CustomCallback()])

モデルのサブクラス化の場合、エラーの原因は何ですか?

TFバージョン:2.2.0

Answers

Related