Keras 克拉斯LSTM州

Keras 克拉斯LSTM州,keras,lstm,Keras,Lstm,我想在Keras中运行一个LSTM,得到输出和状态。在TF中有类似的东西 with tf.variable_scope("RNN"): for time_step in range(num_steps): if time_step > 0: tf.get_variable_scope().reuse_variables() (cell_output, state) = cell(inputs[:, time_step, :], state)

我想在Keras中运行一个LSTM,得到输出和状态。在TF中有类似的东西

with tf.variable_scope("RNN"):
      for time_step in range(num_steps):
        if time_step > 0: tf.get_variable_scope().reuse_variables()
        (cell_output, state) = cell(inputs[:, time_step, :], state)
        outputs.append(cell_output)

在Keras中有没有一种方法可以做到这一点,当序列的长度很大时,我可以获取最后一个状态并将其提供给新的输入。我知道stateful=True,但我也想在训练时访问状态。我知道它使用的是扫描而不是for循环,但基本上我想保存状态,然后在下一次运行时,将它们作为LSTM的开始状态。简而言之,获取输出和状态。

由于LSTM是一个层,一个层在keras中只能有一个输出(如果我错了,请纠正我),因此在不修改源代码的情况下,无法同时获取两个输出

最近,我正在对keras进行黑客攻击,以实现一些高级结构,一些您可能不喜欢的想法确实有效。我所做的是覆盖keras层,这样我们可以访问表示隐藏状态的张量

首先,您可以查看中的
call()
函数了解keras是如何工作的:

def调用(self,x,mask=None):
#输入形状:(nb_样本、时间(用零填充)、输入尺寸)
#注意,子类的.build()方法必须定义
#具有完整输入形状的self.input_规范。
input\u shape=self.input\u spec[0]。形状
如果K._BACKEND=='tensorflow':
如果未输入_形[1]:
引发异常('使用TensorFlow时,应定义'
'显式指定的时间步数'
'您的序列。\n'
'如果第一层是嵌入层,'
'确保传递一个“输入长度”'
'参数。否则,请确保'
“第一层已完成”
“输入形状”或“批量输入形状”
'参数,包括时间轴。'
“在图层上找到输入形状”+self.name+
“:”+str(输入_形))
如果self.stateful:
初始状态=自身状态
其他:
初始状态=自身。获取初始状态(x)
常数=self.get_常数(x)
预处理输入=自身。预处理输入(x)
最后的输出,输出,状态=K.rnn(self.step,预处理的输入,
最初的美国,
向后走,
面具=面具,
常数=常数,
展开=self.unroll,
输入长度=输入形状[1])
如果self.stateful:
self.updates=[]
对于范围内的i(len(states)):
self.updates.append((self.states[i],states[i]))
如果self.return\u序列:
返回输出
其他:
返回最后的输出
其次,我们应该覆盖我们的层,下面是一个简单的脚本:

将keras.backend导入为K
从keras.layers导入输入,LSTM
类别MyLSTM(LSTM):
def调用(self、x、mask=None):
# .... 布拉布拉,就在回来之前
#我们添加此行是为了访问各州
self.extra_输出=状态
如果self.return\u序列:
# .... 呜呜呜呜,一直到最后
#您应该从keras.layers.com复制**完全相同的代码**
I=输入(形状=(…))
lstm=MyLSTM(20)
output=lstm(I)#通过调用,我们实际上调用了`call()`并创建`lstm.extra_输出`
额外输出=lstm。额外输出指目标
计算函数=K.函数(输入=[I],输出=额外的输出+[output])#使用函数同时计算它们**。

顺便说一下,自定义层在加载和保存时会导致一些错误,因为keras在加载时找不到
MyLSTM
。从_json()调用
model_时,只需让
custom_object={'MyLSTM':MyLSTM}
。它应该很简单。