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