【发布时间】:2017-06-08 21:26:54
【问题描述】:
我是 Keras 和 LSTM 的新手——我想在二维序列(即网格空间中的运动)上训练一个模型,而不是一维序列(如文本字符)。
作为测试,我首先尝试了一个维度,并且通过以下设置成功地做到了:
model = Sequential()
model.add(LSTM(512, return_sequences=True, input_shape=X[0].shape, dropout=0.2, recurrent_dropout=0.2))
model.add(LSTM(512, return_sequences=False, dropout=0.2))
model.add(Dense(len(y[0]), activation="softmax"))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
model.fit(X, y, epochs=50)
我正在像这样格式化数据:
data = ## list of integers (1D)
inputs = []
outputs = []
for i in range(len(data) - SEQUENCE_LENGTH):
inputs.append(data[i:i + SEQUENCE_LENGTH])
outputs.append(data[i + SEQUENCE_LENGTH])
X = np.array([to_categorical(np.array(input), CATEGORY_LENGTH) for input in inputs])
y = to_categorical(np.array(outputs), CATEGORY_LENGTH)
这很简单,而且收敛很快。
但是,如果我的数据不是由整数列表组成,而是由二维元组组成,我就不能再创建分类(one-hot)数组来传递给 LSTM 层。
我尝试过不使用分类数组,而只是将元组传递给模型。在这种情况下,我将输出层更改为:
model.add(Dense(1, activation="linear"))
但这并没有收敛,或者至少移动得非常慢。
如何调整此代码以处理具有附加维度的输入?
【问题讨论】:
-
我不确定你是同时改变了几个因素还是有必要改变另一个因素。你能告诉我:1.你为什么使用分类数据而不是二维数组来进行网格位置序列? 2.为什么元组需要这条线?
model.add(Dense(1, activation="linear"))