Tensorflow基本操作
|
|
或者这样写更好:
Session对象封装了Operation对象的执行环境和Tensor对象的验证。
更复杂的图的例子
API: tf.Session.run(fetches, feed_dict=None,options=None,rum_metadata=None)
将所有你想要的值的变量传递给一个列表。
Tensorflow支持多GPU计算,可以将构建的图分成几个大块并在多个GPU或者CPU或者其他设备上进行并行计算。
指定特定GPU的方法:
tf.Graph()
向一个图中添加操作,并将图设置为默认:
使用一下语句得到默认的图:
注意不要将默认图和用户自定义的图混合。
使用图的优点
1、节约计算资源,每次运算仅仅只需运行与结果有关的子图
2、可以将图分成小块进行自动微分
3、方便部署在多个设备上
4、很多机器学习算法都能够被可视化为图的结构
Tensorboard简单使用
Tensorboard用于可视化训练过程中的一些数据
|
|
注意是在建立图之后,运行Session之前进行summary操作。
采用以下命令查看Tensorboard可视化结果:
$ python [yourprogram].py
$ tensorboard —logdir=’./graph’ —port 6006
然后在相应浏览器地址打开即可看到可视化结果。
为了让可视化结果更清晰,可给操作和节点命名。
如下所示
|
|
总之,Tensorboard是一个十分强大的工具,特别是对于分析复杂的网络结构以及观察网络训练过程特别有用。
常用API
1、tf.constant(value, dtype=None, shape=None, name=’Const’,verify_shape=False)
2、tf.zeros(shape, dtype=tf.float32, name=None)
3、tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
4、tf.ones(shape, dtype=tf.float32, name=None)
5、tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)
6、tf.fill(dims, value, name=None)
7、tf.linspace(start, stop, num, name=None)
8、tf.range(start, limit=None, delta=1, dtype=None, name=’range’)
9、tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
10、tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None,name=None)
10、tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None,name=None)
11、tf.random_shuffle(value, seed=None, name=None)
12、tf.random_crop(value, size, seed=None, name=None)
13、tf.multinomial(logits, num_samples, seed=None, name=None)
14、tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)
15、tf.set_random_seed(seed)
运算操作
Tensorflow数据类型
Tensorflow需要python的原生数据类型,如int,float, string等。
Tensorflow和Numpy中的数据类型比较
1、tf.int3 == np.int32 #true
2、可将numpy数据类型传递给Tensorflow的操作
3、对于语句 tf.Session.run(fetches), 如果 fetch是一个Tensor数据,那么输出将会是一个numpy数组。
使用原则
1、不要使用Python原生类型作为张量,因为TensorFlow必须推断Python
类型。
2、使用numpy类型时需要小心,以后numpy和tensorflow可能不兼容。
constants的弊端
Constants是存储在图的定义中的。当constants比较大时,加载图会很耗费资源。
为了解决这个问题, 一个使用原则是:只对原始类型使用constants,其他需要更多内存的数据可以使用variables或者readers表示。
variables
一些例子
一个简单的问题:为什么tf.constant中constant是小写,而tf.Variable中Variable是大写?因为tf.Variable是一个类,tf.constant是一个操作符。遵循python的命名习惯。
如果tf.Variable有一些运算符:
variables初始化
最简单的方法是一次初始化所有变量
初始化部分变量
初始化单个变量
tf.Variable.assign()
|
|
因为 W.assign(100) 只是创建了一个赋值操作,这个操作要被运行才能起作用,如下所示。并且我们并不需要初始化变量,因为assign_op已经为我们做了这个操作。实际上,初始化操作是赋值操作将变量的初始值赋给变量本身。
|
|
以上例子中,每运行一次,my_var都执行乘2操作。
assign_add() 和 assign_sub()
|
|
assign_add()和assign_sub()操作都不能帮我们初始化变量,因为这两个操作都需要参数的初始值。
每个session都拥有它自己的变量的拷贝
|
|
用一个变量初始化另一个变量
下面这种方法比较常见,但是不够安全。
下面这种方法保证了保证了在用W初始化U之前,W的值已经被初始化,所以更加安全。
Session 和 InteractiveSesssion
InteractiveSession 和 Session的唯一区别就是InteractiveSession使其成为默认设置。
Control Dependencies
API: tf.Graph.control_dependencies(control_inputs)
用来定义哪个操作先被执行。
Placeholder
一个tensorflow写的程序通常有两个部分:
1、构建图 2、使用会话执行图中的操作
也就是说我们可以在不知道需要的计算参数的具体数值的前提下构建图。
我们可以在不知道x和y的具体数值的前提下定义函数 f(x,y) = x*2 +y,x和y只是具体数值的占位符。我们可以构建好计算图之后再对变量赋值进行计算。
API: tf.placeholder(dtype, shape=None, name=None)
|
|
我们需要使用dictionary将值提供给占位符。
如下所示:
也可以给占位符多次赋值,如下所示:
其实我们可以通过feed_dict给任何feedable的张量,占位符只是一些必须被feed的量的一种表示。
可以通过 tf.Graph.is_feedable(tensor)判断张量能否被feed。
Feeding values to TF ops
|
|
Lazy Loading
lazy loading的意思是尽量推迟创建或者初始化对象的时间,直到其需要的时候再创建或者初始化。
非lazy loading
lazy loading
lazy loading和非lazy loading得到的结果是一样的。但是它们的区别在哪儿呢?
以上例子中普通的加载方法 add操作只执行一次,而lazy loading的方法add操作要执行10次,当操作更复杂时,lazy loading的弊端就显现出来了。这是tensorflow最常见的一个non-bug bugs。
解决方法:
1、从计算/运行操作单独定义操作
2、使用Python属性来确保函数在第一次被调用时也被加载。??具体怎么实现
Structuring Your Tensorflow Models