繁体   English   中英

keras中的尺寸不匹配

[英]Dimension mismatch in 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) 450,1,1028,1 (450, 1, 1028, 1)

我不确定这是什么错误。

您要一遍又一遍地在循环中添加模型层。 当您尝试在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM