gpt4 book ai didi

Tensorflow shuffle_batch 速度

转载 作者:行者123 更新时间:2023-12-05 00:52:59 27 4
gpt4 key购买 nike

我注意到,如果我将训练数据加载到内存中并将其作为 numpy 数组提供到图中,与使用相同大小的 shuffle 批次相比,速度会有很大差异,我的数据有大约 1000 个实例。

使用内存 1000 次迭代只需不到几秒钟,但使用 shuffle 批处理需要近 10 分钟。我得到 shuffle batch 应该有点慢,但这似乎太慢了。为什么是这样?

添加了赏金。关于如何更快地制作洗牌小批量的任何建议?

Here is the training data: Link to bounty_training.csv (pastebin)



这是我的代码:

shuffle_batch


import numpy as np
import tensorflow as tf

data = np.loadtxt('bounty_training.csv',
delimiter=',',skiprows=1,usecols = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))

filename = "test.tfrecords"

with tf.python_io.TFRecordWriter(filename) as writer:
for row in data:
features, label = row[:-1], row[-1]
example = tf.train.Example()
example.features.feature['features'].float_list.value.extend(features)
example.features.feature['label'].float_list.value.append(label)
writer.write(example.SerializeToString())

def read_and_decode_single_example(filename):
filename_queue = tf.train.string_input_producer([filename],
num_epochs=None)
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)

features = tf.parse_single_example(
serialized_example,
features={
'label': tf.FixedLenFeature([], np.float32),
'features': tf.FixedLenFeature([14], np.float32)})

pdiff = features['label']
avgs = features['features']

return avgs, pdiff

avgs, pdiff = read_and_decode_single_example(filename)


n_features = 14
batch_size = 1000
hidden_units = 7
lr = .001

avgs_batch, pdiff_batch = tf.train.shuffle_batch(
[avgs, pdiff], batch_size=batch_size,
capacity=5000,
min_after_dequeue=2000)

X = tf.placeholder(tf.float32,[None,n_features])
Y = tf.placeholder(tf.float32,[None,1])

W = tf.Variable(tf.truncated_normal([n_features,hidden_units]))
b = tf.Variable(tf.zeros([hidden_units]))

Wout = tf.Variable(tf.truncated_normal([hidden_units,1]))
bout = tf.Variable(tf.zeros([1]))

hidden1 = tf.matmul(X,W) + b
pred = tf.matmul(hidden1,Wout) + bout

loss = tf.reduce_mean(tf.squared_difference(pred,Y))

optimizer = tf.train.AdamOptimizer(lr).minimize(loss)

with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

for step in range(1000):
x_, y_ = sess.run([avgs_batch,pdiff_batch])

_, loss_val = sess.run([optimizer,loss],
feed_dict={X: x_, Y: y_.reshape(batch_size,1)} )

if step % 100 == 0:
print(loss_val)


coord.request_stop()
coord.join(threads)

Full batch via numpy array


"""
avgs and pdiff loaded into numpy arrays first...
Same model as above
"""
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)

for step in range(1000):
_, loss_value = sess.run([optimizer,loss],
feed_dict={X: avgs,Y: pdiff.reshape(n_instances,1)} )

最佳答案

在这种情况下,您每一步运行 session 3 次 - 一次在 avgs_batch.eval , 一次为 pdiff_batch.eval ,一次用于实际 sess.run称呼。这并不能解释放缓的幅度,但这绝对是你应该记住的事情。至少前两个 eval 调用应该合并为一个 sess.run称呼。

我怀疑大部分减速来自于使用 TFRecordReader .我不假装了解 tensorflow 的内部工作原理,但您可能会找到我的答案 here有帮助。

概括

  • 创建与每个示例相关的最少数据,即图像文件名、ID,而不是整个图像;
  • 使用 tensorflow.python.framework.ops.convert_to_tensor 转换为 tensorflow 操作;
  • 使用 tf.train.slice_input_producer获取单个示例的张量;
  • 对单个示例进行一些预处理 - 例如从文件名加载图像;
  • 使用 tf.train.batch 将它们一起批处理将它们分组。
  • 关于Tensorflow shuffle_batch 速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41866745/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com