检查目标时出错:期望dense_20有形状(None,3)但是有形状的数组(1200,1)

时间:2017-05-22 21:29:00

标签: python keras multiclass-classification

使用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)

请让我知道我必须对代码进行哪些更改才能使其正常运行。我正在使用Anaconda和Python 3.5.2,在Windows机器上运行。

1 个答案:

答案 0 :(得分:2)

您的训练输出形状类似于(无,1)---或(1200,1),其中有1200个样本,所有样本只有一个维度(每个样本都是数字)

但是你的模型以Dense(3)结束,它会输出像(None,3)这样的东西。即:每个样本有3个数字。

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

建议是再添加一个Dense(1)图层。使用" sigmoid"如果结果介于0和1之间,则激活,或者#34; tanh"如果结果在-1和1之间。

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