站浏览量 站访问人数
目录
  1. 1. 最初的话
  2. 2. 开始写tensorflow程序
    1. 2.1. 张量
  3. 3. 常用初始化
  4. 4. 其他函数
  5. 5. 总结

tensorflow学习笔记系列原始内容,可从CS 20SI: Tensorflow for Deep Learning Research。另还有几本关于tensorflow的书籍,比如tensorflow实战,tensorflow解析等。感谢把知识分享出来的各位大牛。

最初的话

tensorflow是一个深度学习开源库,大多学习深度学习,会建议从tensorflow的官方文档开始学习,当然可以看一些机器学习的书籍。对于tensorflow的作用,为什么要使用它,不再论述。一个工具能够解决实际问题,并能稳定快速可靠实现业务就是好的工具。深度学习还有其他很多工具可供使用。

开始写tensorflow程序

当然得安装tensorflow,很多教程,也可以看官网,我是在windows下安装tensorflow的,使用cpu版本,python3.5;

tensor和flow是两个概念,tensor是张量,多维数组;flow是流,标示张量的计算过程。tensorflow用图方式表达计算过程。一个计算图中的张量和运算相互独立,不共享,图也可以指定资源设备。

会话session,一个会话占用运行的资源,会话关闭后,资源回收;常用并建议使用的会话方式:

1
2
3
4
with tf.Session() as sess:
...
sess.run()
...

不用再用session().close,关闭,不用考虑异常导致资源释放的问题,

张量

0阶张量是一个数;1阶张量是一个一维数组;2阶是矩阵。在tensorflow中,张量含:名字,维度,类型三个属性。张量保存计算数字的过程,不实际存数字。

1
2
3
4
5
6
7
8
9
import tensorflow as tf

a = tf.constant(2)
b = tf.constant(3)
x = tf.add(a, b)
with tf.Session() as sess:
writer = tf.summary.FileWriter('./graphs', sess.graph)
print sess.run(x)
writer.close()

张量运算类型必须一致;名字’node:src_output’,节点名:节点的第几个输出。张量在计算过程当引用(其实就是变量),方便简写代码;以及最后的调用。

常用初始化

tensorflow编写神经网络,离不开参数的设置以及初始化,当然输入的格式以及feed(喂数据,在训练时把训练数据输进模型,一般叫喂数据)时需要定义。

常用的一些初始化如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

tf.constant(value, dtype=None, shape=None,name='Const', verify_shape=False)

常量,需要在session中执行

tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros([2, 3], tf.int32)

tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
把输入的tensor形状全部元素置成0,不改变原来的tensor形状类型

tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)
同理于zeros

f.fill(dims, value, name=None)
在dims的形状中填充单独的元素value,全部元素相同

tf.linspace(start, stop, num, name=None)
tf.linspace(10.0, 13.0, 4)

tf.range(start, limit=None, delta=1, dtype=None, name='range')
tf.range(start, limit, delta)
tf.range(limit)

初始化随机值,
正太分布随机,均值mean,标准差stddev,
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
截断正太分布,均值mean,标准差stddev,只保留[mean-2*stddev,mean+2*stddev]范围内的随机数
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None,name=None)
均匀分布随机,范围在[minval,maxval]
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None,name=None)
沿着要打乱的张量第一个维度,随机打乱,
tf.random_shuffle(value, seed=None, name=None)
随机裁剪,用于图像的分割,
tf.random_crop(value, size, seed=None, name=None)

tf.multinomial(logits, num_samples, seed=None, name=None)
伽马分布随机,
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)
根据随机种子随机,
tf.set_random_seed(seed)

常量是一直存储在图中的,占用内存,

变量,tensorflow中变量定义后,需要在session中执行初始化,可以全部一次性,单个或多个执行,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Variable是一个类,而constant是一个操作,Variable的操作还有其他如下,
x.initializer # init op
x.value() # read op
x.assign(...) # write op
x.assign_add(...) # and more

全部变量一次性执行初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)

执行初始化若干个
init_ab = tf.variables_initializer([a, b], name="init_ab")
with tf.Session() as sess:
sess.run(init_ab)

执行初始化单个
W = tf.Variable(tf.zeros([784,10]))
with tf.Session() as sess:
sess.run(W.initializer)

数据加载,常在训练数据输入使用placeholders,喂数据用,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tf.placehoders(dtype,shape=None,name=None)

如果使用tf.placehoders后,必须feed值,不然出错。

shape可以None,即接收任何形状的数据,根据给定数据形式确定形状,
placehoders可以认为是一个操作,

feed多个数据,使用for
with tf.Session() as sess:
for a_value in list_of_values_for_a:
print sess.run(c, {a: a_value}) #a是tensor的key,不是字符串a,

tf.Graph.is_feedable(tensor)
判断一个tensor是否可以feed数据进去,是则返回true

下面是一个简单的例子,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf

'''
从给出的图结构,写出代码,

'''
a = tf.constant(2,name='a')
b = tf.constant(3,name='b')
x = tf.add(a,b,name='x')
y = tf.multiply(a,b,name='y')
useless = tf.multiply(a,x,name='useless')
z = tf.pow(y, x, name='z')
with tf.Session() as sess:
writer = tf.summary.FileWriter('./graphs',sess.graph)
z = sess.run(z)
writer.close()

运行tensorflow程序
D:\programs\python35\python yourTensorflowProgram.py

启动tensorboard查看运行的参数变化
D:\programs\python35\Scripts\tensorboard –logdir=”./graphs”
写入日志的文件目录

其他函数

1
2
3
1,交叉熵
y_ = tf.placeholder(tf.float32,[None,10]) #真实的,y是预测的
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))

总结

tensorflow基于张量(即数组,多维的)计算,
可先定义图,计算的结构和流程;然后在会话中执行;
变量,Variable,输入样本placehoders。