【问题标题】:Multi dimensional input for LSTM in KerasKeras 中 LSTM 的多维输入
【发布时间】:2017-05-01 17:19:17
【问题描述】:

我想了解 RNN,特别是 LSTM 如何使用 Keras 和 Tensorflow 处理多个输入维度。我的意思是输入形状是 (batch_size, timesteps, input_dim) 其中 input_dim > 1。
如果 input_dim = 1,我认为下图很好地说明了 LSTM 的概念。
这是否意味着如果 input_dim > 1 那么 x 不再是单个值而是一个数组?但是如果是这样的话,那么权重也变成了数组,和 x + 上下文一样的形状?

【问题讨论】:

    标签: machine-learning neural-network keras recurrent-neural-network


    【解决方案1】:

    Keras 会创建一个计算图,用于执行底部图片中每个特征的序列(但适用于所有单元)。这意味着状态值 C 始终是一个标量,每单位一个。它不是一次处理特征,而是一次处理单元,并且分别处理特征。

    import keras.models as kem
    import keras.layers as kel
    
    model = kem.Sequential()
    lstm = kel.LSTM(units, input_shape=(timesteps, features))
    model.add(lstm)
    model.summary()
    
    free_params = (4 * features * units) + (4 * units * units) + (4 * num_units)
    print('free_params ', free_params)
    print('kernel_c', lstm.kernel_c.shape)
    print('bias_c', lstm.bias_c .shape)
    

    其中4 代表底部图片中的 f、i、c 和 o 内部路径中的每一个。第一项是内核的权重数量,第二项是循环内核,最后一项是偏差(如果应用)。对于

    units = 1
    timesteps = 1
    features = 1
    

    我们看到

    Layer (type)                 Output Shape              Param #
    =================================================================
    lstm_1 (LSTM)                (None, 1)                 12
    =================================================================
    Total params: 12.0
    Trainable params: 12
    Non-trainable params: 0.0
    _________________________________________________________________
    num_params 12
    kernel_c (1, 1)
    bias_c (1,)
    

    对于

    units = 1
    timesteps = 1
    features = 2
    

    我们看到

    Layer (type)                 Output Shape              Param #
    =================================================================
    lstm_1 (LSTM)                (None, 1)                 16
    =================================================================
    Total params: 16.0
    Trainable params: 16
    Non-trainable params: 0.0
    _________________________________________________________________
    num_params 16
    kernel_c (2, 1)
    bias_c (1,)
    

    其中bias_c 是状态 C 的输出形状的代理。请注意,关于单元的内部构造有不同的实现。详细信息在这里 (http://deeplearning.net/tutorial/lstm.html),默认实现使用 Eq.7。希望这会有所帮助。

    【讨论】:

    • 我还在挣扎。我现在明白 C 有一个形状(特征,单位)。所以在一个单元内 Ct 有一个形状(特征,1)。单位的输出是形状为 (1,1) 的 Yt,对吧?这意味着如果我有 2 个功能,那么它会在某处将 (2,1) 更改为 (1,1)。我错过了这一步。
    【解决方案2】:

    让我们将上述答案更新到 TensorFlow 2。

    import tensorflow as tf
    
    model = tf.keras.Sequential([tf.keras.layers.LSTM(units, input_shape=(timesteps, features))])
    model.summary()
    
    free_params = (4 * features * units) + (4 * units * units) + (4 * num_units)
    print('free_params ', free_params)
    print('kernel_c', lstm.kernel_c.shape)
    print('bias_c', lstm.bias_c .shape)
    

    使用此代码,您也可以在 TensorFlow 2.x 中获得相同的结果。

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2018-02-22
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2018-01-03
      • 2018-06-16
      • 2018-09-14
      相关资源
      最近更新 更多