【问题标题】:CNN Visualization of output layers with pre-trained model带有预训练模型的输出层的 CNN 可视化
【发布时间】:2020-11-24 10:40:28
【问题描述】:

我训练了我的模型并保存了它:

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]

知道如何修复它,或者使用预训练模型从隐藏层获取输出的其他可行解决方案吗?

谢谢,

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    好的,我找到了一个方便的解决方案。

    确实,我认为这个问题的发生是因为我的顺序模型本身是由另一个模型(resnet)组成的。

    由于我没有在预训练的 resnet 模型上添加很多层,我只是决定将 resnet 模型中的特征图可视化

    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)
    

    然后您可以使用 activations 变量轻松显示要素图。

    请注意,由于您有 resnet 模型的输出,因此可以通过重复该过程从顶层获取特征图。使用 resnet 的输出作为输入并从 layer_outputs 中删除 resnet 模型。(我没有尝试过,无法工作)

    希望它可以帮助某人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多