如何在 RNN TensorFlow 中使用非常大的数据集?
How to use very large dataset in RNN TensorFlow?
我有一个非常大的数据集: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 个文件。
对于大型数据集——我们可能已经将 6.2GB 算作大数据集——一次读取所有数据可能不是最好的主意。无论如何,由于您要逐批训练您的网络,因此只需加载下一批将要使用的批次所需的数据就足够了。
tensorflow documentation 很好地概述了如何实现数据读取管道。根据链接的文档的阶段是:
- The list of filenames
- Optional filename shuffling
- Optional epoch limit
- Filename queue
- A Reader for the file format
- A decoder for a record read by the reader
- Optional preprocessing
- Example queue
我赞同 Nyps 的回答,只是我还没有足够的声誉来添加评论。此外,打开任务管理器或类似工具并在 运行 时观察系统的内存使用情况可能会很有趣。我猜想当您的 RAM 完全填满时,就是您遇到错误的时候。
TensorFlow 支持队列,允许您一次只读取部分数据,以免耗尽内存。这方面的示例在 Nyps 链接的文档中。此外,TensorFlow 最近在 TensorFlow Dataset docs.
中添加了一种处理输入数据集的新方法
此外,我建议将您的所有数据转换为 TensorFlow 的 TFRecord 格式,因为它会节省 space,并且与在训练时将 CSV 文件转换为张量相比,可以将数据访问速度提高 100 倍以上。
我有一个非常大的数据集: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 个文件。
对于大型数据集——我们可能已经将 6.2GB 算作大数据集——一次读取所有数据可能不是最好的主意。无论如何,由于您要逐批训练您的网络,因此只需加载下一批将要使用的批次所需的数据就足够了。
tensorflow documentation 很好地概述了如何实现数据读取管道。根据链接的文档的阶段是:
- The list of filenames
- Optional filename shuffling
- Optional epoch limit
- Filename queue
- A Reader for the file format
- A decoder for a record read by the reader
- Optional preprocessing
- Example queue
我赞同 Nyps 的回答,只是我还没有足够的声誉来添加评论。此外,打开任务管理器或类似工具并在 运行 时观察系统的内存使用情况可能会很有趣。我猜想当您的 RAM 完全填满时,就是您遇到错误的时候。
TensorFlow 支持队列,允许您一次只读取部分数据,以免耗尽内存。这方面的示例在 Nyps 链接的文档中。此外,TensorFlow 最近在 TensorFlow Dataset docs.
中添加了一种处理输入数据集的新方法此外,我建议将您的所有数据转换为 TensorFlow 的 TFRecord 格式,因为它会节省 space,并且与在训练时将 CSV 文件转换为张量相比,可以将数据访问速度提高 100 倍以上。