Как вычислить Grad-CAM на подклассе модели TensorFlow/Keras с настраиваемыми слоями?Python

Программы на Python
Ответить
Anonymous
 Как вычислить Grad-CAM на подклассе модели TensorFlow/Keras с настраиваемыми слоями?

Сообщение Anonymous »

Я пытаюсь вычислить Grad-CAM для модели TensorFlow/Keras, созданной подклассом, которая имеет два декодера и несколько пользовательских слоев: Resampler, Upsampler2D и SkipModule. Модель структурирована примерно как U-Net:

Код: Выделить всё

# Example of encoder flow in call()
x1 = self.EncoderModule_1(inputs)   # 32 channels
x1p = self.pool1(x1)
x2 = self.EncoderModule_2(x1p)      # 64 channels
x2p = self.pool2(x2)
x3 = self.EncoderModule_3(x2p)      # 128 channels
...
x5 = self.EncoderModule_5(x4)       # 512 channels
С пропуском соединений.
Модель возвращает словарь:

Код: Выделить всё

# Output of decoder 1
bone_mask = self.conv_1(x_decoder_4)

bone_mask = self.sigmoid_1(bone_mask)

# Output of decoder 2
lesion_mask = self.conv_2(x_decoder_8)

lesion_mask = self.sigmoid_2(lesion_mask)

return {'bone_mask': bone_mask, 'lesion_mask': lesion_mask}
Я хочу вычислить Grad-CAM для вывода очага поражения, используя последний модуль кодера (

Код: Выделить всё

Encoder_Module_5
) и захватывать промежуточные функции из кодера и пропускать соединения.
Я попробовал несколько подходов для извлечения последнего слоя кодера и создания отдельной модели кодера для Grad-CAM, но постоянно сталкивался с такими ошибками, как:

Код: Выделить всё

ValueError: Input 0 of layer "conv2d_105" is incompatible with the layer:
expected axis 1 of input shape to have value 32, but received input with shape (1, 3, 256, 256)
или

Код: Выделить всё

ValueError: Attempt to convert a value (None) with an unsupported type () to a Tensor.
Основная проблема, по-видимому, заключается в том, что модель разделена на подклассы, и пользовательские слои не могут вызываться индивидуально за пределами исходного прямого прохода.
Я попробовал следующее:
  • Построение модели последовательного кодировщика:

Код: Выделить всё

encoder_input = tf.keras.Input(shape=(3,256,256))
x = model.EncoderModule_1(encoder_input)
x = model.pool1(x)
x = model.EncoderModule_2(x)
...
encoder_model = tf.keras.Model(inputs=encoder_input, outputs=x)
  • Использование средства извлечения объектов для упаковки слоев модели:

Код: Выделить всё

class FeatureExtractor(tf.keras.Model):
def call(self, x):
y = x
for layer in model.layers:
y = layer(y)
if layer.name == "Encoder_Module_5":
encoder_out = y
outputs = model(x)
return {"encoder": encoder_out, **outputs}
Оба подхода не увенчались успехом.
Примечание. Входные данные имеют форму (3,256,256) (изображение RGB).
Как я могу правильно вычислить Grad-CAM на модели подкласса с пользовательскими слоями, захватив выходные данные промежуточного кодировщика и пропустив соединения, не нарушая прямой проход?
Я хочу сохранить структуру подкласса и не переписывать модель как чистую Последовательная или функциональная модель.
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... stom-layer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»