【问题标题】:Issue in removing layer from a pretrained model从预训练模型中删除层的问题
【发布时间】:2021-03-12 12:03:39
【问题描述】:

我有以下代码,我需要删除模型的一些层并执行预测。但目前我正在检索错误。

 from tensorflow.keras.applications.resnet50 import ResNet50
 from tensorflow.keras.preprocessing import image
 from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
 import numpy as np
 from keras.models import Model
 from tensorflow.python.keras.optimizers import SGD


 base_model = ResNet50(include_top=False, weights='imagenet')
 model= Model(inputs=base_model.input, outputs=base_model .layers[-2].output)
 #model = Model(inputs=base_model.input, outputs=predictions)
 #Compiling the model
 model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics = 
 ['accuracy'])
 img_path = 'elephant.jpg'
 img = image.load_img(img_path, target_size=(224, 224))
 x = image.img_to_array(img)
 x = np.expand_dims(x, axis=0)
 x = preprocess_input(x)
 preds = model.predict(x)
 #decode the results into a list of tuples (class, description, probability)
 #(one such list for each sample in the batch)
 print('Predicted:', decode_predictions(preds, top=3)[0])

错误

File "C:/Users/learn/remove_layer.py", line 9, in <module>
model= Model(inputs=base_model.input, outputs=base_model .layers[-2].output)
AttributeError: 'Tensor' object has no attribute '_keras_shape'

由于我对 Keras 的初学者知识,我理解的是形状问题。由于它是一个 resnet 模型,如果我将一个层从一个合并删除到另一个合并层,因为合并层没有维度问题,我该如何完成呢?

【问题讨论】:

  • 在您的导入中,您正在混合 tf.keras 和 keras,这不是一个好主意。

标签: tensorflow machine-learning keras tf.keras


【解决方案1】:

你实际上需要可视化你所做的事情,所以让我们对 ResNet50 模型的最后几层做一点总结:

base_model.summary()

conv5_block3_2_relu (Activation (None, None, None, 5 0           conv5_block3_2_bn[0][0]          
__________________________________________________________________________________________________
conv5_block3_3_conv (Conv2D)    (None, None, None, 2 1050624     conv5_block3_2_relu[0][0]        
__________________________________________________________________________________________________
conv5_block3_3_bn (BatchNormali (None, None, None, 2 8192        conv5_block3_3_conv[0][0]        
__________________________________________________________________________________________________
conv5_block3_add (Add)          (None, None, None, 2 0           conv5_block2_out[0][0]           
                                                                 conv5_block3_3_bn[0][0]          
__________________________________________________________________________________________________
conv5_block3_out (Activation)   (None, None, None, 2 0           conv5_block3_add[0][0]           
==================================================================================================
Total params: 23,587,712
Trainable params: 23,534,592
Non-trainable params: 53,120
_____________________________

现在是移除最后一层后的模型

model.summary()

conv5_block3_2_relu (Activation (None, None, None, 5 0           conv5_block3_2_bn[0][0]          
__________________________________________________________________________________________________
conv5_block3_3_conv (Conv2D)    (None, None, None, 2 1050624     conv5_block3_2_relu[0][0]        
__________________________________________________________________________________________________
conv5_block3_3_bn (BatchNormali (None, None, None, 2 8192        conv5_block3_3_conv[0][0]        
__________________________________________________________________________________________________
conv5_block3_add (Add)          (None, None, None, 2 0           conv5_block2_out[0][0]           
                                                                 conv5_block3_3_bn[0][0]          
==================================================================================================
Total params: 23,587,712
Trainable params: 23,534,592
Non-trainable params: 53,120

keras 输出中的 Reset50 是最后一个 Conv2D 块之后的所有特征图,它不关心模型的分类部分,您实际上所做的是在最后一个添加块之后删除了最后一个激活层

所以你需要检查更多你想删除哪个块层并为分类部分添加扁平和完全连接的层

正如史努比博士所说,不要在 keras 和 tensorflow.keras 之间混合导入

# this part

from tensorflow.keras.models import Model

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2018-12-11
    • 2017-07-07
    • 2021-08-18
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多