繁体   English   中英

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

[英]Keras - Error when checking target: expected activation_5 to have shape (2,) but got array with shape (1,)

在LSTM网络中,我将以下形式的数组作为特征传递

X
array([[1],[2],...,[12]],
      [[2],[3],...,[13]],...
      [[999],[1000],...,[1011]]
      [[1000],[1001],...,[1012]])

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

目标是一个具有两个可能值0和1的数组

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)])

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

谢谢!

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

y = numpy.eye(2)[y]

编辑:

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

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

我认为Mitiku正确地对您的分类Y进行热编码是正确的。这也可以通过keras.utils.to_categorical完成。

one_hot_y = keras.utils.to_categorical(y)

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

model = Sequential()
model.add(LSTM(25, input_shape=(12, 1)))
model.add(Dropout(0.1))
model.add(Dense(2, activation='softmax') # For a categorical output this has worked for me
model.compile(loss="binary_crossentropy", optimizer="rmsprop") # AFAIK 'mse' loss is not suitable for binary classification.
model.fit(X, y, epochs=1000, batch_size=80, verbose=1, shuffle=False, callbacks=[EarlyStopping(patience=10)])

我本人对神经网络比较陌生,因此可能不适合LSTM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM