预期致密_3具有形状(无,1),但得到的数组具有形状(17268,2)

2024-09-30 22:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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'])

但它总是给我这个错误:

^{pr2}$

现在我知道我需要用一个热编码来编码我的标签,然后把它们压平,所以我也这么做了。在

oht_y_train = np_utils.to_categorical(y_train, num_classes=3)
oht_y_train = np.ndarray.flatten(oht_y_train)

但我还是犯了同样的错误。在

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

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


Tags: 模型add编码model错误nptrain标签
1条回答
网友
1楼 · 发布于 2024-09-30 22:21:25

如果最后一层的输出维为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丢失并具有输出维度1,使用Dense(1)sigmoid或{}激活来规范0和1之间的输出。在

^{pr2}$

相关问题 更多 >