LSTM(Keras)中的采样步长和时间步长之间的差异

时间:2019-09-08 23:18:35

标签: tensorflow keras lstm

我试图了解状态如何在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,:]?

2 个答案:

答案 0 :(得分:0)

您的输入是shape=(4,4,2)的数组,其中前4个是批大小(4个样本),后4个是time_step,后2个是每个time_step的input_dim。

LSTM中的采样步长与时间步长之间的差异

每个样本可以有多个时间步长,甚至样本之间的不同时间步长也有效。

为什么我的yp [0,:,:]不等于yp [:,0,:]?

您需要了解,诸如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)

似乎我误解了状态变量是如何传递的。我曾期望状态变量在示例步骤之间传递。我已经在下图中说明了这一点。但是,事实并非如此。如果仔细阅读了文档,就会说明它是如何工作的。

My initial and wrong understanding of state flow

我被默认初始化的事实愚弄了,输入零不会改变状态,所以在我的示例中y01 = y10,y02 = y11,y03 = y12,与示例3到4类似。

我目前的理解是状态变量可以通过,如下图所示。

My current understanding

这意味着对于下面的每个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]

我希望这是有道理的,并将对他人有所帮助。

谢谢