【问题标题】:Which axis does Keras SimpleRNN / LSTM use as the temporal axis by default?Keras SimpleRNN / LSTM 默认使用哪个轴作为时间轴?
【发布时间】:2020-06-19 15:41:11
【问题描述】:

SimpleRNNLSTM 用于经典sentiment analysis 算法时(此处适用于长度

model = Sequential()
model.add(Embedding(5000, 32, input_length=250))   # Output shape: (None, 250, 32)
model.add(SimpleRNN(100))                          # Output shape: (None, 100)
model.add(Dense(1, activation='sigmoid'))          # Output shape: (None, 1) 

在哪里指定RNN输入的哪个轴作为“时间”轴?

更准确地说,在Embedding 层之后,给定的输入句子,例如“坐在垫子上的猫”,被编码为形状为 (250, 32) 的矩阵 x,其中 250 是输入文本的最大长度(以字为单位),而 32嵌入的维度。然后,在 Keras 中的哪个位置指定是否使用它:

  1. h[t] = activation( W_h * x[:, t] + U_h * h[t-1] + b_h )

或者这个:

  1. h[t] = activation( W_h * x[t, :] + U_h * h[t-1] + b_h )

(在这两种情况下,y[t] = activation( W_y * h[t] + b_y )

TL;DR:如果 RNN Keras 层的输入大小为 (250, 32),默认情况下它使用哪个轴作为时间轴? Keras 或 Tensorflow 文档中的哪些地方对此进行了详细说明?


PS:参数个数(model.summary()给出)是13300怎么解释? W_h 有 100x32 的系数,U_h 有 100x100 的系数,b_h 有 100x1 的系数,即我们已经有 13300! W_yb_y 没有剩余系数了!这怎么解释?

【问题讨论】:

    标签: python tensorflow keras recurrent-neural-network


    【解决方案1】:

    时间轴:总是暗 1,除非time_major=True,否则暗 2; Embedding 层输出一个 3D 张量。这可以在here 中看到,其中step_input_shape 是在recurrent loop 的每个步骤中馈送到RNN cell 的输入形状。对于您的情况,timesteps=250,SimpleRNN 单元在每一步“看到”张量形状的 (batch_size, 32)


    # of params:您可以通过检查每个层的.build() 代码:EmbeddingSimpleRNNDense 或同样在每个层上调用 .weights 来查看图形是如何得出的层。对于你的情况,l = model.layers[1]:

    • l.weights[0].shape == (32, 100) --> 3200 个参数 (kernel)
    • l.weights[1].shape == (100, 100) --> 10000 个参数 (recurrent_kernel)
    • l.weights[2].shape == (100,) --> 100 个参数 (bias) (sum: 13,300)

    计算逻辑:没有W_yb_y; “y”是隐藏状态,h,实际上对于所有循环层 - 您引用的内容可能来自通用 RNN 公式。 @“在这两种情况下......” - 这是错误的;要查看实际发生的情况,请检查 .call() 代码。

    附:我建议定义模型的完整 batch_shape 以进行调试,因为它消除了模棱两可的 None 形状


    SimpleRNN 公式与代码:根据要求;请注意,源代码中的 h 具有误导性,通常在公式中为 z(“预激活”)。

    • return_sequences=True -> 返回所有个时间步的输出:(batch_size, timesteps, channels)

    • return_sequences=False -> 仅返回 last 时间步的输出:(batch_size, 1, channels)。见here

    【讨论】:

    • 非常感谢您的详细解答,非常有帮助。
    • 为了 100%,你能把 SimpleRNN 的公式包括在内吗? h[t] = activation( W_kernel * x[t, :] + W_recurrentkernel * h[t-1] + W_bias )(其中 * 是点积)似乎或多或少是正确的。但是 SimpleRNN 的 输出 是什么,因为没有特定的y[t]?会不会是h[-1],即最后一个时间步的隐藏状态的输出?
    • 精彩回答@OverLordGoldDragon!
    • PS:为什么return output, [output]?即为什么要返回一个输出 + 打包在一个列表中的相同输出?
    • @Basj 一个用于输出y,另一个是携带RNN状态(states),它可以(并且确实为LSTM)包含超过y。跨度>
    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多