python - 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)
我不确定错误是什么。
解决方案
您在循环内一遍又一遍地添加模型层。当您尝试在 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
推荐阅读
- arrays - 将数组参数传递给 Perl 子例程
- python - 将 einsum 表示法转换为 for 循环
- javascript - 从 JavaScript 的 Django 模板中的 for 循环获取元素
- ipywidgets - 将下拉列表和按钮与 ipywidgets 相结合
- r - ggplot2中的线性回归
- javascript - 如何在另一个对象中检查至少一个对象
- linux - Linux 命令将文件内容每行一个字复制到从同一命令创建的新文件中
- javascript - 子进程 setInterval 偶尔不会触发
- java - 递归期间的奇怪错误
- swift - 如何从 .sks 文件加载精灵以显示在我的 ARSKView 中?