Tensorflow简介
1. Tensorflow是一个编程系统,使用图来表示计算任务。使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor
, 执行计算, 产生 0 个或多个 Tensor
. 每个 Tensor 是一个类型化的多维数组. TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op。
2. Tensorflow作用
- 使用图来表示计算任务
- 在Session的上下文中执行图
- 使用tensor表示数据
- 通过Variable维护状态
- 使用feed和fetch可以任意地操作赋值或者从中获取数据
3.运作方式
-
inference()
函数会尽可能地构建图表,做到返回包含了预测结果(output prediction)的Tensor。它接受图像占位符为输入,在此基础上借助ReLu(Rectified Linear Units)激活函数,构建一对完全连接(layers),以及一个有着十个节点(node)、指明了输出logtis模型的线性层。 -
输入与占位符(Inputs and Placeholders):
placeholder_inputs()
函数将生成两个tf.placeholder
操作,定义传入图表中的shape参数,shape参数中包括batch_size
值。
在训练循环(training loop)的后续步骤中,传入的整个图像和标签数据集会被切片,以符合每一个操作所设置的batch_size
值,占位符操作将会填补以符合这个batch_size
值。然后使用feed_dict
参数,将数据传入sess.run()
函数。
- 构建图表(Build the Graph)
变量:创建、初始化、保存和加载
当训练的时候,用变量来保存和更新参数。变量包含张量(Tensor)存放于内存的缓冲区。
创建
-
tf.Variable
import tensorflow as tf weights = tf.Variable(tf.random_normal([784,200], stddev=0.35), name = "weights") # 权重
初始化
-
有时候需要由另一个变量的初始化值给当前变量初始化,
tf.initialize_all_variables()
是并行地初始化所有变量,所以在有这种需求的情况下需要小心!用其它变量的值初始化一个新的变量时,使用其它变量的initialized_value()
属性。你可以直接把已初始化的值作为新变量的初始值,或者把它当做tensor计算得到一个值赋予新变量。# 承接上面创建的变量weights w2 = tf.Variable(weights.initialized_value(), name = 'w2')
-
自定义初始化。
tf.initialized_all_variables()
函数添加一个op来初始化变量模型的所有变量。
保存和加载
最简单的保存和恢复模型的方法是使用tf.train.Saver
对象。构造器给graph的所有变量,或是定义在列表里的变量,添加save
和restore
ops。saver对象提供了方法来运行这些ops,定义检查点文件的读写路径。
-
检查点文件
变量存储在二进制文件里,主要包含从变量名到tensor值的映射关系。当创建一个Saver对象时,默认情况下,将每个变量Variables.name属性的值。
-
保存变量
tf.train.Saver()
创建一个saver对象来管理所有的变量# Create all variables v1 = tf.Variable(..., name= 'v1') v2 = tf.Variable(..., name='v2') # Add an op to initialize the variables init_op = initialized_all_variables() # Add ops to save and restore all the variables saver() = tf.train.Saver() # Later, launch the model, initialize the variables, do some work,save the variables to disk. with tf.Session() as sess: sess.run() #..do some work with the model.. save_path = saver.save(sess, '/tmp/model.ckpt') print('Model saved in file:', save_path)
-
恢复变量
恢复变量使用同一个Saver对象来恢复对象。
saver.restore()
恢复变量。
数据读取
Feeding Data
Tensorflow的feeding机制允许在tensorflow运算图中将数据注入到任意一个张量中。通过run()
或者eval()
函数输入feed_dict
参数
with tf.Session() as tf:
input = tf.placeholder(tf.float32)
classifer = ...
print(classifer.eval(feed_dict={
input:my_python_preprocessing_fn()}))
从文件中读取数据的步骤
-
- 文件名列表:可以使用字符串张量(比如
["file0", "file1"]
,[("file%d" % i) for i in range(2)]
,[("file%d" % i) for i in range(2)]
) 或者tf.train.match_filenames_once
函数来产生文件名列表。
- 文件名列表:可以使用字符串张量(比如
-
- 可配置的文件名乱序(shuffling):
string_input_producer
提供的可配置参数来设置文件名乱序和最大的训练迭代数,QueueRunner
会为每次迭代(epoch)将所有的文件名加入文件名队列中, 如果shuffle=True
的话, 会对文件名进行乱序处理。这一过程是比较均匀的,因此它可以产生均衡的文件名队列。 - 可配置的最大训练迭代次数(epoch limit)
- 文件名队列
- 针对输入文件格式的阅读器
- 解析器
- 可配置的预处理器
- 样本队列
- 可配置的文件名乱序(shuffling):
不同文件格式的数据读取
不同的文件格式,需要选择不同的文件阅读器,然后将文件名队列提供给阅读器的read()方法。
-
CSV文件
需要用到
textLineReader()
、decode_csv()
每次
read
的执行都会从文件中读取一行内容,decode_csv
操作会解析这一行内容并将其转为张量列表。如果输入的参数有缺失,record_default
参数可以根据张量的类型来设置默认值。在调用
run
或者eval
去执行read
之前, 你必须调用tf.train.start_queue_runners
来将文件名填充到队列。否则read
操作会被阻塞到文件名队列中有值为止。# 使用string_input_producer来生成一个先入先出的队列 filename_queue = tf.train.string_input_producer(['file0.csv', 'file1.csv']) # 使用阅读器读取 reader = tf.TextLineReader() key,value = reader.read(filename_queue) # decord result recorde_defaults = [[1], [1], [1], [1], [1]] col1,col2,col3,col4,col5 =