我正在尝试进行多类分类,这里提到的一些数据(这有助于理解数据形状与Keras输入形状不匹配的原因):
X = x_data.loc[:,x_data.columns[0:6]]Y = y_data.loc[:,]print(X.shape)print(Y.shape)X = X.valuesY = Y.values
以上代码输出如下:
(237, 6)(237,)[[0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] ... [0 0 0 1 0 0] [0 0 0 1 0 0] [0 0 0 1 0 0]][ 0 0 2 8 8 9 5 0 1 2 4 4 5 5 6 9 10 0 3 8 10 2 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 1 2 4 5 4 1 3 8 9 11 4 5 8 6 1 11 8 9 11 2 11 1 3 4 1 1 4 10 11 9 3 11 8 6 9 0 0 6 7 10 0 2 7 5 7 9 11 1 4 3 5 6 7 5 7 3 5 2 6 6 9 2 10 11 6 8 8 11 6 10 0 3 3 10 2 5 9 9 11 8 7 8 4 10 10 1 1 6 9 4 5 10 0 3 2 4 7 2 6 7 10 11 11 11 11 11 11 11 11 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7]
下面是我的Keras模型代码,我对输入形状感到困惑。
def baseline_model(): # 在这里创建模型 model = Sequential() model.add(Dense(15, input_shape = [6] , activation = 'relu')) # 整流线性单元激活函数 model.add(Dense(15, activation = 'relu')) model.add(Dense(11, activation = 'softmax')) # 用于多类分类的Softmax # 在这里编译模型 model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy']) return modelestimator = KerasClassifier(build_fn = baseline_model, epochs = 100, batch_size = 10, verbose = 0)kfold = KFold(n_splits = 2, shuffle = True, random_state = 10)results = cross_val_score(estimator, X, Y, cv = kfold)
我得到的错误是:
ValueError: Shapes (None, 1) and (None, 11) are incompatible
你能帮我指出我在参数设置上哪里出了问题,需要如何调整以适应数据吗?
提前感谢
回答:
问题出在你的Y的形状(237),因为你使用了分类交叉熵损失函数,你必须对标签进行独热编码,例如通过调用以下代码:
'''确保你的标签是从0开始的连续序列,例如(0, 1, 2, ..)'''NUM = len(np.unique(Y))Y = keras.utils.to_categorical(Y, num_classes = NUM)
这样处理后,Y的形状将变为(237, NUM)
另一种解决方案是使用稀疏分类交叉熵损失函数,它不需要对多类标签进行独热编码,你可以直接使用Y(237)。