首页 > 解决方案 > 具有分类交叉熵损失的多类预测

问题描述

假设这个例子实现了一个简单的二元分类。

X = 数组([[1,2,3],[2,3,4],[3,4,5]])

y = 数组([0],[1],[0])

...
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(X, y, epochs=50, verbose=0)
# new instance where we do not know the answer
Xnew = array([[4, 5, 6]])
# make a prediction
ynew = model.predict(Xnew)
#show the inputs and predicted outputs
print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))
...

results
X=[4, 5, 6], Predicted=[0 or 1]

而这个实现了多类分类。

X = 数组([[1,2,3],[2,3,4],[3,4,5]])

y = 数组([4],[5],[6])

...

model.compile(loss='categorical_crossentropy', optimizer='adam')
# fit model
model.fit(X, y, epochs=50, verbose=2)
model.reset_states()
# evaluate model on new data
yhat = model.predict((X))
...

results decoded
X=[4, 5, 6], Predicted=[4, 5, 6]

如何使用单个输出实现多类分类以获得这样的结果?(类似于预测时间序列)

X = 数组([[1,2,3],[2,3,4],[3,4,5]])

y = 数组([4],[5],[6])

 # new instance where we do not know the answer
 Xnew = array([[4, 5, 6]])
 yhat = model.predict_classes(Xnew)

结果解码 X=[4, 5, 6], Predicted=[7]

标签: python-3.xkeras

解决方案


您正在寻找的是loss='sparse_categorical_crossentropy'假设整数目标是类标签的函数。因此,如果您的模型有 7 个输出,并且您给定目标 2,sparse_categorical_crossentropy则将 2 转换[0,0,1,0,0,0,0]为目标并categorical_crossentropy照常应用。

在这种情况下,您的输出层激活函数应该是softmax并且输出的数量等于类的数量。最有可能像Dense(num_classes, activation='softmax')

如果您的整数类只是[4,5,6]那么您需要将它们转移[0,1,2]到满足条件max(Y_targets) < num_classes


推荐阅读