如何在 RNN TensorFlow 中使用非常大的数据集?

Posted

技术标签:

【中文标题】如何在 RNN TensorFlow 中使用非常大的数据集?【英文标题】:How to use very large dataset in RNN TensorFlow? 【发布时间】:2017-12-31 03:00:47 【问题描述】:

我有一个非常大的数据集:7.9 GB 的 CSV 文件。其中80%作为训练数据,剩下的20%作为测试数据。当我加载训练数据(6.2 GB)时,我在第 80 次迭代(第 80 个文件)有MemoryError。这是我在加载数据时使用的脚本:

import pandas as pd
import os

col_names = ['duration', 'service', 'src_bytes', 'dest_bytes', 'count', 'same_srv_rate',
        'serror_rate', 'srv_serror_rate', 'dst_host_count', 'dst_host_srv_count',
        'dst_host_same_src_port_rate', 'dst_host_serror_rate', 'dst_host_srv_serror_rate',
        'flag', 'ids_detection', 'malware_detection', 'ashula_detection', 'label', 'src_ip_add',
        'src_port_num', 'dst_ip_add', 'dst_port_num', 'start_time', 'protocol']

# create a list to store the filenames
files = []

# create a dataframe to store the contents of CSV files
df = pd.DataFrame()

# get the filenames in the specified PATH
for (dirpath, dirnames, filenames) in os.walk(path):
    ''' Append to the list the filenames under the subdirectories of the <path> '''
    files.extend(os.path.join(dirpath, filename) for filename in filenames)

for file in files:
    df = df.append(pd.read_csv(filepath_or_buffer=file, names=col_names, engine='python'))
    print('Appending file : file'.format(file=files[index]))

pd.set_option('display.max_colwidth', -1)
print(df)

在 6.2 GB 的 CSV 文件中有 130 个文件。

【问题讨论】:

如何处理 TB 级数据? 【参考方案1】:

对于大型数据集 - 我们可能已经将 6.2GB 计算为大 - 一次读取所有数据可能不是最好的主意。由于您无论如何都要逐批训练您的网络,因此只加载您需要的数据以用于接下来要使用的批次就足够了。

tensorflow documentation 很好地概述了如何实现数据读取管道。根据链接的文档的阶段是:

    文件名列表 可选的文件名改组 可选的历元限制 文件名队列 文件格式的阅读器 读取器读取记录的解码器 可选预处理 示例队列

【讨论】:

如何处理 TB 级数据? @RemisHaroon 相同的答案:批量处理您的数据。如果由于内存限制甚至无法加载单个文件,请尝试拆分数据文件并考虑更有效的数据表示。 好的,拆分数据,但是如何?手动?还是已经有工具了? ,好的,那么拆分之后呢?按顺序处理批次?还是并行分布式方式?有没有任何工具/框架?【参考方案2】:

我支持 Nyps 的回答,我只是还没有足够的声誉来添加评论。此外,您可能会感兴趣的是打开任务管理器或同等功能,并在运行时观察系统的已用内存。我猜当你的 RAM 完全填满时,你就会遇到错误。

TensorFlow 支持队列,它允许您一次只读取部分数据,以免耗尽您的内存。 Nyps 链接的文档中有这方面的示例。此外,TensorFlow 最近在TensorFlow Dataset docs 中添加了一种处理输入数据集的新方法。

另外,我建议将所有数据转换为 TensorFlow 的 TFRecord 格式,因为它可以节省空间,并且与在训练时将 CSV 文件转换为张量相比,可以将数据访问速度提高 100 倍以上。

【讨论】:

谢谢你,@John Scolaro。甚至在我在这里提出问题之前,我就已经在阅读 Nyps 发布的文档了。但是还没有读完。谢谢你们俩! :) 观察内存绝对是个好点。有人可能会提到,8GB 的​​ RAM 通常不足以加载 6.xGB 的数据,因为 RAM 也被其他程序使用。 是的。 :) 尤其是 CSV 文件,因为 TensorFlow 中的 CSV 处理函数又增加了更多开销。 我现在正在编写一个脚本来将我的 CSV 文件转换为 TFRecords。谢谢!很快就会更新你! :) 祝朋友好运!

以上是关于如何在 RNN TensorFlow 中使用非常大的数据集?的主要内容,如果未能解决你的问题,请参考以下文章

如何用TensorFlow构建RNN

如何用TensorFlow构建RNN

如何将 TensorFlow 图(模型)拆分到多个 GPU 上以避免 OOM?

TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?

在 Tensorflow 中生成特殊输出词后如何停止 RNN?

TensorFlow:递归神经网络(RNN与LSTM)