Создание тепловой карты для vgg16 с настраиваемыми верхними слоями в Keras

Как сказано в названии, я создал простую двухклассную CNN с предварительно обученными весами VGG16 imagenet в качестве нижних слоев, все это с использованием Python с Keras. Сейчас я пытаюсь визуализировать процесс выбора функций с помощью генерации тепловой карты, но решения, которые, как мне кажется, я могу реализовать, разработаны для обычной модели из 1000 классов. Что мне делать, чтобы все заработало?

РЕДАКТИРОВАТЬ: Я включаю некоторые фрагменты кода, которые, на мой взгляд, могут иметь отношение:

#Loading vgc16 model
vgg16 = applications.VGG16(include_top=False, weights='imagenet')
#vgg16.summary()
start = datetime.datetime.now()
model = Sequential()  
model.add(Flatten(input_shape=train_data.shape[1:]))  
model.add(Dense(100))
model.add(LeakyReLU(alpha=0.03))
model.add(Dropout(0.5))  
model.add(Dense(50))
model.add(LeakyReLU(alpha=0.03))
model.add(Dropout(0.3)) 
model.add(Dense(num_classes, activation='softmax')) 

А ниже - обучающая часть, в которой используются нижние слои vgg16 для создания файлов функций из трех наборов данных:

model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])  

history = model.fit(train_data, train_labels,  
      epochs=7,
      batch_size=batch_size,  
      validation_data=(validation_data, validation_labels))  

model.save(top_model_weights_path)  

(eval_loss, eval_accuracy) = model.evaluate(  
 validation_data, validation_labels, batch_size=batch_size, verbose=1)

person D. Sanz    schedule 13.05.2020    source источник
comment
всегда делитесь воспроизводимым примером кода.   -  person Zabir Al Nazi    schedule 13.05.2020
comment
Я добавил два фрагмента кода, который я воспроизвел для этой попытки, надеюсь, они важны, чтобы помочь ответить на мой вопрос.   -  person D. Sanz    schedule 15.05.2020


Ответы (1)


Вы можете использовать keras_vis для визуализации карт функций.

import numpy as np
import matplotlib.cm as cm
from vis.visualization import visualize_cam

for modifier in [None, 'guided', 'relu']:
    plt.figure()
    f, ax = plt.subplots(1, 2)
    plt.suptitle("vanilla" if modifier is None else modifier)
    for i, img in enumerate([img1, img2]):    
        # 20 is the imagenet index corresponding to `ouzel`
        grads = visualize_cam(model, layer_idx, filter_indices=20, 
                              seed_input=img, backprop_modifier=modifier)        
        # Lets overlay the heatmap onto original image.    
        jet_heatmap = np.uint8(cm.jet(grads)[..., :3] * 255)
        ax[i].imshow(overlay(jet_heatmap, img))

Вы можете найти примеры: https://github.com/raghakot/keras-vis/blob/master/examples/vggnet/attention.ipynb.

person Zabir Al Nazi    schedule 15.05.2020
comment
Мне не удалось заставить его работать с нестандартной моделью. Это разработано для vgg16, и я не могу понять это правильно. Кроме того, вместо этого я использую tf-keras-vis - person D. Sanz; 20.05.2020