我是Keras的新手,我正在尝试制作分类模型,这是我的模型:
model = Sequential()
model.add(Dense(86, activation='sigmoid', input_dim=21))
model.add(Dense(50, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics=['accuracy'])
但它一直给我这个错误:
ValueError: Error when checking target: expected dense_3 to have shape (None, 1) but got array with shape (17268, 2)
现在我知道我需要使用一个热编码对我的标签进行编码并将它们展平,所以我也做了。
oht_y_train = np_utils.to_categorical(y_train, num_classes=3)
oht_y_train = np.ndarray.flatten(oht_y_train)
但我仍然得到同样的错误。
注意:在我弄平标签之前,我得到了同样的错误,只是形状是(5765,3)
我还打印了标签数组的形状,它给了我(17268,)
答案 0 :(得分:6)
如果最终图层的输出维度为1(对于二进制分类),则不应对单个标签进行单热编码。如果您有多个类,则应使用单热编码和categorical_crossentropy
损失函数,但最终输出图层应具有维度3,即Dense(3)
,其中3是类的数量。编码后不应将标签弄平。
model = Sequential()
model.add(Dense(86, activation='sigmoid', input_dim=21))
model.add(Dense(50, activation='sigmoid'))
model.add(Dense(3, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics=['accuracy'])
model.fit(X_data, Y-one-hot-encoded) # here your labels have shape (data_size, 3).
如果您只需要执行二进制分类,那么最好使用binary_crossentropy
丢失并使用Dense(1)
和sigmoid
或softmax
输出维度1激活以标准化0到1之间的输出。
model = Sequential()
model.add(Dense(86, activation='sigmoid', input_dim=21))
model.add(Dense(50, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='nadam', metrics=['accuracy'])
model.fit(X_data, Y_labels) # here your labels have shape (data_size,).