Python:为ConvNet创建具有多个通道的时间序列

Python:为ConvNet创建具有多个通道的时间序列,python,neural-network,time-series,conv-neural-network,Python,Neural Network,Time Series,Conv Neural Network,我使用卷积网络来预测时间序列。为此,我使用滚动窗口获取最后的t点,将其用作时间序列。每个功能都将是一个频道,所以我有一个多时间序列集。数据需要是三维的[n_样本、窗口大小、特征]。我拥有的原始数据集是[n_样本,特征]。数据已按时间升序排列。我的问题是,我创建3D张量的方式会使我的计算机崩溃,因为我有将近500k行。这是我正在使用的代码 prueba = x_data # This data set has shape [500k,20] window_size = 100 # I taking

我使用卷积网络来预测时间序列。为此,我使用滚动窗口获取最后的t点,将其用作时间序列。每个功能都将是一个频道,所以我有一个多时间序列集。数据需要是三维的[n_样本、窗口大小、特征]。我拥有的原始数据集是[n_样本,特征]。数据已按时间升序排列。我的问题是,我创建3D张量的方式会使我的计算机崩溃,因为我有将近500k行。这是我正在使用的代码

prueba = x_data # This data set has shape [500k,20]
window_size = 100 # I taking the last 100 days
n_units,n_features = prueba.shape
n_samples = n_units - window_size +1 # Represent the number of samples you are getting from the rolling windows.
data_list = []

for init_index in range(n_samples):

    fin_index = window_size + init_index
    window_set = prueba[init_index:fin_index,:]
    window_flat = np.reshape(window_set,(1,window_size*n_features))
    data_list.append(window_flat)

features_tensor = np.concatenate(data_list,axis = 0)
features_tensor = np.reshape(features_tensor,(n_samples,window_size,n_features)) ## This break my computer

问题是,当我使用np.concatenate将我创建的所有单个数据集放在一起时,我的计算机崩溃了。有人知道更快的方法吗。我试图用某种方式来避免使用np.concatenate,但到目前为止我还没有弄明白。

使用您在这里使用的方法(这会导致
np.concatenate
)是非常低效的,因为您要复制每个数据点(大致)
窗口大小
次。这几乎肯定是对内存的浪费,因为在理想情况下,对这个数据集执行的任何操作都应该能够在滚动的基础上执行:遍历时间序列,而不必看到张量格式的完全扩展/大量复制的数据集

因此,我建议更好的方法是首先找到一种避免构建冗余张量的方法。

因为我们不知道这个张量在做什么,所以不可能给出答案。然而,这里有几件事需要考虑:

  • 一种“正确”的方法是使用
    pandas
    ,它具有滚动窗口功能
    df.rolling()
    。这正是您想要的(在滚动窗口上执行计算,没有大的冗余张量),但当然只有在下游代码可以使用时

  • 如果您使用的是
    tensorflow
    ,那么在调用时创建一个生成器来
    生成
    窗口,可以将该窗口放入
    tf.Dataset
    (请参见
    .from_generator()
    方法和示例)会更好地为您服务

  • 在Keras中,尝试使用具有此功能的
    TimeseriesGenerator


  • 如果由于使用所有RAM而崩溃,那么考虑将数据倾倒到.NPY文件或数据库中,以将结果存储到磁盘中。我在Keras中有一个架构,我想用[n_样本、窗口大小、特征]的格式读取输入,这样我就可以将其作为模型中的输入。这就是为什么我想要完整的张量。我会研究你给我的建议。好的,在keras中,试试
    TimeseriesGenerator
    。这与我在上面给出的发电机答案相同,但是对于keras而不是tf。重点是,不需要实际创建那个大张量。我将用链接编辑我的答案。