从预训练模型中删除层的问题

时间:2021-03-12 12:03:39

标签: tensorflow machine-learning keras tf.keras

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

 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 模型,如果我从一个合并层中删除一个层到另一个合并层,因为合并层没有维度问题,我该如何实现?

1 个答案:

答案 0 :(得分: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 块之后的所有特征图,它不关心模型的分类部分,您实际上所做的是在最后一个添加块之后删除了最后一个激活层

enter image description here

因此,您需要更多地检查要删除的块层,并为分类部分添加扁平和完全连接的层

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

# this part

from tensorflow.keras.models import Model