作者:JUDGE_MENT
邮箱:gao19920804@126.com
CSDN博客:http://blog.csdn.net/sinat_23137713
最后编辑时间:2016.12.5 V1.1
声明:
1)该资料结合官方文档及网上大牛的博客进行撰写,如有参考会在最后列出引用列表。
2)本文仅供学术交流,非商用。如果不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)转载请注明出处。
4)本文主要用来记录本人初学Tensorflow时遇到的问题,特此记录下来,因此并不是所有的方法都会面面俱到。希望后人看到可以引以为鉴,避免走弯路。同时毕竟水平有限,希望有饱含学识之士看到其中的问题之后,可以悉心指出,本人感激不尽。
一. 基础
1. 头文件
import tensorflow as tf
3. 常量
是一种不需要输入值,输出是它内部储存的值得节点。
1)构建方法:
node1 = tf.constant(3.0, tf.float32) #不写float32也行,默认float32
c = tf.constant([[1.0, 2.0], [3.0, 4.0]])
print node1, 不会直接输出节点中的结果,已经被封装了,必须在会话session中运行图才能看到里面的数据。
sess = tf.Session()
print(sess.run(node1))
图可以接受外部输入,称为占位符。 占位符是对稍后提供值的承诺。
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]}))
其实占位符也算是变量,但是它只能接受外部。变量是,不解释了,你懂得
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一起读,阿里叩头~
<1>
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.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits,
训练参数有多重途径,包括自己求导自己写循环,包括用tersorflow里面的类减少循环等等。
1. tensorflow求梯度(导数)(人工求,容易错)+自己写训练循环
2. tensorflow的API函数帮你 求梯度 + 训练(优化的循环不用自己写):
1)设定一些优化器参数
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(train, {x:[1,2,3,4], y:[0,-1,-2,-3]})
疑问1:为什么优化器在不知道哪个是参数的时候,可以参数优化啊?
我开始一直有这么个疑问,都没有说哪个参数需要优化,你怎么优化的?后来发现是这样的:在minimize里面有个参数-var_list,这个参数可以输入需要优化的变量,如果不输入则默认为(TRAINABLE_VARIABLES)中的所有变量。其中这个(TRAINABLE_VARIABLES)是会在变量创立时自动收集的,设定trainable=False 可以防止该变量被数据流图的 GraphKeys.TRAINABLE_VARIABLES 收集,
这样我们就不会在训练的时候尝试更新它的值。
3. tensorflow终极:tf.contrib.learn(构建方法,损失函数...等等都不需要自己写,只需要告诉输入和输出就行)
可以用这个类帮助简化:
1)用法:
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4, num_epochs=1000)
2)虽然乍看之下这种方法很无脑,只需要输入和输出的文件,但是也可以自己建立模型输入函数中,但我感觉就不如自己全写了。
参考附录:
感谢各位无私的奉献
1) http:///26447.html
四.TersorBoard(可视化学习):用来显示图~
1. 会话session中摘要Op - >Summary函数 - >事件文件 -
summary分为多种函数,具体参考:<http://www./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. tf.neg:张量取反
2. tf.add:张量相加
3. tf.abs:张量取绝对值
4. tf.pow(x,y): 对应张量元素的x^y次方。
4. tf.reduce_sum:求张量中所有元素的和
5. tf.nn.sigmoid:
6. tf.reduce_mean: 计算张量在某一维度上的均值,因为求了某1维的均值,所以秩退化了1-reduce。
7. tf.train.RMSPropOptimizer: RMSProp的最优化算法
五. 绘图库
matplotlib.pyplot
1. subplot(numRows, numCols, plotNum):绘制包含多个子图的图表
|