期望dense_3有形状(无,1)但是有形状的数组(17268,2)

L.I*_*nov 5 python keras

我是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'])
Run Code Online (Sandbox Code Playgroud)

但它一直给我这个错误:

ValueError: Error when checking target: expected dense_3 to have shape (None, 1) but got array with shape (17268, 2)
Run Code Online (Sandbox Code Playgroud)

现在我知道我需要使用一个热编码对我的标签进行编码并将它们展平,所以我也做到了.

oht_y_train = np_utils.to_categorical(y_train, num_classes=3)
oht_y_train = np.ndarray.flatten(oht_y_train)
Run Code Online (Sandbox Code Playgroud)

但我仍然得到同样的错误.

注意:在我弄平标签之前,我得到了同样的错误,只是形状是(5765,3)

我还打印了标签阵列的形状,它给了我(17268,)

JAu*_*tin 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).
Run Code Online (Sandbox Code Playgroud)

如果您只需要执行二进制分类,那么最好使用binary_crossentropy丢失并使输出维度为1,使用Dense(1)和/ sigmoidsoftmax激活来归一化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,).
Run Code Online (Sandbox Code Playgroud)