tensorflow 入门

来源:互联网 发布:微信矩阵是什么 编辑:程序博客网 时间:2024/06/05 16:40

介绍

TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。它是谷歌基于DistBelief进行研发的第二代人工智能学习系统。2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源。

TensorFlow名字的来源

其命名来源于本身的原理,Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。Tensorflow运行过程就是张量从图的一端流动到另一端的计算过程。张量从图中流过的直观图像是这个工具取名为“TensorFlow”的原因。

什么是数据流图(Data Flow Graph)?

数据流图用“节点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以运输“size可动态调整”的多维数组,即“张量”(tensor)。一旦输入端所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行计算。
这里写图片描述

Tensorflow的特性

高度的灵活性: TensorFlow不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用TensorFlow。

可移植性(Portability):Tensorflow可以运行在台式机、服务器、手机移动等等设备上。而且它可以充分使用计算资源,在多CPU和多GPU上运行。

多语言支持:Tensorflow提供了一套易用的Python使用接口来构建和执行graphs,也同样提供了一套易于C++使用的接口(目前训练神经网络只支持python,C++接口只能使用已经训练好的模型)。未来还会支持Go、Java、Lua、JavaScript、R等等。

性能最优化:TensorFlow给予了线程、队列、异步操作等最佳的支持,TensorFlow可以把你手边硬件的计算潜能全部发挥出来,它可以充分利用多CPU和多GPU。

Basic Concepts

图(Graph)

图描述了计算的过程,TensorFlow使用图来表示计算任务。

张量(Tensor)

名字就是TensorFlow,直观来看,就是张量的流动。张量(tensor),即任意维度的数据,一维、二维、三维、四维等数据统称为张量,一个 tensor 包含一个静态类型 rank, 和 一个 shape. 。而张量的流动则是指保持计算节点不变,让数据进行流动。这样的设计是针对连接式的机器学习算法,比如逻辑斯底回归,神经网络等。连接式的机器学习算法可以把算法表达成一张图,张量从图中从前到后走一遍就完成了前向运算;而残差从后往前走一遍,就完成了后向传播。

算子(operation/操作)

在TF的实现中,机器学习算法被表达成图,图中的节点是算子(operation),节点会有0到多个输出。

每个算子都会有属性,所有的属性都在建立图的时候被确定下来,比如,最常用的属性是为了支持多态,比如加法算子既能支持float32,又能支持int32计算。

核(kernel)

TF中还有一个概念是kernel,kernel是operation在某种设备上的具体实现。TF的库通过注册机制来定义op和kernel,所以可以通过链接一个其他的库来进行kernel和op的扩展。

边(edge)

TF的图中的边分为两种:

  • 正常边,正常边上可以流动数据,即正常边就是tensor
  • 特殊边,又称作控制依赖,(control dependencies)
    • 没有数据从特殊边上流动,但是特殊边却可以控制节点之间的依赖关系,在特殊边的起始节点完成运算之前,特殊边的结束节点不会被执行。
    • 也不仅仅非得有依赖关系才可以用特殊边,还可以有其他用法,比如为了控制内存的时候,可以让两个实际上并没有前后依赖关系的运算分开执行。
    • 特殊边可以在client端被直接使用

会话(Session)

客户端使用会话来和TF系统交互,一般的模式是,建立会话,此时会生成一张空图;在会话中添加节点和边,形成一张图,然后执行。

Session 是 Tensorflow 为了控制,和输出文件的执行的语句. 运行 session.run() 可以获得你要得知的运算结果, 或者是你所要运算的部分.
创建一个Session对象启动图的第一步。

sess = tf.Session() # 执行 product 计算 结构result = sess.run(product)print(result)sess.close()

变量(Variables)

机器学习算法都会有参数,而参数的状态是需要保存的。而参数是在图中有其固定的位置的,不能像普通数据那样正常流动。因而,TF中将Variables实现为一个特殊的算子,该算子会返回它所保存的可变tensor的句柄。

state = tf.Variable(0,name='counter')print(state.name)

传参 placeholder

Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(), 然后以这种形式传输数据 sess.run(***, feed_dict={input: **}).

#在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 形式# tf.placeholder(tf.float32,[2,2]) 规定数据结构input1 = tf.placeholder(tf.float32)input2 = tf.placeholder(tf.float32)# mul = multiply 是将input1和input2 做乘法运算,并输出为 output ouput = tf.multiply(input1, input2)with tf.Session() as sess:    # 以feed_dict 传入参数,python 字典的格式       # 需要传入的值放在了feed_dict={} 并一一对应每一个 input. placeholder 与 feed_dict={} 是绑定在一起出现的。    print(sess.run(ouput,feed_dict={input1: [7.], input2: [2.]}))

激励函数 activation function

激励函数运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经系统。激励函数的实质是非线性方程。 Tensorflow 的神经网络 里面处理较为复杂的问题时都会需要运用激励函数 activation function 。

A small example

# -*- coding: utf-8 -*-# 预测一个线性的直线 ,预测 y = 0.1*x+0.3import tensorflow as tf# 导入科学计算模块  import numpy as np#自己编一些数据,因为在tensorflow 中,他的大部分数据格式是 float 32 的形式 x_data = np.random.rand(100).astype(np.float32) # 这就是我们预测的 y=Weights * x + biases   Weights 接近0.1  激励 接近0.3 然后神经网络也就是学着把 Weights 变成 0.1, biases 变成 0.3y_data = x_data*0.1 + 0.3# 开始创建 tensorflow 的结构  #  Weights可能是个矩阵,此处定义 Weights 变量是一个一维的 参数范围为 -1.0 到 1.0的变量Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))# biases 是一个一维变量,初始值是 0 biases  = tf.Variable(tf.zeros([1]))# 上边两步是生成两个初始值,Weights 和 biases ,然后 Weights 和 biases 经过学习会越来越趋近于 0.1 和 0.3# 预测的y y = Weights*x_data + biases# 接着就是计算 y预测值 和 y_data真实值 的误差:loss = tf.reduce_mean(tf.square(y-y_data))# 建立一个优化器, 减少神将网络的误差  GradientDescentOptimizer 是最基础的优化器, 0.5 为学习效率(0-1),optimizer = tf.train.GradientDescentOptimizer(0.5)train = optimizer.minimize(loss)# 初始化变量 ,神经网络就是一个图,上边就是建立结构,这里是初始化变量,激活图# init = tf.initialize_all_variables() # tf 马上就要废弃这种写法init = tf.global_variables_initializer()  # 替换成这样就好sess = tf.Session()# 从init 开始 跑我们的图片,init 就是神经网络的入口sess.run(init)        # 训练201次for step in range(201):    # 开始训练    sess.run(train)    if step % 20 == 0:     # 每隔20 次训练 输出一下当前我的 Weights参数  和 biases参数 , run(Weights) 就是像指针一样指向我图中的 Weights        print(step, sess.run(Weights), sess.run(biases))

本文源码:https://github.com/527515025/pythonLean
参考:http://www.cnblogs.com/x_wukong/p/5579438.html
http://blog.csdn.net/toormi/article/details/53609245
https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-3-session/