python - NotImplementedError:子类化 `Model` 类时,应实现 `call` 方法
问题描述
我正在使用keras解决这个图像分类问题。我正在尝试使用子类化API's
来做几乎所有事情。我创建了custom
如下所示的 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)
之后,我创建了Sequential
用于测试的简单模型,如下所示:
seq_model = keras.Sequential([
ConvBlock(64),
ConvBlock(128),
ConvBlock(64),
keras.layers.Flatten(),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(5, activation='softmax'),
], name="seq_model")
seq_model.build((None, 96, 96, 1))
seq_model.summary()
到目前为止一切都很好,如果我打电话,.compile()
并且.train()
它可以工作。当我尝试调用并使用我的 自定义和. 以下代码显示了我是如何创建它们的:.evaluate()
seq_model
.compile()
.train()
.evaluate()
.compile()
.train()
.evaluate()
class Model(keras.Model):
def __init__(self, model):
super().__init__()
self.model = model
# .compile()
def compile(self, loss, optimizer, metrics):
super().compile()
self.loss = loss
self.optimizer = optimizer
self.custom_metrics = metrics
# .fit()
def train_step(self, data):
x, y = data
with tf.GradientTape() as tape:
pred = self.model(x, training=True)
loss = self.loss(y, pred)
gradients = tape.gradient(loss, self.trainable_variables)
optimizer.apply_gradients(zip(gradients, self.trainable_variables))
self.custom_metrics.update_state(y, pred)
return {"loss": loss, "accuracy": self.custom_metrics.result()}
# .evaluate()
def test_step(self, data):
x, y = data
pred = self.model(x, training=False)
loss = self.loss(y, pred)
self.custom_metrics.update_state(y, pred)
return {"loss": loss, "accuracy": self.custom_metrics.result()}
我就是这样称呼它的。
yoga_model = Model(seq_model)
yoga_model.compile(
loss = keras.losses.CategoricalCrossentropy(from_logits=False),
optimizer = keras.optimizers.Adam(lr=0.001),
metrics = keras.metrics.CategoricalAccuracy(name="acc")
)
yoga_model.fit(train_ds, epochs=1, verbose=1)
请帮忙。帮助输入将不胜感激。
解决方案
在具有子类 API 的自定义模型中,实现call
方法如下:
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)
推荐阅读
- php - 为什么mySql无法启动?
- flutter - Flutter:CupertinoPicker 触发 List 内的函数
- android - AudioDeviceCallback 将连接的 WearOS 手表返回为 AudioDeviceInfo.TYPE_BLUETOOTH_SCO
- android - 我可以使用向后兼容来保存 Room prelollipop 版本中的数据 Unicode
- javascript - 在 JavaScript 中以原始顺序迭代 JSON 对象
- python - 如何通过重复值“另一列的大小”次来创建数组列?
- sql - PostgreSQL 源连接器中的 timestamp.column.name 是否支持别名?
- spring-boot - 在 Spring Batch 中,我们如何比较 2 个具有不同记录布局的平面文件并在它们之间存在不一致时抛出错误消息
- excel - 大型 Excel 文件需要更多时间来初始化 ClosedXML
- python - 根据间隔为 pandas 数据框列分配值