keras sparse_categorical_crossentropy损失函数输出形状不匹配

时间:2017-07-12 02:19:56

标签: python keras loss-function

我有一个包含3570个标签的数据集。当我使用sparse_categorical_crossentropy作为损失函数时,输出形状不匹配。

model = Sequential()
model.add(Dense(1024, input_dim=79, activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(3570, activation='sigmoid'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.fit(x_train, y_train,
          epochs=10,
          batch_size=1,
          validation_data=(x_valid, y_valid))

,输出是 ValueError: Error when checking model target: expected dense_42 to have shape (None, 1) but got array with shape (1055, 3570)

然后我设想了issue#2444并使用np.expand_dims(y, -1)来更改代码。但仍有错误。

model = Sequential()
model.add(Dense(1024, input_dim=79, activation='relu'))
model.add(Dense(2048, activation='relu'))
model.add(Dense(3570, activation='sigmoid'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.fit(x_train, np.expand_dims(y_train, -1),
          epochs=10,
          batch_size=1,
          validation_data=(x_valid, np.expand_dims(y_valid, -1)))

错误 ValueError: Error when checking model target: expected dense_45 to have 2 dimensions, but got array with shape (1055, 3570, 1)

我该如何更改代码?

2 个答案:

答案 0 :(得分:1)

原始y_train维度是什么?

最有可能的是你的y_train有形状(1055,)。您需要将One-Hot代码y_train转换为(1055,3570)维度。然后原始代码应该工作。 Keras不接受使用多个类的y列的单个列,它必须是One-Hot编码的。

您可以使用以下内容:

from keras.utils.np_utils import to_categorical

y_cat = to_categorical(y, num_classes=None)

答案 1 :(得分:1)

loss='sparse_categorical_crossentropy'并不用于一键编码,而是用于整数目标。您可能需要“ Dense(...”)作为输出层,并直接使用y_train。