首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Keras中,什么时候在调用model.predict时重置LSTM状态?

在Keras中,什么时候在调用model.predict时重置LSTM状态?
EN

Stack Overflow用户
提问于 2016-08-29 08:08:20
回答 2查看 3.3K关注 0票数 8

该模型的第一层是LSTM。

在调用model.predict时,假设您传入了几个示例:

代码语言:javascript
复制
>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处理序列时,内存会发生变化,但当处理完成时,内存会重置(第一个序列和第二个序列具有相同的结果)。

代码语言:javascript
复制
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个元素到实数的序列)

EN

回答 2

Stack Overflow用户

发布于 2017-08-24 22:18:46

我很欣赏这是一个老问题,但希望这个答案能帮助其他像我一样的Keras初学者。

我在我的机器上运行了这个示例,并观察到LSTM的隐藏状态和单元状态确实随着对model.predict的调用而发生变化。

代码语言:javascript
复制
import numpy as np
import keras.backend as K
from keras.models import Model
from keras.layers import LSTM

batch_size = 1
timestep_size = 2
num_features = 4

inputs = Input(batch_shape=(batch_size, timestep_size, num_features)
x = LSTM(num_features, stateful=True)(inputs)

model = Model(inputs=inputs, outputs=x)
model.compile(loss="mse",
              optimizer="rmsprop",
              metrics=["accuracy"])

x = np.random.randint((10,2,4))
y = np.ones((10,4))
model.fit(x,y, epochs=100, batch_size=1)

def get_internal_state(model):
    # get the internal state of the LSTM
    # see https://github.com/fchollet/keras/issues/218
    h, c = [K.get_value(s) for s, _ in model.state_updates]
    return h, c

print "After fitting:", get_internal_state(model)

for i in range(3):
    x = np.random.randint((10,2,4))
    model.predict(x)
    print "After predict:", get_internal_state(model)

以下是训练后对get_internal_state的调用的输出示例:

代码语言:javascript
复制
After_fitting: (array([[ 1.,  1.,  1.,  1.]], dtype=float32), array([[  11.33725166,   11.8036108 ,  181.75688171,   25.50110626]], dtype=float32))
After predict (array([[ 1.        ,  0.99999994,  1.        ,  1.        ]], dtype=float32), array([[   9.26870918,    8.83847237,  179.92633057,   28.89341927]], dtype=float32))
After predict (array([[ 0.99999571,  0.9992013 ,  1.        ,  0.9915328 ]], dtype=float32), array([[   6.5174489 ,    8.55165958,  171.42166138,   25.49199104]], dtype=float32))
After predict (array([[ 1.,  1.,  1.,  1.]], dtype=float32), array([[   9.78496075,    9.27927303,  169.95401001,   28.74017715]], dtype=float32))
票数 6
EN

Stack Overflow用户

发布于 2016-08-29 11:41:24

您正在调用model.predict(),这意味着网络的权重在处理输入时不会改变,因此当您输入[[.1],[.1],[.9]]时,它将始终产生相同的结果,而不管其他输入之间接收到什么。请注意,当您训练了模型并预测测试数据时,这是首选行为。你不希望你提供的其他测试数据影响你的预测。

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

编辑:如果你寻找的是LSTM的状态,而不是网络的权重,你应该将stateful=True传递给层的初始化,它默认设置为False。当使用stateful时,你也必须传递batch_input_shape参数。有关详细信息,请参阅here。请注意,如果您希望每个输入影响下一次预测,则必须将batch size设置为1(例如batch_input_shape=(1,3,1)),因为对批中样本的评估是并行完成的,它们不会相互影响。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39196945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档