Keras VGG16修改的模型每次给出相同的预测

时间:2019-09-27 04:54:10

标签: python tensorflow keras deep-learning conv-neural-network

我采用了内置的keras.applications.vgg16.VGG16(weights ='imagenet',include_top = True,input_shape =(224,224,3))模型,并通过包含Global来转移了20类PASCAL VOC 2012数据集的学习平均池层,如下所示:

def VGG16_modified():
    base_model = vgg16.VGG16(include_top=True,weights='imagenet',input_shape=(224,224,3))
    print(base_model.summary())
    x = base_model.get_layer('block5_pool').output
    x = (GlobalAveragePooling2D())(x)
    predictions = Dense(20,activation='sigmoid')(x)

    final_model = Model(input = base_model.input, output = predictions)
    print(final_model.get_weights())
    return final_model

现在,我想获取基于this论文的课程激活图。为此,我的代码如下:

 def get_CAM(model,img):
        model = load_model(model)
        im = image.load_img(img,target_size=(224,224))
        im = image.img_to_array(im)
        im = np.expand_dims(im,axis=0)
        class_weights = model.layers[-1].get_weights()[0]
        final_conv_layer = model.get_layer('block5_pool')
        cam_model = Model(inputs = model.input,outputs=(final_conv_layer.output,model.layers[-1].output))
        conv_outputs, predictions = cam_model.predict(im)
        conv_outputs = np.squeeze(conv_outputs)
        prediction = np.argmax(predictions)
        print(predictions)
        print(prediction)
        print(conv_outputs)
        print(conv_outputs.shape)
        class_weights = class_weights[:,prediction]
        mat_for_mult = scipy.ndimage.zoom(conv_outputs,(32,32,1),order=1)
        final_output = np.dot(mat_for_mult.reshape((224*224, 512)),class_weights).reshape((224,224))
        print(final_output)
        return final_output

但是 cam_model.predict(im) 总是为所有图像提供相同的类。我不知道我在哪里错了。由于pascal voc 2012包含多个标签图像,因此我在modified_vgg16的最后一层中使用了“ sigmoid”,而不是“ softmax”。你能告诉我我哪里出问题了。

1 个答案:

答案 0 :(得分:0)

PASCAL VOC在类之间的图像分布不均衡。

数据集中的大多数图像都是针对人物的,这会导致数据分布不平衡,并导致对人物类别的偏见。

为了避免这种情况,您可以使用加权类的方法,这有助于消除类之间的不平衡性

有关如何为不平衡班级设置班级权重的更多信息,请参阅this