AttributeError: Layer mnist_model_35 has no inbound nodes. Tensorflow keras subclassing API

AttributeError: Layer mnist_model_35 has no inbound nodes. Tensorflow keras subclassing API

我正在使用 mnist 数据集进行 keras 子类化。我能够用 SequantialFunctional api 做到这一点。但是现在当我在我的子类上调用 model.fit() 时,我得到了这个错误:

AttributeError: Layer mnist_model_35 has no inbound nodes.

这是我的代码:

  1. MNIstModel
class MNISTModel(keras.Model):
  def __init__(self):
    super().__init__()
    self.flatten_layer = keras.layers.Flatten()
    self.dense_1 = keras.layers.Dense(64, activation='relu')
    self.dense_2 = keras.layers.Dense(128, activation='relu')
    self.relu = keras.activations.relu
    self.ouput = keras.layers.Dense(10, activation='softmax')
    self.softmax = keras.activations.softmax

  def call(self, x):
    x = self.flatten_layer(x)
    x = self.dense_1(x)
    x = self.dense_2(x)
    x = self.output(x)
    return x
  def model(self):
    x = keras.layers.Input(shape=(28*28,))
    return keras.Model(inputs=[x], outputs=self.call(x))

  1. 正在训练我的模型
sub_model = MNISTModel()
sub_model_1 = Model(sub_model)
sub_model.compile(
    loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    optimizer = keras.optimizers.Adam(learning_rate=0.001),
    metrics = keras.metrics.SparseCategoricalAccuracy()           
)
sub_model.fit(X_train_tensors, y_train_tensors, epochs=2, verbose=1, batch_size=32,
          validation_data=(X_test_tensors, y_test_tensors),
          validation_batch_size=16)

sub_model.model().summary()
  1. 我如何加载和预处理我的 mnist 数据集。
(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()

def normalize(image):
  image = tf.convert_to_tensor(image.astype('float32'))/255
  return image

X_train_tensors =tf.convert_to_tensor(list(map(normalize, X_train)))
X_test_tensors = tf.convert_to_tensor(list(map(normalize, X_test)))

y_test_tensors = tf.convert_to_tensor(y_test)
y_train_tensors = tf.convert_to_tensor(y_train)

您的第一层缺少 input_shape:

class MNISTModel(keras.Model):
    def __init__(self):
        super().__init__()
        self.flatten_layer = keras.layers.Flatten(input_shape=(28, 28))
        self.dense_1 = keras.layers.Dense(64, activation='relu')
        self.dense_2 = keras.layers.Dense(128, activation='relu')
        self.op = keras.layers.Dense(10, activation='softmax')

    def call(self, x):
        y = self.flatten_layer(x)
        y = self.dense_1(y)
        y = self.dense_2(y)
        return self.op(y)


sub_model = MNISTModel()
sub_model.compile(
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    optimizer=keras.optimizers.Adam(learning_rate=0.001),
    metrics=[keras.metrics.SparseCategoricalAccuracy()]
)
sub_model.fit(X_train_tensors, y_train_tensors, epochs=2, verbose=1, batch_size=32,
              validation_data=(X_test_tensors, y_test_tensors),
              validation_batch_size=16)

sub_model.summary()

您的代码中存在一些语法错误问题。这是正确的。

class MNISTModel(keras.Model):
  def __init__(self):
    super().__init__()
    self.flatten_layer = keras.layers.Flatten()
    self.dense_1 = keras.layers.Dense(64, activation='relu')
    self.dense_2 = keras.layers.Dense(128, activation='relu')
    self.out = keras.layers.Dense(10, activation='softmax')

  def call(self, x):
    x = self.flatten_layer(x)
    x = self.dense_1(x)
    x = self.dense_2(x)
    x = self.out(x)
    return x
  def model(self):
    x = keras.layers.Input(shape=(28, 28))
    return keras.Model(inputs=[x], outputs=self.call(x))
sub_model = MNISTModel()
sub_model.model().summary()

运行

(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()

sub_model.compile(
    loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    optimizer = keras.optimizers.Adam(learning_rate=0.001),
    metrics = keras.metrics.SparseCategoricalAccuracy()           
)
sub_model.fit(X_train, y_train, epochs=2, verbose=1, batch_size=32,
          validation_data=(X_test, y_test))
Epoch 1/2
5s 2ms/step - loss: 1.2542 - sparse_categorical_accuracy: 0.8238 - 
 val_loss: 0.4759 - val_sparse_categorical_accuracy: 0.8937

Epoch 2/2
4s 2ms/step - loss: 0.4178 - sparse_categorical_accuracy: 0.9019 - 
 val_loss: 0.4046 - val_sparse_categorical_accuracy: 0.9082
<tensorflow.python.keras.callbacks.History at 0x7f6c6ed99d50>