Keras NotImplementedError:当子类化'Model'类时,应该实现'call'方法

Keras NotImplementedError:当子类化'Model'类时,应该实现'call'方法,keras,python,tensorflow,machine-learning,deep-learning,Keras,Python,Tensorflow,Machine Learning,Deep Learning,我正在研究这个图像分类问题。我正在尝试使用子类化API的来完成几乎所有的事情。我已经创建了自定义的conv块,如下所示: class ConvBlock(keras.layers.Layer): def __init__(self, in_features, kernel_size=(3, 3)): super(ConvBlock, self).__init__() self.conv = keras.layers.Conv2D(in_features,

我正在研究这个图像分类问题。我正在尝试使用子类化
API的
来完成几乎所有的事情。我已经创建了自定义的conv块,如下所示:

class ConvBlock(keras.layers.Layer):
    def __init__(self, in_features, kernel_size=(3, 3)):
        super(ConvBlock, self).__init__()
        self.conv = keras.layers.Conv2D(in_features, kernel_size, padding="same")
        self.bn = keras.layers.BatchNormalization()
        self.relu = keras.activations.relu
        
    def call(self, x, training=False):
        x = self.conv(x)
        x = self.bn(x, training=training)
        return self.relu(x)
from tensorflow import keras 

class Model(keras.Model):
   def __init__:
       self.model = model
   def train_step:
   def test_step:
   def compile: 

   # implement the call method
   def call(self, inputs, *args, **kwargs):
       return self.model(inputs)
之后,我创建了用于测试的简单
顺序
模型,如下所示:

class ConvBlock(keras.layers.Layer):
    def __init__(self, in_features, kernel_size=(3, 3)):
        super(ConvBlock, self).__init__()
        self.conv = keras.layers.Conv2D(in_features, kernel_size, padding="same")
        self.bn = keras.layers.BatchNormalization()
        self.relu = keras.activations.relu
        
    def call(self, x, training=False):
        x = self.conv(x)
        x = self.bn(x, training=training)
        return self.relu(x)
from tensorflow import keras 

class Model(keras.Model):
   def __init__:
       self.model = model
   def train_step:
   def test_step:
   def compile: 

   # implement the call method
   def call(self, inputs, *args, **kwargs):
       return self.model(inputs)
seq_model=keras.Sequential([
康夫布洛克(64),
康夫布洛克(128),
康夫布洛克(64),
keras.layers.Flatten(),
keras.layers.致密(64,活化='relu'),
keras.layers.致密(128,活化='relu'),
keras.layers.致密(64,活化='relu'),
keras.层.致密(5,活化='softmax'),
],name=“seq_model”)
seq_模型构建((无、96、96、1))
seq_模型摘要()
到目前为止还不错,如果我在这个
序列模型上调用
.compile()
.train()
.evaluate()
,它就可以工作了。当我尝试使用自定义的
.compile()
调用
.train()
调用
.evaluate()
.train()
.evaluate()
时,就会出现问题。以下代码显示了我是如何创建它们的:

类模型(keras.Model):
定义初始化(自我,模型):
super()。\uuuu init\uuuuu()
self.model=model
#.compile()
def编译(自我、损失、优化器、度量):
super().compile()
自我损失=损失
self.optimizer=优化器
self.custom_metrics=度量
#.fit()
def系列步骤(自身、数据):
x、 y=数据
使用tf.GradientTape()作为磁带:
pred=self.model(x,training=True)
损失=自身损失(y,pred)
梯度=磁带梯度(损耗、自可训练的变量)
优化器。应用_梯度(zip(梯度,自可训练的_变量))
self.custom\u metrics.update\u state(y,pred)
返回{“损失”:损失,“准确性”:self.custom_metrics.result()}
#.评估()
def测试步骤(自身、数据):
x、 y=数据
pred=self.model(x,training=False)
损失=自身损失(y,pred)
self.custom\u metrics.update\u state(y,pred)
返回{“损失”:损失,“准确性”:self.custom_metrics.result()}
这就是我所说的

yoga_模型=模型(顺序模型)
yoga_model.compile(
损失=keras.loss.CategoricalCrossentropy(根据逻辑=False),
优化器=keras.optimizers.Adam(lr=0.001),
metrics=keras.metrics.CategoricalAccuracy(name=“acc”)
)
瑜珈模型.fit(训练,历次=1,详细=1)

请帮忙。欢迎提供帮助。

在具有子类API的自定义模型中,实现
调用
方法,如下所示:

class ConvBlock(keras.layers.Layer):
    def __init__(self, in_features, kernel_size=(3, 3)):
        super(ConvBlock, self).__init__()
        self.conv = keras.layers.Conv2D(in_features, kernel_size, padding="same")
        self.bn = keras.layers.BatchNormalization()
        self.relu = keras.activations.relu
        
    def call(self, x, training=False):
        x = self.conv(x)
        x = self.bn(x, training=training)
        return self.relu(x)
from tensorflow import keras 

class Model(keras.Model):
   def __init__:
       self.model = model
   def train_step:
   def test_step:
   def compile: 

   # implement the call method
   def call(self, inputs, *args, **kwargs):
       return self.model(inputs)

你应该在你的模型类中实现一个调用函数。非常感谢你这么做。很高兴它有帮助。请把它标为正确答案。)已标记..!不,我的意思是,如果此答案解决了您的问题,您应该标记勾号(绿色图标)。)