检查目标时出错:预期softmax有形状(1100,)

时间:2018-02-28 06:50:09

标签: keras

我试图在2个类的某些数据上创建模型,但我一直收到错误说:

ValueError: Error when checking target: expected softmax to have shape (1100,) but got array with shape (2,)

我知道这是一个相当common error,但我似乎无法解决我的问题。我相信错误表明模型的输出形状为(1100,),但输出的维度为(2,)。任何人都知道如何修复它?

这是我的模特:

def TestModel(nb_classes=2, inputs=(3, 224, 224)):
    input_img = Input(shape=inputs)
    conv1 = Convolution2D(
        96, 7, 7, activation='relu', init='glorot_uniform',
        subsample=(2, 2), border_mode='same', name='conv1')(input_img)
    maxpool1 = MaxPooling2D(
        pool_size=(3, 3), strides=(2, 2), name='maxpool1', dim_ordering="th")(conv1)

    fire2_squeeze = Convolution2D(
        16, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire2_squeeze')(maxpool1)
    fire2_expand1 = Convolution2D(
        64, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire2_expand1')(fire2_squeeze)
    fire2_expand2 = Convolution2D(
        64, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire2_expand2')(fire2_squeeze)
    merge2 = merge(
        [fire2_expand1, fire2_expand2], mode='concat', concat_axis=1)

    fire3_squeeze = Convolution2D(
        16, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire3_squeeze')(merge2)
    fire3_expand1 = Convolution2D(
        64, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire3_expand1')(fire3_squeeze)
    fire3_expand2 = Convolution2D(
        64, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire3_expand2')(fire3_squeeze)
    merge3 = merge(
        [fire3_expand1, fire3_expand2], mode='concat', concat_axis=1)

    fire4_squeeze = Convolution2D(
        32, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire4_squeeze')(merge3)
    fire4_expand1 = Convolution2D(
        128, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire4_expand1')(fire4_squeeze)
    fire4_expand2 = Convolution2D(
        128, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire4_expand2')(fire4_squeeze)
    merge4 = merge(
        [fire4_expand1, fire4_expand2], mode='concat', concat_axis=1)
    maxpool4 = MaxPooling2D(
        pool_size=(3, 3), strides=(2, 2), name='maxpool4')(merge4)

    fire5_squeeze = Convolution2D(
        32, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire5_squeeze')(maxpool4)
    fire5_expand1 = Convolution2D(
        128, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire5_expand1')(fire5_squeeze)
    fire5_expand2 = Convolution2D(
        128, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire5_expand2')(fire5_squeeze)
    merge5 = merge(
        [fire5_expand1, fire5_expand2], mode='concat', concat_axis=1)

    fire6_squeeze = Convolution2D(
        48, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire6_squeeze')(merge5)
    fire6_expand1 = Convolution2D(
        192, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire6_expand1')(fire6_squeeze)
    fire6_expand2 = Convolution2D(
        192, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire6_expand2')(fire6_squeeze)
    merge6 = merge(
        [fire6_expand1, fire6_expand2], mode='concat', concat_axis=1)

    fire7_squeeze = Convolution2D(
        48, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire7_squeeze')(merge6)
    fire7_expand1 = Convolution2D(
        192, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire7_expand1')(fire7_squeeze)
    fire7_expand2 = Convolution2D(
        192, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire7_expand2')(fire7_squeeze)
    merge7 = merge(
        [fire7_expand1, fire7_expand2], mode='concat', concat_axis=1)

    fire8_squeeze = Convolution2D(
        64, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire8_squeeze')(merge7)
    fire8_expand1 = Convolution2D(
        256, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire8_expand1')(fire8_squeeze)
    fire8_expand2 = Convolution2D(
        256, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire8_expand2')(fire8_squeeze)
    merge8 = merge(
        [fire8_expand1, fire8_expand2], mode='concat', concat_axis=1)

    maxpool8 = MaxPooling2D(
        pool_size=(3, 3), strides=(2, 2), name='maxpool8')(merge8)

    fire9_squeeze = Convolution2D(
        64, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire9_squeeze')(maxpool8)
    fire9_expand1 = Convolution2D(
        256, 1, 1, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire9_expand1')(fire9_squeeze)
    fire9_expand2 = Convolution2D(
        256, 3, 3, activation='relu', init='glorot_uniform',
        border_mode='same', name='fire9_expand2')(fire9_squeeze)
    merge9 = merge(
        [fire9_expand1, fire9_expand2], mode='concat', concat_axis=1)

    fire9_dropout = Dropout(0.5, name='fire9_dropout')(merge9)

    conv10 = Convolution2D(
        nb_classes, 1, 1, init='glorot_uniform',
        border_mode='valid', name='conv10')(fire9_dropout)
    # The size should match the output of conv10
    avgpool10 = AveragePooling2D((13, 13), name='avgpool10')(conv10)

    flatten = Flatten(name='flatten')(avgpool10)
    softmax = Activation("softmax", name='softmax')(flatten)

    return Model(input=input_img, output=softmax)

这是创建模型的代码:

def main():
    np.random.seed(45)
    nb_class = 2
    width, height = 224, 224

    sn = model.TestModel(nb_classes=nb_class, inputs=(height, width, 3))    

    print('Build model')

    sgd = SGD(lr=0.001, decay=0.0002, momentum=0.9, nesterov=True)
    sn.compile(
        optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

    print(sn.summary())

    # Training
    train_data_dir = 'data/train'
    validation_data_dir = 'data/validation'
    nb_train_samples = 2000
    nb_validation_samples = 800
    nb_epoch = 500

    #   Generator
    train_datagen = ImageDataGenerator(
            rescale=1./255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)
    #train_datagen = ImageDataGenerator(rescale=1./255)

    test_datagen = ImageDataGenerator(rescale=1./255)

    train_generator = train_datagen.flow_from_directory(
            train_data_dir,
            target_size=(width, height),
            batch_size=32,
            class_mode='categorical')

    validation_generator = test_datagen.flow_from_directory(
            validation_data_dir,
            target_size=(width, height),
            batch_size=32,
            class_mode='categorical')

    # Instantiate AccLossPlotter to visualise training
    plotter = AccLossPlotter(graphs=['acc', 'loss'], save_graph=True)
    early_stopping = EarlyStopping(monitor='val_loss', patience=3, verbose=0)
    checkpoint = ModelCheckpoint(                                         
                    'weights.{epoch:02d}-{val_loss:.2f}.h5',
                    monitor='val_loss',                               
                    verbose=0,                                        
                    save_best_only=True,                              
                    save_weights_only=True,                           
                    mode='min',                                       
                    period=1)                                         

    sn.fit_generator(
            train_generator,
            samples_per_epoch=nb_train_samples,
            nb_epoch=nb_epoch,
            validation_data=validation_generator,
            nb_val_samples=nb_validation_samples, 
            callbacks=[plotter, checkpoint])

    sn.save_weights('weights.h5')

此处summary()

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_1 (InputLayer)             (None, 224, 224, 3)   0
____________________________________________________________________________________________________
conv1 (Convolution2D)            (None, 112, 112, 96)  14208       input_1[0][0]
____________________________________________________________________________________________________
maxpool1 (MaxPooling2D)          (None, 112, 55, 47)   0           conv1[0][0]
____________________________________________________________________________________________________
fire2_squeeze (Convolution2D)    (None, 112, 55, 16)   768         maxpool1[0][0]
____________________________________________________________________________________________________
fire2_expand1 (Convolution2D)    (None, 112, 55, 64)   1088        fire2_squeeze[0][0]
____________________________________________________________________________________________________
fire2_expand2 (Convolution2D)    (None, 112, 55, 64)   9280        fire2_squeeze[0][0]
____________________________________________________________________________________________________
merge_1 (Merge)                  (None, 224, 55, 64)   0           fire2_expand1[0][0]
                                                                   fire2_expand2[0][0]
____________________________________________________________________________________________________
fire3_squeeze (Convolution2D)    (None, 224, 55, 16)   1040        merge_1[0][0]
____________________________________________________________________________________________________
fire3_expand1 (Convolution2D)    (None, 224, 55, 64)   1088        fire3_squeeze[0][0]
____________________________________________________________________________________________________
fire3_expand2 (Convolution2D)    (None, 224, 55, 64)   9280        fire3_squeeze[0][0]
____________________________________________________________________________________________________
merge_2 (Merge)                  (None, 448, 55, 64)   0           fire3_expand1[0][0]
                                                                   fire3_expand2[0][0]
____________________________________________________________________________________________________
fire4_squeeze (Convolution2D)    (None, 448, 55, 32)   2080        merge_2[0][0]
____________________________________________________________________________________________________
fire4_expand1 (Convolution2D)    (None, 448, 55, 128)  4224        fire4_squeeze[0][0]
____________________________________________________________________________________________________
fire4_expand2 (Convolution2D)    (None, 448, 55, 128)  36992       fire4_squeeze[0][0]
____________________________________________________________________________________________________
merge_3 (Merge)                  (None, 896, 55, 128)  0           fire4_expand1[0][0]
                                                                   fire4_expand2[0][0]
____________________________________________________________________________________________________
maxpool4 (MaxPooling2D)          (None, 447, 27, 128)  0           merge_3[0][0]
____________________________________________________________________________________________________
fire5_squeeze (Convolution2D)    (None, 447, 27, 32)   4128        maxpool4[0][0]
____________________________________________________________________________________________________
fire5_expand1 (Convolution2D)    (None, 447, 27, 128)  4224        fire5_squeeze[0][0]
____________________________________________________________________________________________________
fire5_expand2 (Convolution2D)    (None, 447, 27, 128)  36992       fire5_squeeze[0][0]
____________________________________________________________________________________________________
merge_4 (Merge)                  (None, 894, 27, 128)  0           fire5_expand1[0][0]
                                                                   fire5_expand2[0][0]
____________________________________________________________________________________________________
fire6_squeeze (Convolution2D)    (None, 894, 27, 48)   6192        merge_4[0][0]
____________________________________________________________________________________________________
fire6_expand1 (Convolution2D)    (None, 894, 27, 192)  9408        fire6_squeeze[0][0]
____________________________________________________________________________________________________
fire6_expand2 (Convolution2D)    (None, 894, 27, 192)  83136       fire6_squeeze[0][0]
____________________________________________________________________________________________________
merge_5 (Merge)                  (None, 1788, 27, 192) 0           fire6_expand1[0][0]
                                                                   fire6_expand2[0][0]
____________________________________________________________________________________________________
fire7_squeeze (Convolution2D)    (None, 1788, 27, 48)  9264        merge_5[0][0]
____________________________________________________________________________________________________
fire7_expand1 (Convolution2D)    (None, 1788, 27, 192) 9408        fire7_squeeze[0][0]
____________________________________________________________________________________________________
fire7_expand2 (Convolution2D)    (None, 1788, 27, 192) 83136       fire7_squeeze[0][0]
____________________________________________________________________________________________________
merge_6 (Merge)                  (None, 3576, 27, 192) 0           fire7_expand1[0][0]
                                                                   fire7_expand2[0][0]
____________________________________________________________________________________________________
fire8_squeeze (Convolution2D)    (None, 3576, 27, 64)  12352       merge_6[0][0]
____________________________________________________________________________________________________
fire8_expand1 (Convolution2D)    (None, 3576, 27, 256) 16640       fire8_squeeze[0][0]
____________________________________________________________________________________________________
fire8_expand2 (Convolution2D)    (None, 3576, 27, 256) 147712      fire8_squeeze[0][0]
____________________________________________________________________________________________________
merge_7 (Merge)                  (None, 7152, 27, 256) 0           fire8_expand1[0][0]
                                                                   fire8_expand2[0][0]
____________________________________________________________________________________________________
maxpool8 (MaxPooling2D)          (None, 3575, 13, 256) 0           merge_7[0][0]
____________________________________________________________________________________________________
fire9_squeeze (Convolution2D)    (None, 3575, 13, 64)  16448       maxpool8[0][0]
____________________________________________________________________________________________________
fire9_expand1 (Convolution2D)    (None, 3575, 13, 256) 16640       fire9_squeeze[0][0]
____________________________________________________________________________________________________
fire9_expand2 (Convolution2D)    (None, 3575, 13, 256) 147712      fire9_squeeze[0][0]
____________________________________________________________________________________________________
merge_8 (Merge)                  (None, 7150, 13, 256) 0           fire9_expand1[0][0]
                                                                   fire9_expand2[0][0]
____________________________________________________________________________________________________
fire9_dropout (Dropout)          (None, 7150, 13, 256) 0           merge_8[0][0]
____________________________________________________________________________________________________
conv10 (Convolution2D)           (None, 7150, 13, 2)   514         fire9_dropout[0][0]
____________________________________________________________________________________________________
avgpool10 (AveragePooling2D)     (None, 550, 1, 2)     0           conv10[0][0]
____________________________________________________________________________________________________
flatten (Flatten)                (None, 1100)          0           avgpool10[0][0]
____________________________________________________________________________________________________
softmax (Activation)             (None, 1100)          0           flatten[0][0]
====================================================================================================
Total params: 683,954
Trainable params: 683,954
Non-trainable params: 0
____________________________________________________________________________________________________
None
Found 22778 images belonging to 2 classes.
Found 2222 images belonging to 2 classes.
Epoch 1/500

任何想法都赞赏。

1 个答案:

答案 0 :(得分:1)

您不应该使用AveragePooling2D,而是GlobalAveragePooling2D,这会将空间维度减少到1,从而使Flatten工作并产生(None, 2)的输出。