【问题标题】:LSTM Input Data Preparation and Definition (Python)LSTM 输入数据准备和定义(Python)
【发布时间】:2020-02-10 20:39:57
【问题描述】:

每个时间步都有一个浮点数据对应。每个记录数据是一个包含 1000 个浮点数的数组。不记录时间,但每次记录数组数据之间的时间为 0.1 秒。

我想准备数据并将其存储在适当的容器中,并将其传递给 LSTM 模型。

一次没有指定确切的 0.1 秒持续时间,然后再次考虑持续时间。

我做了什么:

我从 .mat 文件中读取数据并将每个 1000 个浮点数的数组附加到列表中:

max_Value = []
min_Value = []
scale = 2.6
X_Data=[]
Y_Data=[]
epochs_Num = 10
batch_Num = 64
name_Model = f'{LSTM_{int(time.time())}'

for i_Path in origin_Data_Path:
    mat_Data = loadmat(i_Path)
    data     = mat_Data['data']
    X_Data.append(data[:,0])
    Y_Data.append(data[:,1])
 ...

opt = tf.keras.optimizers.Adam(lr=0.001,decay=1e-6)
ls  = tf.keras.losses.sparse_categorical_crossentropy

tensorboard = TensorBoard(log_dir=f'logs/{name_Model}')

myModel.compile(loss=ls,optimizer=opt,metrics=['accuracy'])

history = myModel.fit(X_Data,
                      labels_Categorical,
                      batch_size=batch_Num,
                      epochs=epochs_Num,
                      validation_split=0.2,
                      callbacks= [tensorboard]  )

myModel.save("myMod.h5")

错误:

  File "C:\Python\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Python\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Light/Desktop/Gesture/Test01.py", line 139, in <module>
    callbacks= [tensorboard]  )

  File "C:\Python\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
    use_multiprocessing=use_multiprocessing)

  File "C:\Python\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
    distribution_strategy=strategy)

  File "C:\Python\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 516, in _process_training_inputs
    steps=steps_per_epoch)

  File "C:\Python\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2472, in _standardize_user_data
    exception_prefix='input')

  File "C:\Python\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_utils.py", line 565, in standardize_input_data
    'with shape ' + str(data_shape))

  ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (1000, 1)

X_Data ; structure

Data Struct.

【问题讨论】:

  • 什么是batch_Num
  • batch_Num = 64 和 epochs_Num = 10
  • 这与之前发布的导致代码的问题不同。请您在帖子中澄清新错误是什么。在您之前,我们使用的是 (1000, 1) 的形状。请提供您的问题的明确可重现版本,只需进行最少的更改,以便我们解决该问题。
  • 第一篇文章已更新。添加了有关 Spyder 控制台中出现的错误的其他信息。 (除了 LSTM 输入形状参数,我没有更改代码。'just try and error')
  • 您能否尝试将 xdata 的第三维扩展为 1 而不是 None。当您使用列表时,这可能有点棘手。我强烈建议转换为数组。使用列表可能没有帮助,甚至可能是问题。

标签: python tensorflow keras lstm spyder


【解决方案1】:

这是因为你需要给它一个能够被批处理的输入。您已经给它(1000, 1),这似乎对应于您的数据的单个样本。 Keras 想要它为(batch/samples, time, channels),对你来说是(number of samples, 1000, 1)。这些是预期的 3 个维度。

检查您是如何构建输入数据的。您不需要自己制作批次,fit() 会为您将输入数据分成这些大小的批次。

【讨论】:

  • myModel.add(LSTM(256,batch_input_shape=(1476,1000,1),activation='relu',return_sequences=True))
  • 感谢您的回复。上面的语句也会导致错误。我可以问你为我的问题提供适当的例子吗? (我已经更新了第一篇文章,请检查图片,谢谢)
  • 能否请您打印 X_data.shape 并发布输出
  • X_Data 是一个列表对象,没有 shape 属性。但我也将其转换为数据框(-- train_Data = pd.DataFrame(X_Data) --),结果是:(-- print(train_Data.shape) -- (1476, 1000) --)
  • 好吧,X_Data 列表的形状是什么,因为这是您传递模型的内容,而不是 pd 之后发生的任何事情
【解决方案2】:

我意识到容器应该是 N 维数组的形式。解决了模型输入形状的问题。但是存在精度低的问题。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多