在Keras中,LSTM状态在调用model.predict时是否重置?

该模型将LSTM作为其第一层.

当调用model.predict时,你会传递几个样本:

>sam = np.array([ [[.5, .6, .3]], [[.6, .6, .3]], [[.5, .6, .3]] ])
>model.predict(sam)
array([[ 0.23589483],
       [ 0.2327884 ],
       [ 0.23589483]])

上面我们看到映射:[[.5,.6,.3]] – > 0.23589483等(1个元素的序列,它是长度为3的向量,映射到实数)

该模型的input_length为1,input_dim为3.请注意,第一个和最后一个是相同的并且具有相同的输出(0.23589483).所以我的假设是在Keras处理一个样本(在这种情况下是一个3-D矢量序列)之后,它会重置模型的内存.这就是每个序列基本上是独立的.在这种观点中有什么不正确或误导吗?

使用input_length 3和input_dim 1进行另一个示例.这次,切换序列中的值并查看不同的结果(将第二个列表与最后一个列表进行比较).因此,当Keras处理序列时,内存正在发生变化,但是当完成处理时,内存将重置(第一个和第二个序列具有相同的结果).

sam = np.array([ [[.1],[.1],[.9]], [[.1],[.9],[.1]], [[.1],[.1],[.9]]   ])
model.predict(sam)
array([[ 0.69906837],
   [ 0.1454899 ],
   [ 0.69906837]])

上面我们看到映射[[.1],[.1],[.9]] – > 0.69906837等(3个元素到实数的序列)

最佳答案 你正在调用model.predict()这意味着当处理输入时网络的权重不会改变,所以当你输入[[.1],[.1],[.9]]时,无论其他什么,它都会产生相同的结果输入在两者之间接收.请注意,当您训练模型并预测测试数据时,这是首选行为.您不希望另一方提供测试数据来影响您的预测.

您可以在model.fit()中看到您期望的效果,例如,您可以使用model.train_on_batch()来训练输入(并更新模型权重),然后调用model.predict()以查看输出更改.

编辑:如果您要查找LSTM状态而不是网络权重,则应将stateful = True传递给图层的init,默认情况下将其设置为False.使用有状态时,您还必须传递batch_input_shape参数.有关详细信息,请参阅here.请注意,如果您希望每个输入都影响下一个预测,则必须将批量大小设置为1(例如batch_input_shape =(1,3,1)),因为对批量中的样本进行并行评估并且它们不会相互影响.

点赞