我试图了解状态如何在LSTM层中进行。如果我有以下代码
model = Sequential()
model.add(LSTM(2, return_sequences=True,input_shape=(4,2),stateful=False,batch_size=4))
yp=model.predict(np.array([ [[0,0],[0,1],[0,0],[1,1]],
[[0,1],[0,0],[1,1],[0,0]],
[[0,0],[1,1],[0,0],[0,1]],
[[1,1],[0,0],[0,1],[0,0]],
]))
print(yp)
为什么我的yp [0,:,:]等于yp [:,0,:]?
答案 0 :(得分:0)
您的输入是shape=(4,4,2)
的数组,其中前4个是批大小(4个样本),后4个是time_step,后2个是每个time_step的input_dim。
每个样本可以有多个时间步长,甚至样本之间的不同时间步长也有效。
您需要了解,诸如LSTM / GRU之类的RNN块可以捕获时间步之间的依赖关系。更具体地讲,LSTM中有不同的门可以承载从先前时间步到当前的信息。时间步长。
在您的示例中,当第一个样本[[0,0],[0,1],[0,0],[1,1]]
进入模型时,LSTM块实际上从[0,0]-> [0,1]-> 一个接一个地处理时间步长。 。[1,1]。这是在RNN中进行正向传播的方式。因此,不同样本中不同时间步长的输出状态应该不同。
这里blog用可视化很好地解释了LSTM / GRU。
答案 1 :(得分:0)
似乎我误解了状态变量是如何传递的。我曾期望状态变量在示例步骤之间传递。我已经在下图中说明了这一点。但是,事实并非如此。如果仔细阅读了文档,就会说明它是如何工作的。
我被默认初始化的事实愚弄了,输入零不会改变状态,所以在我的示例中y01 = y10,y02 = y11,y03 = y12,与示例3到4类似。
我目前的理解是状态变量可以通过,如下图所示。
这意味着对于下面的每个thee模型,输出都是相同的。
wts=[.5*np.ones((2,4)),.5*np.ones((1,4)),np.array([0,1,0,0])]
model1 = Sequential()
model1.add(LSTM(1, return_sequences=True,input_shape=(1,2),stateful=True,batch_size=1))
model1.layers[0].set_weights(wts)
yp1=model1.predict(np.array([[[0,0]]]))
yp2=model1.predict(np.array([[[0,1]]]))
yp3=model1.predict(np.array([[[0,0]]]))
yp4=model1.predict(np.array([[[1,1]]]))
print("model1:",np.hstack((yp1[:,0,0],yp2[:,0,0],yp3[:,0,0],yp4[:,0,0])))
model2 = Sequential()
model2.add(LSTM(1, return_sequences=True,input_shape=(2,2),stateful=True,batch_size=1))
model2.layers[0].set_weights(wts)
yp1=model2.predict(np.array([[[0,0],[0,1]]]))
yp2=model2.predict(np.array([[[0,0],[1,1]]]))
print("model2:",np.hstack((yp1.reshape((-1)),yp2.reshape((-1)))))
model3 = Sequential()
model3.add(LSTM(1, return_sequences=True,input_shape=(4,2),stateful=False,batch_size=1))
model3.layers[0].set_weights(wts)
yp=model3.predict(np.array([[[0,0],[0,1],[0,0],[1,1]]]))
print("model3:",yp.reshape(-1))
模型1:[0。 0.16222607 0.12174767 0.46444273]
model2:[0。 0.16222607 0.12174767 0.46444273]
model3:[0。 0.16222607 0.12174767 0.46444273]
我希望这是有道理的,并将对他人有所帮助。
谢谢