【问题标题】:How to stack same RNN for every layer?如何为每一层堆叠相同的RNN?
【发布时间】:2020-09-30 17:22:07
【问题描述】:

我想知道如何堆叠多层 RNN,但每一层都是相同的 RNN。我希望每一层都具有相同的权重。看过stack LSTM和RNN,但是发现每一层都不一样。

1层代码:

inputs = keras.Input(shape=(maxlen,), batch_size = batch_size)

Emb_layer = layers.Embedding(max_features,word_dim)
Emb_output = Emb_layer(inputs)

first_layer = layers.SimpleRNN(n_hidden,use_bias=True,return_sequences=False,stateful =False)
first_layer_output = first_layer(Emb_output)

dense_layer = layers.Dense(1, activation='sigmoid')
dense_output = dense_layer(first_layer_output )

model = keras.Model(inputs=inputs, outputs=dense_output)
model.summary()

enter image description here RNN 1层

inputs = keras.Input(shape=(maxlen,), batch_size = batch_size)

Emb_layer = layers.Embedding(max_features,word_dim)
Emb_output = Emb_layer(inputs)

first_layer = layers.SimpleRNN(n_hidden,use_bias=True,return_sequences=True,stateful =True)
first_layer_output = first_layer(Emb_output)
first_layer_state = first_layer.states

second_layer = layers.SimpleRNN(n_hidden,use_bias=True,return_sequences=False,stateful =False)
second_layer_set_state = second_layer(first_layer_output, initial_state=first_layer_state)

dense_layer = layers.Dense(1, activation='sigmoid')
dense_output = dense_layer(second_layer_set_state )

model = keras.Model(inputs=inputs, outputs=dense_output)
model.summary()

enter image description here 堆栈 RNN 2 层。

例如,我想构建两层 RNN,但第一层和第二层必须具有相同的权重,这样当我在第一层更新权重时,第二层必须更新并共享相同的值。据我所知,TF有RNN.state。它返回上一层的值。但是,当我使用它时,似乎每一层都是独立处理的。我想要的 2 层 RNN 应该具有等于 1 层的可训练参数,因为它们共享相同的权重,但这不起作用。

【问题讨论】:

  • 你能说得更具体点吗?你到底尝试了什么?它到底是怎么不起作用的?
  • 我想把很多RNN层堆叠在一起,但是每一层的权重都一样。例如,我想构建两层 RNN,但第一层和第二层必须具有相同的权重,这样当我在第一层更新权重时,第二层必须更新并共享相同的值。据我所知,TF有RNN.state。它返回上一层的值。但是,当我使用它时,似乎每一层都是独立处理的。

标签: keras lstm recurrent-neural-network


【解决方案1】:

您可以将图层对象视为知道如何应用权重的权重容器。您可以根据需要多次使用图层对象。假设嵌入和RNN维度相同,你可以这样做:

states = Emb_layer(inputs)
first_layer = layers.SimpleRNN(n_hidden, use_bias=True, return_sequences=True)
for _ in range(10):
    states = first_layer(states)

没有理由将有状态设置为true。当您将长序列拆分为多个批次以及 RNN 记住批次之间的状态时使用此功能,因此您无需手动设置初始状态。您可以通过简单地从states 索引最后一个位置来获得RNN 的最终状态(您想用于分类的那个)。

【讨论】:

  • 我现在明白了!非常感谢您的解释。但是如果我将它设置为 False,我对 stateful 感到困惑,似乎第一层返回 states = None。
最近更新 更多