首页 > 解决方案 > keras中的尺寸不匹配

问题描述

我试图对我的数据集进行 10 折交叉验证。我在训练之前对数据进行了重构,如下所示

data = data.reshape(500,1,1028,1)
data_y = np_utils.to_categorical(data_y, 3)

在此之后我描述了我的模型

   for train,test in kf.split(data):
    fold+=1
    print("Fold #{}".format(fold))
    x_train = data[train]
    y_train = data_y[train]
    x_test = data[test]
    y_test = data_y[test]
    print(x_train.shape)
    model.add(Conv2D(32, (1, 3),input_shape=(1,1028,1)))
    model.add(BatchNormalization(axis=-1))
    model.add(Activation('relu'))
    #model.add(MaxPooling2D(pool_size=(1,2)))
    model.add(Conv2D(34, (1, 4)))
    model.add(BatchNormalization(axis=-1))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(1,2)))

    model.add(Conv2D(64,(1, 3)))
    model.add(BatchNormalization(axis=-1))
    model.add(Activation('relu'))
    #model.add(MaxPooling2D(pool_size=(1,2)))
    model.add(Conv2D(64, (1, 4)))
    model.add(BatchNormalization(axis=-1))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(1,2)))

    model.add(Flatten())

    #fully connected for new model

    model.add(Dense(550))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Dropout(0.25))
    model.add(Dense(250))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Dropout(0.25))
    model.add(Dense(100))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Dropout(0.25))
    model.add(Dense(25))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Dropout(0.25))
    model.add(Dense(3))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])

    model.fit(x_train.reshape(450,1,1028,1), y_train,
          batch_size=5,
          epochs=1,
          verbose=1,
          validation_data=(x_test, y_test))
    pred = model.predict(x_test)

    oos_y.append(y_test)
    pred = np.argmax(pred, axis=1)  # raw probabilities to chosen class (highest probability)
    oos_pred.append(pred)

    # Measure this fold's accuracy
    y_compare = np.argmax(y_test, axis=1)  # For accuracy calculation
    score = metrics.accuracy_score(y_compare, pred)
    print("Fold score (accuracy): {}".format(score))

问题是,当我运行我的代码时,代码对于折叠 1 运行正常,但对于折叠 2,它给了我以下错误

ValueError: Input 0 is incompatible with layer conv2d_5: expected ndim=4, found ndim=2

当我检查 x_train 的尺寸时,它是(450, 1, 1028, 1)

我不确定错误是什么。

标签: pythonkeras

解决方案


您在循环内一遍又一遍地添加模型层。当您尝试在 softmax 激活层(循环的第一次迭代的最后一层)之后添加卷积层(循环的第二次迭代)时,会产生错误。经过仔细检查,我对您的问题提出了以下解决方案。

首先将数据集拆分为训练和测试

for train_index, test_index in kf.split(data):
    X_train, X_test = data[train_index], data[test_index]
    y_train, y_test = data_y[train_index], data_y[test_index]

然后将层添加到循环之外的模型。

model.add(Conv2D(32, (1, 3),input_shape=(1,1028,1)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(1,2)))
model.add(Conv2D(34, (1, 4)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(1,2)))
# ... The reset of the code

推荐阅读