1、Preload方式
将数据直接内嵌到Graph中,再把Graph传入Session中运行。当数据量比较大时,Graph的传输会遇到效率问题。
1
2
3
4
5
6
7
8
|
import
tensorflow as tf
# 设计训练模型Graph
x1
=
tf.constant([
2
,
3
,
4
])
x2
=
tf.constant([
4
,
0
,
1
])
y
=
tf.add(x1, x2)
# 打开一个session --> 计算y
with tf.Session() as sess:
print
(sess.run(y))
|
输出:
[6 3 5]
注:在设计Graph的时候,x1和x2就被定义成了两个有值的列表,在计算y的时候直接取x1和x2的值。
2、Feeding方式
用占位符替代数据,待运行的时候填充数据。
1
2
3
4
5
6
7
8
9
10
11
|
import
tensorflow as tf
# 设计Graph
x1
=
tf.placeholder(tf.int32)
x2
=
tf.placeholder(tf.int32)
y
=
tf.add(x1, x2)
# 用Python产生数据
input1
=
[
2
,
3
,
4
]
input2
=
[
4
,
0
,
1
]
# 打开一个session --> 喂数据 --> 计算y
with tf.Session() as sess:
print
(sess.run(y, feed_dict
=
{x1: input1, x2: input2}))
|
输出:
[6 3 5]
注:在这里x1, x2只是占位符,没有具体的值,那么运行的时候就要用到sess.run()中的feed_dict参数,将Python产生的数据喂给后端,并计算y。
3、Reading From File
前两种方法很方便,但是遇到大型数据的时候就会很吃力,即使是Feeding,中间环节的增加也是不小的开销,比如数据类型转换等等。最优的方案就是在Graph定义好文件读取的方法,让TF自己去从文件中读取数据,并解码成可使用的样本集。
首先由一个单线程把文件名堆入队列,两个Reader同时从队列中取文件名并读取数据,Decoder将读出的数据解码后堆入样本队列,最后单个或批量取出样本(图中没有展示样本出列)。
3.1 单个Reader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import
tensorflow as tf
# 生成一个先入先出队列和一个QueueRunner
filenames
=
[
'A.csv'
,
'B.csv'
,
'C.csv'
]
filename_queue
=
tf.train.string_input_producer(filenames, shuffle
=
True
)
# 定义Reader
reader
=
tf.TextLineReader()
key, value
=
reader.read(filename_queue)
# 定义Decoder
record_defaults
=
[[
'null'
], [
'null'
]]
col1, col2
=
tf.decode_csv(value, record_defaults)
# 运行Graph
with tf.Session() as sess:
# 创建一个协调器,管理线程
coord
=
tf.train.Coordinator()
# 启动QueueRunner, 此时文件名队列已经进队
threads
=
tf.train.start_queue_runners(coord
=
coord)
# 取样本的时候,一个Reader先从文件名队列中取出文件名,读出数据,Decoder解析后进入样本队列
for
i
in
range
(
10
):
print
(col1.
eval
(),col2.
eval
())
coord.request_stop()
coord.join(threads)
|
输出:
b'Sea1' b'C2'
b'Sea3' b'A1'
b'Alpha2' b'A3'
b'Bee1' b'B2'
b'Bee3' b'C1'
b'Sea2' b'C3'
b'Alpha1' b'A2'
b'Alpha3' b'B1'
b'Bee2' b'B3'
b'Bee1' b'B2'
3.2 单个Reader
本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1910372,如需转载请自行联系原作者