【发布时间】:2021-06-09 08:20:35
【问题描述】:
我通过 TensorFlow 2 中的模型子类化构建了以下模型:
from tensorflow.keras import Model, Input
from tensorflow.keras.applications import DenseNet201
from tensorflow.keras.applications.densenet import preprocess_input
from tensorflow.keras.layers import Flatten, Dense
class Detector(Model):
def __init__(self, num_classes=3, name="DenseNet201"):
super(Detector, self).__init__(name=name)
self.feature_extractor = DenseNet201(
include_top=False,
weights="imagenet",
)
self.feature_extractor.trainable = False
self.flatten_layer = Flatten()
self.prediction_layer = Dense(num_classes, activation=None)
def call(self, inputs):
x = preprocess_input(inputs)
extracted_feature = self.feature_extractor(x, training=False)
x = self.flatten_layer(extracted_feature)
y_hat = self.prediction_layer(x)
return extracted_feature, y_hat
后续步骤是编译和拟合模型。模型编译正常,但是在拟合我的图像生成器(从ImageDataGenerator 构建)时,我遇到了错误:InvalidArgumentError: Incompatible shapes: [64,18,18] vs. [64,1] [[node Equal (defined at :19) ]] [Op:__inference_train_function_32187] 函数调用堆栈:train_function –。
history = detector.fit(
train_generator,
epochs=1,
validation_data=val_generator,
callbacks=callbacks
)
这很明显,因为 TensorFlow 不知道预测是 y_hat 还是 extracted_featureduring detector.fit(),因此抛出了错误。那么,对于我的情况,detector.fit 的正确实现是什么?
【问题讨论】:
-
为什么要从模型中返回
extracted_feature?生成器输出的形状必须与模型输入和目标(即调用方法的输出)匹配。 -
就像我说的,在训练的时候,你正常训练模型,这意味着输出应该是唯一的 x。但在推理时,我们可以修改多个输出。
-
@Pedro Marques 我想绘制 GradCAM,因此访问提取的特征对于可视化至关重要。
-
@M.Innat 如果我没有在调用方法中返回提取特征。如何在推理阶段访问它?
标签: tensorflow keras computer-vision tensorflow2.0 tf.keras