机器学习入门第二讲---TensorFlow入门

第一讲已经大概介绍了啥是机器学习(以下简称ML),这里就带大家了解最简单的TensorFlow(以下简称TF)程序。

 

TF是什么?

国际惯例,先介绍一下TF,维基百科介绍得比较散,下面是我根据维基百科和一些其他资料做的几句总结。

TensorFlow是Google Brain的第二代机器学习系统。第一代系统叫DistBelief,是谷歌2011开始开发的一套基于深度神经网络(深度学习的一种模型,后续的教程也讲)的机器学习系统。Google Brain曾用它在未事先获取 “猫的特征描述” 信息的情况下,从大量 YouTube 视频中区分除了哪些是猫的视频。这意味着深度学习系统 “DistBelief” 自行总结出了猫的 feature(特征)!后来Google指派了多位计算机科学家,将DistBelief的代码库简化并重构为更快,更强大的应用程序级库,后者成为TensorFlow。

 也就是说,TF就是一个机器学习的系统,里面包含了各种各样机器学习需要用到的工具。

TensorFlow其实是由Tensor(张量)和Flow(流动)两个词来组成的。不同于很多其他的没有任何实际意义的技术名词(比如Hadoop,MongoDB等等等等),TensorFlow从名字上就告诉了大家它的组成部分,就是由一个个张量组成的数据流图。如果不太理解没关系,一会到了具体代码再给大家用例子重新介绍一下。

 

TF安装

建议使用linux服务器或者MacOS来玩TF,这两个系统都是自带Python的。如果是用Windows来玩,那还得先装一下Python,然后建议再装一个Python的虚拟环境(virtualenv)。下面是Linux和MacOS的安装命令(前提是装了Python和pip/pip3,每条命令都是不同平台或者不同版本的安装示例,这里只随便列了几种):

# Ubuntu/Linux 64-bit, CPU only, Python 3.4:
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp34-cp34m-linux_x86_64.whl
# Ubuntu/Linux 64-bit, CPU only, Python 3.6:
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.2.1-cp36-cp36m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4. Requires CUDA toolkit 7.5 and CuDNN v4.
# For other versions, see "Install from sources" below.
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp34-cp34m-linux_x86_64.whl


# Mac OS X, CPU only:
$ sudo easy_install --upgrade six
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py2-none-any.whl

 

TF的三大概念

1.TF的计算模型--计算图(graph)

TF的程序一般可以分为两个阶段。

  • 第一阶段,需要定义计算图中所有的计算。
  • 第二阶段,执行计算。

2.TF的数据模型--张量(Tensor)

  • 在TF程序中,所有的数据都通过张量的形式来表示。
  • 从功能上,张量可以被简单理解为多维数组。
  • 但张量在TF中的实现并不是采用数组的形式,它只是对TF中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。

3.TF的运行模型--会话(Session)

  • 会话的作用是执行定义好的运算。
  • 会话拥有并管理TF程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。
  • 使用会话的模式有两种:
    • 需要明确调用会话生成函数和关闭会话函数
    • 利用Python的上下文管理器来使用会话

 

看下最简单的几句代码

先导入tensorflow

import tensorflow as tf

来一个最简单的加法。 

# 定义a和b两个常量
a = tf.constant([1.0,2.0], name='a')
b = tf.constant([1.0,2.0], name='b')
# 定义result,是由a和b相加得到的
result = tf.add(a,b,name='add') # 相当于 result = a + b

print(a)
print(b)
print(result)

#运行结果(Tensor这个对象的第一个参数是名字,第二个参数是张量维度,第三个参数是数据的类型):
#Tensor("a_1:0", shape=(2,), dtype=float32)
#Tensor("a_2:0", shape=(2,), dtype=float32)
#Tensor("add_1:0", shape=(2,), dtype=float32)

从上面的代码可以看出,定义的三个constant都是Tensor,这和我上面提到的“所有的数据都通过张量的形式来表示”的描述是一致。而result这个Tensor的数据,是由a和b相加得到的,也就是从a和b这两个Tensor流过来的(Flow)。Tensor(a)、Tensor(b)、Flow到Tensor(result),这就是TensorFlow的由来啦。

从结果来看,打印result并没有得到我们想要的计算结果,只是显示这是一个名为“add_1:0”的Tensor对象,这既是因为“张量保存的是计算过程”,也是因为现在还是“定义计算图中所有的计算”的阶段,还未执行计算。

接下来,咱们进入第二阶段,执行计算。

sess = tf.Session()
print(sess.run(result)) # 等同于 print(result.eval(session=sess))

# 运行结果:
# [2. 4.]

sess.close()

执行计算之后再打印result,就可以得到我们想要的那个结果了。

tf.Session()可以调起会话,会话结束后,记得close掉,不然会资源不会被释放,可能导致资源泄露。

如果不喜欢用close来关闭会话,也可以使用上下文管理器来启动会话,上下文结束时,资源会被自动释放。

with tf.Session() as sess:
    sess.run(result)
    print(result.eval())

最后说下计算图,不同的计算图之间是互不影响,哪怕是定义完全一致的向量,只要是在不同计算图中定义的,就互不影响。

g1 = tf.Graph()
with g1.as_default():
    # 在计算图g1中定义变量”v“,并设置初始值为0
    v = tf.get_variable(
    "v",shape=[1],initializer=tf.zeros_initializer)

g2 = tf.Graph()
with g2.as_default():
    # 在计算图g2中定义变量"v",并设置初始值为1
    v = tf.get_variable(
    "v",shape=[1],initializer=tf.ones_initializer)
    
# 计算图g1中读取变量"v"的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))
        
# 计算图g2中读取变量"v"的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))

# 运行结果:
# [0.]
# [1.]

以上,就是最简单的Tensor程序啦。

转载于:https://my.oschina.net/lonelycode/blog/3100470

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值