CNN Визуализация выходных слоев с предварительно обученной моделью - PullRequest
2 голосов
/ 04 августа 2020

Я обучил свою модель и сохранил ее:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array

new_model=tf.keras.models.load_model('the_model.h5')
new_model.summary()

img = load_img('e.jpg',target_size=(227,227))
img=img_to_array(img)

img = np.expand_dims(img,axis=0)
img=img/255.
print(img.shape)
#prints out (1,227,227,3) the expected shapes
 

так что архитектура моей модели следующая, я использую предварительно обученный resnet50

backbone = ResNet50(input_shape=(227,227,3),weights='imagenet', include_top=False)
    model = Sequential()
    model.add(backbone)
    model.add(GlobalAveragePooling2D())
    model.add(Dropout(0.5))
    model.add(Dense(64,activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1,activation='sigmoid'))

я пробовал визуализировать выходы скрытых слоев, однако с keras или keract я не могу получить выходы

с keras:

layer_outputs=[]
for layer in new_model.layers:
    if layer.name=='resnet50':
        temp = [l.output for l in layer.layers]
        layer_outputs=temp
    else:
        layer_outputs.append(layer.output)
    

activation_model = Model(inputs=new_model.input,  outputs=layer_outputs)

ошибка, вызванная последней строкой:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(None, 227, 227, 3), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []

мне кажется, что входные данные моей модели совпадают с layer_outputs , поэтому я действительно не понимаю ошибку, когда я проверяю:

print(new_model.layers[0].input)
#prints out    :Tensor("input_1:0", shape=(None, 227, 227, 3), dtype=float32)

print(layer_outputs[0])
#prints out :  Tensor("input_1:0", shape=(None, 227, 227, 3), dtype=float32)

при использовании keract:

a = keract.get_activations(new_model, img)  # with just one sample.
keract.display_activations(a, directory='f', save=True)

tensorflow.python.framework.errors_impl.InvalidArgumentError:  You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,227,227,3]

Есть идеи, как я могу это исправить, или другое жизнеспособное решение для получения выходных данных из скрытых слоев с использованием предварительно обученной модели?

Спасибо,

1 Ответ

0 голосов
/ 05 августа 2020

Хорошо, я нашел удобное решение своей проблемы.

На самом деле, я думаю, что эта проблема возникает, потому что моя последовательная модель сама состоит из другой модели (re snet).

Поскольку я не добавлял много слоев поверх предварительно обученной модели re snet, я просто решил визуализировать карты функций из модели re snet

img = load_img('e.jpg',target_size=(227,227))
img=img_to_array(img)

img = np.expand_dims(img,axis=0)
img=img/255.
print(img.shape)



loaded=tf.keras.models.load_model('age_gender_train.h5')


layer_outputs=[ layer.output for layer in loaded.layers[0].layers]
res = loaded.layers[0]

activation_model = Model(inputs=res.input, outputs=layer_outputs)
activations=activation_model.predict(img)
img = np.squeeze(img,axis=0)

Тогда вы можете легко отобразить карты функций с использованием активаций переменной.

Обратите внимание, что, поскольку у вас есть выходные данные модели re snet, возможно, будет возможно получить карты функций из слоев наверху повторяя процесс. Использование вывода re snet в качестве входных и удаление модели re snet из layer_outputs . (Я не пробовал это, не сработало)

Надеюсь на это может кому-то помочь

...