深度学习 Vgg16 为啥我的模型不适合?

Posted

技术标签:

【中文标题】深度学习 Vgg16 为啥我的模型不适合?【英文标题】:Deep learning Vgg16 why is my model not fitting?深度学习 Vgg16 为什么我的模型不适合? 【发布时间】:2020-11-22 06:49:43 【问题描述】:

我正在学习深度学习。我尝试迁移学习,因为我使用 vgg16 模型。但是,我面对error: Shapes (None, 1) and (None, 2) are incompatible。不知道为什么不兼容。帮我。 抱歉,我英语说得不好。但我想知道为什么会出错。 我的代码。 我已经知道如果我使用sigmod(activation) 我可以对数据进行分类。但我想分类三个或更多(狗、猫、马、老鼠.....),所以我使用softmax。帮帮我。

ValueError: Shapes (None, 1) and (None, 2) are incompatible

问题出在哪里?

    def save_bottlebeck_features():
    datagen = ImageDataGenerator(rescale=1. / 255)

    # build the VGG16 network
    model = applications.VGG16(include_top=False, weights='imagenet')

    generator = datagen.flow_from_directory(
        train_data_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=False)

    bottleneck_features_train = model.predict_generator(
        generator)
    np.save('bottleneck_features_train.npy',bottleneck_features_train)

    generator = datagen.flow_from_directory(
        validation_data_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=False)

    bottleneck_features_validation = model.predict_generator(
        generator)
  

    np.save('bottleneck_features_validation.npy',bottleneck_features_validation)
 

    def train_top_model():
    train_data = np.load('bottleneck_features_train.npy') 
    train_labels = np.array(
        [0] * 682 + [1] * 403) # dog: 682 cat : 403

    validation_data = np.load('bottleneck_features_validation.npy')
    validation_labels = np.array(
        [0] * 63 + [1] * 70 )

    model = Sequential()
    model.add(Flatten(input_shape=train_data.shape[1:]))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(2, activation='softmax'))
    model.summary()

    model.compile(optimizer='adam',
                  loss='categorical_crossentropy', metrics=['accuracy'])

    model.fit(train_data, train_labels,
              epochs=epochs,
              steps_per_epoch=1000 // batch_size,
              validation_data=(validation_data, validation_labels))
    model.save_weights(top_model_weights_path)

【问题讨论】:

【参考方案1】:

您的问题是您以 [0] 和 [1] 的形式创建了基本事实。

但是,您使用的损失函数是 categorical_crossentropy,在这种情况下,它期望您的输入目标是二维数组(n 类 => n 维),而不是一维数组。

实际上,如果图片属于猫,您的网络期望 [0,1] 作为基本事实,如果图片是狗,则期望 [1,0]。

但是,您只喂它 [0] 和 [1] 而不是 [0,1] 或 [1,0]。

您的问题的解决方案是:

    将您的真实标签转换为 [0,1] 和 [1,0](提示:如果您使用普通 keras,请使用 tf.keras.utils.to_categorical()keras.utils.to_categorical()。 使用sparse_categorical_crossentropy 作为损失函数,它允许您使用普通整数,例如0,1,2,3 作为标签。

【讨论】:

以上是关于深度学习 Vgg16 为啥我的模型不适合?的主要内容,如果未能解决你的问题,请参考以下文章

为啥预训练的深度学习模型的性能会下降?

深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天

深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天

Keras深度学习实战——基于VGG19模型实现性别分类

caffe和vgg-16和googlenet的区别

「深度学习一遍过」必修21:基于Vgg16Net的MNIST手写数字识别