Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 运行LSTM自动编码器时出现内存错误_Python 3.x_Keras_Sequence_Lstm_Autoencoder - Fatal编程技术网

Python 3.x 运行LSTM自动编码器时出现内存错误

Python 3.x 运行LSTM自动编码器时出现内存错误,python-3.x,keras,sequence,lstm,autoencoder,Python 3.x,Keras,Sequence,Lstm,Autoencoder,我正在设置一个具有多变量时间序列的LSTM自动编码器。我的每个序列都有不同的时间步(一个序列中大约有3000万步)和6个特征。我知道要给LSTM自动编码器输入一个序列,我必须将我的序列重塑为(1,3000万,6)。我以类似的方式重塑了我的9个序列。我想让自动编码器重建我的序列。然而,由于每个序列中有大量的时间步长,我的程序正在崩溃。如何解决此内存错误。即使我以批量大小提供数据,我的程序也会耗尽内存。我不熟悉机器学习和序列学习,请帮助我。我的网络连接如下: ` def重复_向量(args): 编码

我正在设置一个具有多变量时间序列的LSTM自动编码器。我的每个序列都有不同的时间步(一个序列中大约有3000万步)和6个特征。我知道要给LSTM自动编码器输入一个序列,我必须将我的序列重塑为(1,3000万,6)。我以类似的方式重塑了我的9个序列。我想让自动编码器重建我的序列。然而,由于每个序列中有大量的时间步长,我的程序正在崩溃。如何解决此内存错误。即使我以批量大小提供数据,我的程序也会耗尽内存。我不熟悉机器学习和序列学习,请帮助我。我的网络连接如下: `

def重复_向量(args):

编码器\输入=输入(形状=(无,自。\输入\特征))

编码器输出=LSTM(自身空间)(编码器输入)

解码器\输入=λ(重复\向量,输出\形状=(无,自。\潜在\空间))([编码器\输出,编码器\输入])

解码器输出=LSTM(自输入单元格,返回序列=True)(解码器输入)

self.\u autoencoder=型号(编码器输入,解码器输出) `


我已经尝试通过hdf文件获取输入。

我不确定您使用的是什么系统配置。OOM可以从软件和硬件两个方面解决。如果您使用的是4GB RAM和一些i5处理器(假设是intel)的系统,它可能无法工作。如果您正在使用GPU(可能性不大),那么这不应该是硬件问题

如果您的系统有图形卡,那么您可以稍微优化代码

  • 请尝试批量大小为1
  • 如果您有预处理队列等,请尝试调整队列大小
  • 我建议您在开始完整的工作之前,尝试一次较小的系列,并检查它是否有效
  • 如果你把时间步长设置得很大,它就会失去精度,如果时间步长太小,那么计算起来就很繁重。检查每一个 其中,如果时间步长可以增加,而不会造成太大的损失 精确性
  • 您可以使用PCA来了解重要特征并降低维数。还可以使用随机林作为预处理步骤 了解特征的重要性,用较少的资源减少特征 很重要

  • 嗨,谢谢你的回答。当我使用批量大小为1时,我的程序仍在运行OOM。我的功能数量已经很小(即4个)。我的序列的问题是时间步数太大(即3000万)。当我使用一个小序列(有10万个时间步)时,代码工作正常。我没有使用GPU。请尝试使用Google Colaboratory。它提供了一个免费的GPU实例。但在训练前不要关闭它。您可以转到运行时>更改运行时>硬件加速器>“使用GPU”。你可以在这里使用技巧检查colab嗨,我已经在colab上训练数据了。同样,由于时间步数的原因,它的内存不足。我是否应该将序列划分为子序列,然后将其交给lstm autoencoder?例如,如果我将序列(1,3000万,4)改为(10,300万,4),然后将其交给LSTM。但是,它会放松子序列之间的时间依赖性吗?如果是,我如何保持序列之间的依赖关系?我建议不要增加时间步长,而是打破完整的序列。在可管理的部分。在第一部分训练,然后在第二部分训练相同的模型,依此类推。这就是迁移学习。确保按时间顺序输入系列的这些部分。每次训练后,你必须保存重量,然后在第二部分训练时重新加载重量
     [layer_to_repeat, sequence_layer] = args
    
     return RepeatVector(K.shape(sequence_layer)[1])(layer_to_repeat)