【问题标题】:How to efficiently read specific lines of a CSV?如何有效地读取 CSV 的特定行?
【发布时间】:2018-07-16 20:38:22
【问题描述】:

我正在使用约 5,000,000 行的训练集训练 Keras 神经网络模型。我一次只读取该文件的几行,以便使用类似于以下的代码进行训练:

n_lines = 5000000
skiprows = np.delete(np.arange(1, n_lines), np.arange(first_line, first_line+batch_size))

X = pd.read_csv('training.csv', skiprows=skiprows)

X 上执行一些转换,然后使用model.train_on_batch(X, y) 将其传递给模型。

我认为这是目前我的训练过程中的瓶颈,所以我想知道是否有更有效的方法来实现这一点。

我定时检查差异(training_data.csv 有 50,000 行):

pd.read_csv('training_data.csv') # 0.86 seconds

n_batches = 1000
for i in range(n_batches):
    skiprows = np.delete(np.arange(1, 50000), np.arange(i*50, (1+i)*50))
    pd.read_csv('training_data.csv', skiprows=skiprows)
# 152.23 seconds to iterate through all 1000 batches

【问题讨论】:

  • 你能添加更多代码吗?你在用 X 做什么?
  • 你确定这是瓶颈吗?深度学习是一个计算成本很高的过程。
  • @VikasNS X 最终传递给 Keras model.train_on_batch 调用。
  • @ncfirth 当我将整个数据子集(比如 50,000 行)加载到内存中时,训练相同的模型要快得多。使用此方法生成一批 10 个样本大约需要 12 秒。
  • 我很困惑,如果我错了,请纠正我。您对更多数据的培训,因此需要更多时间?如果您面临内存问题,那么您应该自定义生成器来加载数据并使用 model.fit_on_generator()

标签: python pandas keras


【解决方案1】:

我相信我找到了一种可以使用pd.read_csvchunksize 参数的方法。

for batch in pd.read_csv('training_data.csv', chunksize=50):
    # transform/reshape batch
    #model.train_on_batch(batch, y)
    next

这会在大约 3.86 秒内读取 1,000 个大小为 50 的批次,并允许我使用 train_on_batch 方法。我仍然需要找到更好的方法来读取y 数据,但我想我可能会考虑将Xy 存储在单个csv 中并使用chunksize

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多