过去一天,我了解了LSTM
,然后决定看一下使用Keras
创建它的教程。我看了几本教程,它们都有
model = Sequential()
model.add(LSTM(10, input_shape=(1,1)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam')
X,y = get_train()
model.fit(X, y, epochs=300, shuffle=False, verbose=0)
然后他们预测使用
model.predict(X, verbose=0)
我的问题是:为了使用LSTM预测下一个结果,您是否不必给出先前的预测以及输入和单元状态?
另外,这10个在model.add(LSTM(10, input_shape(1,1))
中代表什么?
答案 0 :(得分:1)
您必须将先前的预测赋予LSTM状态。如果您调用预测LSTM每次都会初始化,它将不会记住先前预测的状态。
通常情况下(例如,如果您使用lstm生成文本),您会在循环中执行以下操作:
# pick a random seed
start = numpy.random.randint(0, len(dataX)-1)
pattern = dataX[start]
print "Seed:"
print "\"", ''.join([int_to_char[value] for value in pattern]), "\""
# generate characters
for i in range(1000):
x = numpy.reshape(pattern, (1, len(pattern), 1))
x = x / float(n_vocab)
prediction = model.predict(x, verbose=0)
index = numpy.argmax(prediction)
result = int_to_char[index]
seq_in = [int_to_char[value] for value in pattern]
sys.stdout.write(result)
pattern.append(index)
pattern = pattern[1:len(pattern)]
print "\nDone."
(示例从machinelearningmastery.com复制)
重要的是以下几行:
pattern.append(index)
pattern = pattern[1:len(pattern)]
在这里,他们将下一个字符附加到模式,然后删除第一个字符,使其输入长度与lstm的期望值匹配。然后将其带入numpy数组(x = np.reshape(...)),并根据生成的输出从模型进行预测。因此,要回答第一个问题,您需要再次输入输出。
对于第二个问题,10对应于您在一个图层中拥有的lstm单元数。如果您不使用“ return_sequences = True”,则它对应于该图层的输出大小。
答案 1 :(得分:0)
您的第一个问题:
为了使用LSTM预测下一个结果,是否不必给出先前的预测以及输入和单元状态?
不,您不必这样做。据我了解,它存储在LSTM单元中,这就是LSTM使用大量RAM的原因
如果您的数据具有如下所示的形状:
(100,1000)
如果将其插入fit函数,则每个时期将运行100个列表。当移动到下一个列表时,LSTM将在刷新之前记住1000个数据图。
第二:
另外,10在model.add(LSTM(10,input_shape(1,1)))中代表什么?
它是输入后第一层的形状,因此您的模型当前具有以下形状:
1,1
10
1
希望它会有所帮助:)
答案 2 :(得分:0)
让我们将其分解成图片并以图形方式显示
LSTM(10, input_shape=(3,1)))
:定义序列长度为3的LSTM,即LSTM将展开3个时间步长。 LSTM在每个时间步上都会输入大小为1的输入。输出(以及隐藏状态和所有其他LSTM门的大小)为10(向量或大小为10)
您不必手动进行展开(从当前的隐藏状态传递到下一个状态),这由keras / tensorflow LSTM层负责。您要做的就是以(batch_size X time_steps X input_size)格式传递数据。
Dense(1, activation='linear')
:这是一个具有线性激活功能的密集层,以上一层的输出(即LSTM的输出为最后展开的10的矢量)作为输入。它将返回一个大小为1的向量。
可以使用model.summary()