马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 alltolove 于 2018-11-27 19:17 编辑
tensorflow读取数据的方法很多,有多线程队列的方法:import tensorflow as tf
import sys
q = tf.FIFOQueue(10, "float")
counter = tf.Variable(0.0) #计数器
# 给计数器加一
increment_op = tf.assign_add(counter, 1.0)
# 将计数器加入队列
enqueue_op = q.enqueue(counter)
# 创建QueueRunner
# 用多个线程向队列添加数据
# 这里实际创建了4个线程,两个增加计数,两个执行入队
qr = tf.train.QueueRunner(q, enqueue_ops=[increment_op, enqueue_op] * 2)
# 主线程
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
# 启动入队线程
qr.create_threads(sess, start=True)
for i in range(20):
print (sess.run(q.dequeue()))
还有随机读取数据的方法:import tensorflow as tf
q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=0, dtypes="string")
enqueue_op = q.enqueue(['aaa','bbb'])
qr = tf.train.QueueRunner(q, enqueue_ops=[enqueue_op] * 1)
sess = tf.Session()
coord = tf.train.Coordinator()
enqueue_threads = qr.create_threads(sess, start=True,coord=coord)
try:
for i in range(100):
print(sess.run(q.dequeue()))
if i>=50:
coord.request_stop()
coord.join(enqueue_threads)
print(i)
except tf.errors.OutOfRangeError:
print('Done training -- epoch limit reached')
finally:
coord.request_stop()
coord.join(enqueue_threads)
还有读取文件的方法:import tensorflow as tf
train_filenames=['data_batch_%d'%i for i in range(1,6)]
q = tf.FIFOQueue(capacity=5, dtypes=tf.string, name="queue")
init = q.enqueue_many((train_filenames,))
x = q.dequeue()
with tf.Session() as sess:
# 运行初始化队列的操作。
init.run()
for i in range(5):
# 运行q_inc将执行数据出队列,出队的元素值加1,重新加入队列的整个过程。
v= sess.run(x)
# 打印出队元素的值。
print(v)
还有反正是各种用线程读数据方法:import tensorflow as tf
import numpy as np
queue = tf.FIFOQueue(100, tf.float32)
enqueue_op = queue.enqueue([[1]])
qr = tf.train.QueueRunner(queue, [enqueue_op]*5)
tf.train.add_queue_runner(qr)
out_tensor = queue.dequeue()
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(6):
print(sess.run(out_tensor)[0])
coord.request_stop()
coord.join(threads)
以上这些方法都是太深奥了,没有多少人会用,对于我这个连入门都不算的新手来说更是没法用。
现在我主要用的是dataset方法,代码如下:import tensorflow as tf
import numpy as np
BATCH_SIZE = 5
x = np.array([
[100,2,2,3],
[200,1,1,1],
[300,2,2,2],
[400,21,1,1]
])
y = np.array([
[100,2,2,3],
[200,1,1,1],
[300,2,2,2],
[400,21,1,1]
])
dataset = tf.data.Dataset.from_tensor_slices({'x':x,'y':y})
dataset = dataset.shuffle(buffer_size=4)
dataset=dataset.batch(BATCH_SIZE)
dataset=dataset.repeat()
iter = dataset.make_one_shot_iterator()
el = iter.get_next()
with tf.Session() as sess:
for i in range(6):
print('x',sess.run(el)['x'])
print('y',sess.run(el)['y'])
这种方法有个坑,就是x和y随机shuffle的数据不统一,x和y都是各自随机的。 |