TensorFlow之入门篇

introduction

TensorFlow是由Google Brain Team弄的一个深度学习框架,使用的是data flow graph的模型进行计算。相比于Torch,Theano,Caffe,CNTK,Disbelief,MXNET,Keras,一些大公司也会有自己的框架。Tensorflow目前使用率是最高的了。TF使用Python的API,可以布置在多个CPU,GPU上,并且有移动端的版本。可以在树莓派,Android,Windows,iOS,Linux上运行。有可视化的界面(TensorBoard)自动可求导,不需要手算了。目前使用TF的公司有Google,OpenAI,DeepMind,Snapchat,Uber,Airbus,eBay,Dropbox等等。

这部分介绍就从TF的计算模型,TF的内置函数谈起。TF learn(tf.contrib.learn): 使使用者能够把别的库的函数都在这里实现,接口和你想要的类似,比如有scikit-learn的接口,让之前使用这个人很方便操作。TFLearn还可以给你训练模型,使用模型的接口,一行代码搞定,LinearClassifier, LinearRegressor, DNNClassifier。ConvNets, LSTM, BiRNN, ResNets, Generative networks and features such as BatchNorm, PReLU. TFLearn is developed by Aymeric Damien。比如下面的代码(我觉得和Keras一样,看不懂可以跳过),更多examples看这里【5】。TF Slim(tf.contrib.slim): 轻量级的库用于训练,evaluate复杂的模型。同时兼容Keras,TFLearn。

# Load dataset.
iris = tf.contrib.learn.datasets.load_dataset('iris')
x_train, x_test, y_train, y_test = cross_validation.train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# Build 3 layer DNN with 10, 20, 10 units respectively.
feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input(x_train)
classifier = tf.contrib.learn.DNNClassifier(
feature_columns=feature_columns, hidden_units=[10, 20, 10],n_classes=3)
# Fit and predict.
classifier.fit(x_train, y_train, steps=200)
predictions = list(classifier.predict(x_test, as_iterable=True)) score = metrics.accuracy_score(y_test, predictions)
print('Accuracy: {0:f}'.format(score))

TF的计算模型就是data flow graph,就是下面这样的图:
这里写图片描述

整个模型在运行的时候就会从输入到输出。另外TF有个特点就是计算和具体执行时分开的,就是先定义一堆计算,整个框架描绘好,然后再开启一个session来执行。(别的框架Caffe,Keras都是这么搞的,可能是TF多搞了一个名词,session)

tensor:n维数组,0维的就是scalar,一个数字;1维的就是vector;2维的就是matrix。

import tensorflow as tf
a = tf.add(3,5)

这里虽然是常数3,5,但是在tensorboard上可以看到会被赋予x,y这样的变量名,看edge的时候就会看到数字。
这里写图片描述

上诉代码只是构建了一个add的构件,其实并没有真的运行,print(a)会报错,因为没有真的运行这个graph。在TF里面有一个session用来控制数据流,它会根据你需要的结果变量a,找到需要计算a的subgraph,然后从头开始执行这个graph,以拓扑结构(我脑补的)

import tensorflow as tf
a = tf.add(3,5)
sess = tf.Session()
print(sess.run(a))
sess.close()

当然,对于Session有更简单的写法:

import tensorflow as tf
a = tf.add(3,5)
with tf.Session() as sess:
    print(sess.run(a))

Session会自动的把为了计算最终变量需要的整个图,数据全部都加载到里面去。
现在来一个更具体的例子:

x = 2
y = 3;
op1 = tf.add(x,y)
op2 = tf.mul(x,y)
op3 = tf.pow(op2,op1)
with tf.Session() as sess:
    op3 = sess.run()

你能想象一下在TensoeBoard上的样子么?
这里写图片描述

你会发现这个Session的命名其实是具有唯一性,如果运行两个Session,都会对同一个Graph进行处理的话,那么这里就存在时序问题,加锁同步之类的东西,整个数据模型变得异常复杂而且效率不高。所以这里简单粗暴的方法就是两个Session,都维护各自的初始化数据。

对于Subgraphs的概念需要了解的是,为了节约计算量就只计算与结果相关的部分。
举个例子:

import tensorflow as tf
x = 2
y = 3
add_op = tf.add(x,y)
mul_op = tf.mul(x,y)
useless = tf.mul(x, add_op)
pow_op = tf.pow(add_op,mul_op)
with tf.Session() as sess:
    z = sess.run(pow_op)

这里的useless不在pow_up 的 subgraph里面,所以不会进行计算,那么如果要计算useless的值,只要在sess.run()里面加入useless,变成了:需要计算什么就把它加到run的list里面。

z, not_useless = sess.run([op3, useless])

这里写图片描述

在使用TF进行分布式计算的时候,可以指定某一个器件进行,比如:

import tensorflow as tf

with tf.device('/gpu:2'):
    a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0], name = 'a')
    b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0], name = 'b')
    c = tf.matnul(a,b)

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
    print(sess.run(c))

对于graph的设计,能不能有两个或者以上的graph呢?其实是可以的,创建一个。

g = tf.Graph()

增加一个graph,并设置为默认的graph:

import tensorflow as tf

g = tf.Graph()
with g.as_default():
    x = tf.add(3,5)

sess = tf.Session(graph = g)
print(sess.run(x))
sess.close()

在使用两个Graph的情况:分别计算。

import tensorflow as tf

g1 = tf.get_default_graph()
g2 = tf.Graph()
# add ops to the default graph
with g1.as_default():
     a = tf.constant(3)
     sess = tf.Session()
     print(sess.run(a))
     sess.close()

# add ops to the user created graph
with g2.as_default():
     b = tf.constant(5)
     sess = tf.Session()
     print(sess.run(b))
     sess.close()

所以不要使用多个graph,整个数据流比较不清楚,而且容易出错。

为什么使用Graph,主要是为了节约计算量,便于自动求导,便于分布式计算,很多机器学习的模型本身已经是图,比如概率图模型。

至此,已经介绍了两个重要的东西,graph和session。Graph用来构建模型,一般来说我们都是对默认的graph进行操作,比如往里面加入module。Session用来执行模型。类比于Graph是写好的CPU,Session是具体的指令。对于Session想要更好地理解可以看【6】

Basic Operation

import tensorflow敲一遍就可以对这个东西更熟悉:

可视化graph

import tensorflow as tf

a = tf.constant(2, name = "a")
b = tf.constant(3, name = "b")
x = tf.add(a,b, name = "add")

# with tf.Session() as sess:
# writer = tf.summary.FileWriter("./graphs",sess.graph)
with tf.Session() as sess:
    writer = tf.summary.FileWriter('./graphs',sess.graph)
    print(sess.run(x))

writer.close()

运行完上面代码以后运行:

tensorboard --logdir="./graphs" --port 6006

在浏览器中打开:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值