Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 错误:当子类化'Model'类时,应该实现'call'方法。关于tensorflow自定义模型_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

Python 错误:当子类化'Model'类时,应该实现'call'方法。关于tensorflow自定义模型

Python 错误:当子类化'Model'类时,应该实现'call'方法。关于tensorflow自定义模型,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我正在尝试在Cifar 10数据集上训练我的自定义模型。 我的型号代码如下:- class cifar10Model(keras.Model): def __init__(self): super(cifar10Model, self).__init__() self.conv1 = keras.layers.Conv2D(32, 3, activation='relu', input_shape=(32, 32, 3)) self.pool1 = keras.lay

我正在尝试在Cifar 10数据集上训练我的自定义模型。 我的型号代码如下:-

class cifar10Model(keras.Model):
  def __init__(self):
    super(cifar10Model, self).__init__()
    self.conv1 = keras.layers.Conv2D(32, 3, activation='relu', input_shape=(32, 32, 3))
    self.pool1 = keras.layers.MaxPool2D((3, 3))
    self.batch_norm1 = keras.layers.BatchNormalization()
    self.dropout1 = keras.layers.Dropout(0.1)

    self.conv2 = keras.layers.Conv2D(64, 3, activation='relu')
    self.pool2 = keras.layers.MaxPool2D((3, 3))
    self.batch_norm2 = keras.layers.BatchNormalization()
    self.dropout2 = keras.layers.Dropout(0.2)

    self.conv3 = keras.layers.Conv2D(128, 3, activation='relu')
    self.pool3 = keras.layers.MaxPool2D((3, 3))
    self.batch_norm3 = keras.layers.BatchNormalization()
    self.dropout3 = keras.layers.Dropout(0.3)

    self.flatten = keras.layers.Flatten()
    self.dense1 = keras.layers.Dense(128, activation='relu')
    self.dense2 = keras.layers.Dense(10)

    def call(self, x):
      x = self.conv1(x)
      x = self.pool1(x)
      x = self.batch_norm1(X)
      x = self.dropout1(x)

      x = self.conv2(x)
      x = self.pool2(x)
      x = self.batch_norm2(X)
      x = self.dropout2(x)

      x = self.conv3(x)
      x = self.pool3(x)
      x = self.batch_norm3(x)
      x = self.dropout3(x)

      x = self.flatten(x)
      x = self.dense1(x)
      return self.dense2(x)

model = cifar10Model()
当我运行这段代码时,不会出现错误

然后我定义了我的训练循环

loss_object = keras.losses.SparseCategoricalCrossentropy(from_logits=True)

optimizer = keras.optimizers.Adam()

train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')

@tf.function
def train_step(images, labels):
  with tf.GradientTape() as tape:
    predictions = model(images, training=True)
    loss = loss_object(labels, predictions)
  grad = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(grad, model.trainable_variables))
  train_loss(loss)
  train_accuracy(labels, predictions)

@tf.function
def test_step(images, labels):
  predictions = model(images)
  t_loss = loss_object(labels, predictions)

  test_loss(t_loss)
  test_accuracy(labels, predictions)

epochs = 10

for epoch in range(epochs):
  train_loss.reset_states()
  train_accuracy.reset_states()
  test_loss.reset_states()
  test_accuracy.reset_states()

  for images, labels in train_dataset:
    train_step(images, labels)

  for images, labels in test_dataset:
    test_step(images, labels)

  template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
  print(template.format(epoch + 1,
                        train_loss.result(),
                        train_accuracy.result() * 100,
                        test_loss.result(),
                        test_accuracy.result() * 100))
当我运行这段代码时,我得到以下错误

NotImplementedError: When subclassing the `Model` class, you should implement a `call` method.
我目前正在谷歌colab上运行我的代码

我的colab链接是

我在colab上的tensorflow版本是2.2.0

此外,当我试图通过以下代码从未经培训的模型中预测标签时:-

print(model(train_images))
这也给了我同样的错误。 错误是我没有在模型上实现调用方法。 但是,我已经定义了call方法

我还尝试将call方法更改为
\uu call\uu
方法

但是,它还是给了我同样的错误


提前感谢:-

问题在于缩进。您已经在
\uuuu init\uuuu
中定义了
call
方法。尝试在
\uuuu init\uuuu
方法之外定义它,如下所示:

class cifar10Model(keras.Model):
  def __init__(self):
    super(cifar10Model, self).__init__()
    self.conv1 = keras.layers.Conv3D(32, 3, activation='relu', input_shape=(32, 32, 3))
    self.pool1 = keras.layers.MaxPool3D((3, 3, 3))
    self.batch_norm1 = keras.layers.BatchNormalization()
    self.dropout1 = keras.layers.Dropout(0.1)

    self.conv2 = keras.layers.Conv3D(64, 3, activation='relu')
    self.pool2 = keras.layers.MaxPool3D((3, 3, 3))
    self.batch_norm2 = keras.layers.BatchNormalization()
    self.dropout2 = keras.layers.Dropout(0.2)

    self.conv3 = keras.layers.Conv3D(128, 3, activation='relu')
    self.pool3 = keras.layers.MaxPool3D((3, 3, 3))
    self.batch_norm3 = keras.layers.BatchNormalization()
    self.dropout3 = keras.layers.Dropout(0.3)

    self.flatten = keras.layers.Flatten()
    self.dense1 = keras.layers.Dense(128, activation='relu')
    self.dense2 = keras.layers.Dense(10)

  def call(self, x):
    x = self.conv1(x)
    x = self.pool1(x)
    x = self.batch_norm1(X)
    x = self.dropout1(x)

    x = self.conv2(x)
    x = self.pool2(x)
    x = self.batch_norm2(X)
    x = self.dropout2(x)

    x = self.conv3(x)
    x = self.pool3(x)
    x = self.batch_norm3(X)
    x = self.dropout3(x)

    x = self.flatten(x)
    x = self.dense1(x)
    return self.dense2(x)

model = cifar10Model()

希望这有帮助。

你能分享你的合作链接,让我看看吗?谢谢,你的建议很有效,我从来没有看过缩进。