在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)])
我的猜测是它与目标的形状有关,但我不确定如何解决它。
谢谢!
答案 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。