作者:JUDGE_MENT
一. 基础
1. 头文件
import tensorflow as tf2. 整体使用过程
1)建立图2)运行图
3. 常量
是一种不需要输入值,输出是它内部储存的值得节点。1)构建方法:
node1 = tf.constant(3.0, tf.float32) #不写float32也行,默认float32
c = tf.constant([[1.0, 2.0], [3.0, 4.0]])
2)查看数据
print node1, 不会直接输出节点中的结果,已经被封装了,必须在会话session中运行图才能看到里面的数据。
sess = tf.Session()
print(sess.run(node1))
4. 外部输入:占位符
图可以接受外部输入,称为占位符。 占位符是对稍后提供值的承诺。1)构建方法:
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
2)给占位符以数据
print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))
5. 变量
其实占位符也算是变量,但是它只能接受外部。变量是,不解释了,你懂得1)构建方法:
需要一个类型和初始值
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
c= tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="c")# 随机初始化,高斯分布
d= tf.Variable(c.initialized_value() * 0.2, name="d")# 从另一变量初始化,需要加上.initialized_value()
x = tf.placeholder(tf.float32)
linear_model = W * x + b
2)初始化变量(也可以用来重置,恢复到默认变量):
当调用tf.constant时,常量被初始化,它们的值永远不会改变。 相比之下,当调用tf.Variable时,变量不会被初始化。
如下,初始化TensorFlow中的所有变量(在run之后才初始化):
init = tf.global_variables_initializer()
sess.run(init)
3)查看数据:
教你三种方法查看数据,快谢谢我,1,2,3一起读,阿里叩头~
sess = tf.Session()
print(sess.run(W))
<2>
sess = tf.Session()
print(v.eval(sess))
<3>
with tf.Session() as sess:
print(v.eval()) #在with旗下可以省略sess
4)查看属性:
W.get_shape() # 查看张量的形状
5)下标引用:
W[2]
6)变量重新赋值:
fixW = tf.assign(W, [-1.])
sess.run(fixW)
7)训练过程中保存变量到本地,读取变量
创建保存节点:
saver = tf.train.Saver(<可以只选择变量保存/如果为空,默认保存全部变量>)
选择部分变量,可以传入字典,例:
saver = tf.train.Saver({"my_v2": v2}) # 把v2变量进行储存,储存为my_v2这个变量名称
保存变量:
saver.save(<sess需要保存的会话>, <保存路径>, global_step=<第几步的迭代器>)
读取变量:
saver.restore(<sess变量恢复到会话>, <读取的地址>)
注意,当你从文件中恢复变量时,不需要事先对它们做初始化(不需要global_vatiables_initializer)。
二. 评估模型:损失函数
1. 损失函数可以自己建造一个,如平方差损失函数
y = tf.placeholder(tf.float32)# y是目标值squared_deltas = tf.square(linear_model - y)# 偏差的进行平方
loss = tf.reduce_sum(squared_deltas)# 平方后进行求和
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]})) # loss调用linaear_model,linear_model调用了x(在5.1),所以要输入x和y
2.使用tf内部的交叉熵损失函数:
tf.nn.sigmoid_cross_entropy_with_logits(logits, labels)
例如这个模型一次要判断100张图是否包含10种动物,则logits和labels输入的shape都是[100, 10]。注释中还提到这10个分类之间是独立的、不要求是互斥。
tf.nn.sigmoid_cross_entropy( )
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits(logits,labels)
有sparse的label是[100,1]这个尺寸,每个label是一个数字0~任何的数字。
tf.nn.weighted_cross_entropy_with_logits,
参考:http://www.tuicool.com/articles/n22m2az
三. 训练参数
训练参数有多重途径,包括自己求导自己写循环,包括用tersorflow里面的类减少循环等等。1. tensorflow求梯度(导数)(人工求,容易错)+自己写训练循环
tf.gradientstf.AggregationMethod
tf.stop_gradient
tf.hessians
2. tensorflow的API函数帮你 求梯度 + 训练(优化的循环不用自己写):
1)设定一些优化器参数optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
2)运行,迭代获取最优参数
for i in range(1000):
sess.run(train, {x:[1,2,3,4], y:[0,-1,-2,-3]})
3)输出最后的参数结果
print(sess.run([W, b]))
疑问1:为什么优化器在不知道哪个是参数的时候,可以参数优化啊?
我开始一直有这么个疑问,都没有说哪个参数需要优化,你怎么优化的?后来发现是这样的:在minimize里面有个参数-var_list,这个参数可以输入需要优化的变量,如果不输入则默认为(TRAINABLE_VARIABLES)中的所有变量。其中这个(TRAINABLE_VARIABLES)是会在变量创立时自动收集的,设定trainable=False
可以防止该变量被数据流图的 GraphKeys.TRAINABLE_VARIABLES
收集, 这样我们就不会在训练的时候尝试更新它的值。3. tensorflow终极:tf.contrib.learn(构建方法,损失函数...等等都不需要自己写,只需要告诉输入和输出就行)
可以用这个类帮助简化:- 训练的循环
- 评估的循环
- 管理数据集
- 管理反馈
2)虽然乍看之下这种方法很无脑,只需要输入和输出的文件,但是也可以自己建立模型输入函数中,但我感觉就不如自己全写了。
四. TersorBoard
1. 会话session中摘要Op - >Summary函数 - >事件文件 -
summary分为多种函数,具体参考:<http://www.tensorfly.cn/tfdoc/api_docs/python/train.html#AUTOGENERATED-summary-operations>
2. tf.merge_all_summaries( 合并汇总,似乎就是把当前的要输出的信息全都整合到一起 ) - >变成protobuf对象 - >tf.train.Summarywriter( <logdir磁盘目录>, <GraphDef> ) - > 将proto对象写入磁盘
3. 启动tensorboard
python tensorflow/tensorboard/tensorboard.py --logdir=<之前proto对象输出的地址,也就是日志目录>
localhost:6006
来查看 TensorBoard五. 保存检查点
用来保存模型1. 创建
saver = tf.train.Saver()
2. 保存检查点
saver.save(sess, FLAGS.train_dir, global_step=step)
3. 读取检查点数据
saver.restore(sess, FLAGS.train_dir)
参考附录:
感谢各位无私的奉献
1) http://dataunion.org/26447.html