【问题标题】:Error when checking target: expected dense_20 to have shape (None, 3) but got array with shape (1200, 1)检查目标时出错:预期 dense_20 的形状为 (None, 3) 但得到的数组的形状为 (1200, 1)
【发布时间】:2017-10-22 16:12:50
【问题描述】:

通过使用 Keras 的 VGG 16,我正在尝试运行三类分类问题,代码如下:

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from keras.optimizers import SGD
from keras import backend as K
K.set_image_dim_ordering('tf')
img_width, img_height = 48, 48
top_model_weights_path = 'vgg16_1.h5'
train_data_dir = 'data6/train'
validation_data_dir = 'data6/validation'
nb_train_samples = 400
nb_validation_samples = 100
epochs = 10
batch_size = 32
def save_bottlebeck_features():
   datagen = ImageDataGenerator(rescale=1. / 255)
   model = applications.VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3))
   generator = datagen.flow_from_directory(
               train_data_dir,
               target_size=(img_width, img_height),
               batch_size=batch_size,
               class_mode='categorical',
               shuffle=False)
   bottleneck_features_train = model.predict_generator(
               generator, nb_train_samples // batch_size)
   np.save(open('bottleneck_features_train', 'wb'),bottleneck_features_train)

   generator = datagen.flow_from_directory(
               validation_data_dir,
               target_size=(img_width, img_height),
               batch_size=batch_size,
               class_mode='categorical',
               shuffle=False)
   bottleneck_features_validation = model.predict_generator(
               generator, nb_validation_samples // batch_size)
   np.save(open('bottleneck_features_validation', 'wb'),bottleneck_features_validation)

def train_top_model():
   train_data = np.load(open('bottleneck_features_train', 'rb'))
   train_labels = np.array(([0]*(nb_train_samples // 3) + [1]*(nb_train_samples // 3) + 
                            [2]*(nb_train_samples // 3)))
   validation_data = np.load(open('bottleneck_features_validation', 'rb'))
   validation_labels = np.array([0]*(nb_validation_samples // 3) + [1]*(nb_validation_samples // 3) + 
                                [2]*(nb_validation_samples // 3))
   model = Sequential()
   model.add(Flatten(input_shape=train_data.shape[1:]))
   model.add(Dense(128, activation='relu'))
   model.add(Dropout(0.5))
   model.add(Dense(3, activation='softmax'))
   sgd = SGD(lr=1e-2, decay=0.00371, momentum=0.9, nesterov=False)
   model.compile(optimizer=sgd,
         loss='categorical_crossentropy', metrics=['accuracy'])
   model.fit(train_data, train_labels,
          epochs=epochs,
          batch_size=batch_size,
   validation_data=(validation_data, validation_labels))
   model.save_weights(top_model_weights_path)

save_bottlebeck_features()
train_top_model()  

运行代码,我得到了错误:

检查目标时出错:预期 dense_20 具有形状 (None, 3) 但得到了 形状为 (1200, 1) 的数组

请告诉我我必须对代码进行哪些更改才能使其正常运行。我正在使用带有 Python 3.5.2 的 Anaconda,在 Windows 机器上运行。

【问题讨论】:

    标签: python keras multiclass-classification


    【解决方案1】:

    你的训练输出形状像 (None, 1) --- 或者 (1200, 1),其中有 1200 个样本,所有样本只有一个维度(每个样本都是一个数字)

    但是您的模型以Dense(3) 结尾,它将输出诸如 (None, 3) 之类的内容。即:每个样本有3个数字。

    如果您认为自己的训练数据正确,则必须调整模型。

    建议再添加一个Dense(1) 层。如果结果介于 0 和 1 之间,则使用“sigmoid”激活,如果结果介于 -1 和 1 之间,则使用“tanh”。

    始终使用model.summary() 检查您的模型的尺寸。

    【讨论】:

    • 非常感谢您提供的信息丰富的回复。顺便说一句,我找到了问题的解决方案。我忘记根据使用 keras 的多类分类的要求对标签进行分类。我所做的只是使用“to_categorical”作为训练和验证标签,它适用于我们拥有的任意数量的类。
    猜你喜欢
    • 2020-08-09
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2018-10-24
    • 2019-01-10
    相关资源
    最近更新 更多