该模型将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个元素到实数的序列)
答案 0 :(得分:2)
您正在调用model.predict()
这意味着在处理输入时网络权重不会发生变化,因此当您输入[[.1],[.1],[.9]]
时,无论其他输入收到什么,它都会产生相同的结果。请注意,当您训练模型并预测测试数据时,这是首选行为。您不希望另外您提供的测试数据会影响您的预测。
您可以在model.fit()
中看到您期望的效果,例如您可以使用model.train_on_batch()
来训练输入(并更新模型权重),然后调用model.predict()
以查看输出变化
编辑:如果您要查找LSTM状态而不是网络权重,则应将stateful=True
传递给图层的初始值,将其设置为False
默认。使用stateful
时,您也必须传递batch_input_shape
参数。有关详细信息,请参阅here。请注意,如果您希望每个输入都影响下一个预测,则必须将批量大小设置为1(例如batch_input_shape=(1,3,1)
),因为批量处理的样本并行进行评估,并且它们不会相互影响。< / p>
答案 1 :(得分:1)
我很欣赏这是一个老问题,但希望这个答案可以帮助像我这样的其他Keras初学者。
我在我的机器上运行了这个例子,并观察到LSTM的隐藏状态和单元状态确实在调用model.predict
时发生了变化。
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
的输出示例:
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))