【问题标题】:How do I shape my 2D input and output correctly for a LSTM in Keras (tensorflow)? Generating an error when making input 3D and output one hot encoded如何在 Keras (tensorflow) 中为 LSTM 正确塑造我的 2D 输入和输出?输入 3D 并输出一个热编码时产生错误
【发布时间】:2019-11-19 08:36:19
【问题描述】:

对于一个类项目,我们必须采用 2D 数据集并使用 LSTM NN 进行预测。我们将其与简单的 DNN 进行比较。

我需要重塑我的数据,以便它与 NN 一起使用,并且在为输入和输出找到正确的形状时遇到了麻烦。我也可能错误地设置了我的神经网络——但它解决了我在处理 3D 数据时遇到的另一个问题。

我的x_train.shape(2340, 590),我的y 形状是(2340,)

我将x_train 改造成(1, 2340, 590)

我一个热编码y——称为binary_labels

binary_labels.shape(2340,2)

总结相关的输入形状:

x_train.shape = (1, 2340, 590)

binary_labels.shape = (2340, 2)

问题:

运行模型会产生一个错误,即输入数组应具有相同数量的样本。

我尝试将 binary_labels 重塑为 (1,2340,2) - 但在运行 NN 时,我得到了 ValueError

空的训练数据。

rnn_model = keras.Sequential([
        keras.layers.LSTM(2, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences = True),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.Dense(2, activation='sigmoid')
    ])
    
rnn_model.compile(optimizer='adam', 
          loss='binary_crossentropy',
          metrics=['accuracy'])

rnn_model.fit(X_train, binary_labels, epochs=5, validation_split = 0.2)

我希望模型能够运行!相反,我收到一条我无法解决的错误消息。

有人知道我该如何解决这个问题吗?

错误信息的相关部分: ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 2340 target samples

整个错误消息:

> --------------------------------------------------------------------------- ValueError                                Traceback (most recent call
> last) <ipython-input-224-36b1852bd7a7> in <module>
>      11           metrics=['accuracy'])
>      12 
> ---> 13 rnn_model.fit(X_train, binary_labels, epochs=5, validation_split = 0.2)
> 
> ~/Desktop/Program_Downloads/anaconda3/envs/uwdatasci420/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py
> in fit(self, x, y, batch_size, epochs, verbose, callbacks,
> validation_split, validation_data, shuffle, class_weight,
> sample_weight, initial_epoch, steps_per_epoch, validation_steps,
> validation_freq, max_queue_size, workers, use_multiprocessing,
> **kwargs)
>     641             `tf.data` dataset or a dataset iterator, and 'steps_per_epoch'
>     642             is None, the epoch will run until the input dataset is exhausted.
> --> 643         validation_steps: Only relevant if `validation_data` is provided and
>     644             is a dataset or dataset iterator. Total number of steps (batches of
>     645             samples) to draw before stopping when performing validation
> 
> ~/Desktop/Program_Downloads/anaconda3/envs/uwdatasci420/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py
> in fit(self, model, x, y, batch_size, epochs, verbose, callbacks,
> validation_split, validation_data, shuffle, class_weight,
> sample_weight, initial_epoch, steps_per_epoch, validation_steps,
> validation_freq, **kwargs)
> 
> ~/Desktop/Program_Downloads/anaconda3/envs/uwdatasci420/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py
> in _standardize_user_data(self, x, y, sample_weight, class_weight,
> batch_size, check_steps, steps_name, steps, validation_split, shuffle,
> extract_tensors_from_dataset)    2463     if not self.inputs:    2464 
> # We need to use `x_input` to set the model inputs.
> -> 2465     2466       # If input data is a dataset iterator in graph mode or if it is an eager    2467       # iterator and only one batch
> of samples is required, we fetch the data
> 
> ~/Desktop/Program_Downloads/anaconda3/envs/uwdatasci420/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py
> in check_array_lengths(inputs, targets, weights)
>     617   """
>     618   batch_count = int(len(index_array) / batch_size)
> --> 619   # to reshape we need to be cleanly divisible by batch size
>     620   # we stash extra items and reappend them after shuffling
>     621   last_batch = index_array[batch_count * batch_size:]
> 
> ValueError: Input arrays should have the same number of samples as
> target arrays. Found 1 input samples and 2340 target samples

【问题讨论】:

    标签: python tensorflow keras lstm recurrent-neural-network


    【解决方案1】:

    如果我能很好地理解你的问题,那就是问题所在:

    x_train.shape(2340, 590) 所以你有 2340 个大小为 (590,)
    如果您像以前那样重塑数据:(1, 2340, 590),您将只提供一个大小为(2340, 590) 的样本,因为 keras 模型输入形状是这样定义的:(Batch_size, size1, size2)

    所以为了让你的模型正常工作,你只需要像这样重塑你的数据:

    x_train = np.expand_dims(x_train, -1) #new shape = (2340, 590, 1)
    

    尝试一下,告诉我它是否更好!

    【讨论】:

      【解决方案2】:

      我认为将您的最终Dense 层包裹在keras.layers.TimeDistributed 中将为您解决问题。

          # ...
          keras.layers.LSTM(590, return_sequences=True, activation=tf.nn.relu),
          keras.layers.TimeDistributed(keras.layers.Dense(2, activation='sigmoid'))
      ]
      

      也就是说,如果您想对系列中的每个时间步进行分类。否则,您可能想在最后一个 LSTM 中返回序列,并且只在看到整个输入序列后基于 LSTM 的最终状态进行分类:

          # ...
          keras.layers.LSTM(590, return_sequences=False, activation=tf.nn.relu),
          keras.layers.Dense(2, activation='sigmoid')
      ]
      

      从您的目标形状来看,您的时间序列中的每个步骤似乎都有一个分类标签,所以我认为您需要将Dense 层包装在TimeDistributed 层中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        相关资源
        最近更新 更多