密集函数输入形状与keras中的一个热编码训练数据不匹配

时间:2018-06-12 07:53:19

标签: tensorflow keras one-hot-encoding

目标输出训练集如下: y_train = [0,5,3,1]

一个热编码值如下:

Y_train = [[1. 0. 0. 0. 0. 0.]

       [0. 0. 0. 0. 0. 1.]

       [0. 0. 0. 1. 0. 0.]

       [0. 1. 0. 0. 0. 0.]]

此目标集中的类数为4。 单个热编码值的维数为6.

当我在keras sequential dl模型的最终输出密集函数中提到类值的数量时,我得到以下错误消息:

*ValueError: Error when checking target: expected dense_2 to have shape (None, 4) but got array with shape (44833, 6)*

我尝试通过将目标列表值更改为有序列表来解决此问题,如下所示:

old_y_train = [0,5,3,1]

new_y_train = [0,3,2,1]

通过这个修改,dl模型作为一个匹配的数量与一个热编码值的维度一起工作。

这是解决此问题的正确方法吗?另外,你能告诉我如何解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:0)

最后一层的单位数应与类的数量相匹配,类的数量应与y_train的一个热编码的长度相匹配。因此,如果您有y_train的以下数据

Y_train = [[1. 0. 0. 0. 0. 0.]

       [0. 0. 0. 0. 0. 1.]

       [0. 0. 0. 1. 0. 0.]

       [0. 1. 0. 0. 0. 0.]]

那么模型的最后一层应该是这样的

model.add(Dense(6,activation="softmax"))

我认为这可以解决您的问题。

答案 1 :(得分:0)

我觉得你并不真正理解单热编码。一个热编码将类(2)转换为1和0,这是你得到的标准,但你的单热阵列是错误的。

  Y_train = [[1. 0. 0. 0. 0. 0.]

   [0. 0. 0. 0. 0. 1.]

   [0. 0. 0. 1. 0. 0.]

   [0. 1. 0. 0. 0. 0.]]

你写它的方式意味着它有6个类,4个数据点或4个例子。你想要的是: 感觉你并不真正理解一个热门的编码。一个热编码将类(2)转换为1和0,这是你得到的标准,但你的单热阵列是错误的。

Y_train = [[1. 0. 0. 0.]

           [0. 0. 0. 1.]

           [0. 1. 0. 0.]

           [0. 1. 0. 0. ]]

现在你有4个班级,这就是你的错误所抱怨的。