I am a beginner to image classification and apologies beforehand if the question I am asking is dumb. I am currently using the following model:
baseModel = VGG16(weights="imagenet", include_top=False,
input_tensor=Input(shape=(224, 224, 3)))
# construct the head of the model that will be placed on top of the base model
headModel = baseModel.output
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(64, activation=tf.nn.leaky_relu)(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)
For this model, I am doing a binary image classification. The model is compiled as such:
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt,
metrics=["accuracy"])
This model will give a 100% for both the training and validation accuracy. I wanted to understand how the model is activated for certain images. So I tried to calculating the heatmap. However in one of the calculations we have:
def compute_heatmap(self, image, eps=1e-8):
gradModel = Model(
inputs=[self.model.inputs],
outputs=[self.model.get_layer(self.layerName).output,
self.model.output])
with tf.GradientTape() as tape:
inputs = tf.cast(image, tf.float32)
(convOutputs, predictions) = gradModel(inputs)
loss = predictions[:, self.classIdx]
grads = tape.gradient(loss, convOutputs)
The gradient is calculated from the loss which is roughly zero since the accuracy is 100%. This will result in a bank/flat heatmap.
When this happens, how should I deal with class activation mapping?
Sorry for the long post and any help will be appreciated!