tensorflow - 使用 feed_dict 比使用数据集 API 快 5 倍以上?
问题描述
我创建了一个 TFRecord 格式的数据集进行测试。每个条目包含 200 列,命名为C1
- C199
,每列是一个字符串列表,以及一个label
表示标签的列。创建数据的代码可以在这里找到:https ://github.com/codescv/tf-dist/blob/8bb3c44f55939fc66b3727a730c57887113e899c/src/gen_data.py#L25
然后我使用线性模型来训练数据。第一种方法如下所示:
dataset = tf.data.TFRecordDataset(data_file)
dataset = dataset.prefetch(buffer_size=batch_size*10)
dataset = dataset.map(parse_tfrecord, num_parallel_calls=5)
dataset = dataset.repeat(num_epochs)
dataset = dataset.batch(batch_size)
features, labels = dataset.make_one_shot_iterator().get_next()
logits = tf.feature_column.linear_model(features=features, feature_columns=columns, cols_to_vars=cols_to_vars)
train_op = ...
with tf.Session() as sess:
sess.run(train_op)
完整的代码可以在这里找到:https ://github.com/codescv/tf-dist/blob/master/src/lr_single.py
当我运行上面的代码时,我得到 0.85 步/秒(批量大小为 1024)。
在第二种方法中,我手动将数据集中的批次放入 python,然后将它们提供给占位符,如下所示:
example = tf.placeholder(dtype=tf.string, shape=[None])
features = tf.parse_example(example, features=tf.feature_column.make_parse_example_spec(columns+[tf.feature_column.numeric_column('label', dtype=tf.float32, default_value=0)]))
labels = features.pop('label')
train_op = ...
dataset = tf.data.TFRecordDataset(data_file).repeat().batch(batch_size)
next_batch = dataset.make_one_shot_iterator().get_next()
with tf.Session() as sess:
data_batch = sess.run(next_batch)
sess.run(train_op, feed_dict={example: data_batch})
完整的代码可以在这里找到:https ://github.com/codescv/tf-dist/blob/master/src/lr_single_feed.py
当我运行上面的代码时,我得到 5 步/秒。这比第一种方法快 5 倍。这是我不明白的,因为理论上第二个应该会因为数据批次的额外序列化/反序列化而变慢。
谢谢!
解决方案
推荐阅读
- c++ - 从 C++ 调用汇编程序函数,链接错误
- php - 正则表达式获取文件名中的维度
- node.js - 在学校项目“分布式计算”中计算什么?(有用)
- php - 数组foreach形成显示并得到相同的结果
- bash - 计算多个子目录中每个文件的行数
- excel - VBA:将数据从源工作簿复制并粘贴到目标工作表如果它们的单元格“A1”值彼此相等
- node.js - 反应:npm start - windows 找不到本地主机
- python - 如果使用 -t 选项,PIP 如何知道 Python 是 32 位还是 64 位?
- node.js - Nodejs等待功能问题
- python - 如何使用 python CLI 打开子屏幕?