Keras - 检查目标时出错:预期activation_5具有形状(2,)但是得到了具有形状的数组(1,)

时间:2018-06-13 03:31:02

标签: python tensorflow keras

在LSTM网络中,我将

形式的数组作为特征传递
X
array([[1],[2],...,[12]],
      [[2],[3],...,[13]],...
      [[999],[1000],...,[1011]]
      [[1000],[1001],...,[1012]])

所以它的形状是(1000,12,1)

目标是一个数组,其中包含两个可能的值0和形式

y 
array([[1], [0], [0], [1], ..., [0]])

所以它的形状是(1000,1)

考虑到我必须使用softmax激活和Dense 2,我做错了什么?

这是网络的构建。

model = Sequential()
model.add(LSTM(25, input_shape=(12, 1)))
model.add(Dropout(0.1))
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(X, y, epochs=1000, batch_size=80, verbose=1, shuffle=False, callbacks=[EarlyStopping(patience=10)])

我的猜测是它与目标的形状有关,但我不确定如何解决它。

谢谢!

2 个答案:

答案 0 :(得分:0)

使用两个类将目标转换为一个热编码可以解决此问题。 要将y转换为一个热编码,请执行以下操作

y = numpy.eye(2)[y]

编辑:

另一种解决方案是将输出层更改为仅包含具有sigmoid激活的单个节点。如果目标是在[0,1]之间输出值,则sigmoid激活最合适。我还建议将损失函数从'mse'更改为'binary_crossentropy',因为假设'mse'损失是数据来自正态分布而不是二项式分布。在您的情况下,输出类分布是二项式({0,1})。所以使用'binary_crossentropy'是合乎逻辑的选择。

...
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss="binary_crossentropy", optimizer="rmsprop")
... 

答案 1 :(得分:0)

我认为Mitiku正确地需要对您的分类Y进行热编码。这也可以使用("#foo").prop("selectedIndex",optionIndex) 来完成。

keras.utils.to_categorical

我也想知道你的模型是否应该......

one_hot_y = keras.utils.to_categorical(y)

我自己对神经网络比较陌生,所以这可能不适合LSTM。