LSTM输入数据准备和定义(Python)

LSTM输入数据准备和定义(Python),python,tensorflow,keras,lstm,spyder,Python,Tensorflow,Keras,Lstm,Spyder,每个时间步对应一个浮点数据。每个记录数据是由1000个浮点数组成的数组。不记录时间,但在阵列中每次记录数据之间的时间间隔为0.1秒 我希望准备数据并将其存储在适当的容器中,然后将其传递给LSTM模型 一次未指定精确的0.1秒持续时间,另一次考虑持续时间 我所做的: 我从.mat文件读取数据,并将每个1000浮点数组追加到列表中: max_Value = [] min_Value = [] scale = 2.6 X_Data=[] Y_Data=[] epochs_Num = 10 batch_

每个时间步对应一个浮点数据。每个记录数据是由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)
文件“C:\Python\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第827行,在runfile中
execfile(文件名、命名空间)
execfile中的文件“C:\Python\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第110行
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“C:/Users/Light/Desktop/signature/Test01.py”,第139行,在
回调=[tensorboard])
文件“C:\Python\Anaconda3\lib\site packages\tensorflow\u core\Python\keras\engine\training.py”,第728行,在fit中
使用多处理=使用多处理)
文件“C:\Python\Anaconda3\lib\site packages\tensorflow\u core\Python\keras\engine\training\u v2.py”,第224行
分销(策略=策略)
文件“C:\Python\Anaconda3\lib\site packages\tensorflow\u core\Python\keras\engine\training\u v2.py”,第516行,进程\u培训\u输入
步长=步长(每个历元)
文件“C:\Python\Anaconda3\lib\site packages\tensorflow\u core\Python\keras\engine\training.py”,第2472行,在用户数据中
异常(前缀为“输入”)
标准化输入数据中的文件“C:\Python\Anaconda3\lib\site packages\tensorflow\u core\Python\keras\engine\training\u utils.py”,第565行
“带形状”+str(数据形状))
ValueError:检查输入时出错:预期lstm_输入有3个维度,但得到了形状为(1000,1)的数组


这是因为您需要给它一个能够成批处理的输入。您已经给了它
(1000,1)
,它似乎对应于您的一个数据样本。Keras希望它是
(批次/样本、时间、频道)
,您可以使用
(样本数,1000,1)
。这是预期的3个维度


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

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

什么是批处理数?批处理数=64和纪元数=10这与之前发布的导致代码的问题不同。请在你的帖子中澄清新的错误是什么。在您之前,我们使用(1000,1)的形状。请提供一个明确的可复制版本的问题与最小的变化,请让我们可以在这个问题上的工作。第一篇文章已经更新。已添加有关Spyder控制台中显示的错误的其他信息。(除了LSTM输入形状参数外,我没有更改代码。‘只需尝试并出错’)请尝试将扩展数据的第三维扩展为1而不是无。这可能有点棘手,因为您正在使用列表。我强烈建议转换为数组。使用列表可能没有帮助,甚至可能是问题所在。myModel.add(LSTM(256,批处理输入形状=(14761000,1),activation='relu',return\u sequences=True))感谢您的回复。上面的语句也会导致错误。我可以请你为我的问题提供适当的例子吗?(我已经更新了第一篇帖子,请检查图片,谢谢)你能打印X_数据吗?shape和post outputX_数据是一个列表对象,没有shape属性。但我也将其转换为数据帧(--train_data=pd.DataFrame(X_data)--),结果是:(--print(train_data.shape)--(14761000)--)好的,X_数据列表的形状是什么,因为这是传递模型的,而不是pd之后发生的任何事情