美文网首页我爱编程
Tensorflow 之一 核心基础篇

Tensorflow 之一 核心基础篇

作者: galois_xiong | 来源:发表于2017-04-21 19:09 被阅读0次

TensorFlow 简介

TensorFlow是由Jeff Dean领头的谷歌大脑团队基于谷歌内部第一代深度学习系统DistBelief改进而来的通用计算框架。DistBelief是谷歌2011年开发的内部深度学习工具,这个工具在谷歌内部已经获得了巨大的成功。

TensorFlow是谷歌于2015年11月9日正式开源的计算框架,并于2017年2月16日,TensorFlow 1.0版本正式发布, 这个版本具有里程碑的意义。TensorFlow计算框架可以很好地支持深度学习的各种算法,但它的应用也不限于深度学习。

除了在谷歌内部大规模使用之外,TensorFlow也受到了工业界和学术界的广泛关注。在Google I/O 2016的大会上,Jeff Dean提到已经有1500多个GitHub的代码库中提到了TensorFlow,而只有5个是谷歌官方提供的。如今,包括优步(Uber)、Snapchat、Twitter、京东、小米等国内外科技公司也纷纷加入了使用TensorFlow的行列。正如谷歌在TensorFlow开源原因中所提到的一样,TensorFlow正在建立一个标准,使得学术界可以更方便地交流学术研究成果,工业界可以更快地将机器学习应用于生产之中。

此外由于深度学习的巨大成功,深度学习框架也成了豪强必争之地,从下面的图表中可以看出TesnorFlow 目前占有一定的优势。


Paste_Image.png

TensorFlow 基础

TensorFlow 核心程序可以分为这两个部分:

  • 构造 computational graph
  • 运行 computational graph

computational graph

是由一系列的 operation的作为节点(nodes) 按照特定的方式排列形成的图,operation 的输入输出都是Tensor。就是说TensorFlow 就是运行computational graph, 这个图的节点是operations, 边是用来连接operation, operation 的输入输出都是Tensor;
下面是一些核心概念:

Tensor(张量):

tensor 是一个特定形状(shape)的数组,这个数组的元素必须是TensorFlow 的基础类型; 下面用例子来具体解释下:
3                                  #  这个tensor的rank 为0 并且 shape 为 []

[1.,2.,3.]                       # 这个tensor的rank 为1 并且 shape 为 [3]

[[1.,2.,3.],[4.,5.,6.]]       # 这个tensor的rank 为2 并且 shape 为 [2, 3]

[[[1.,2.,3.]],[[7.,8.,9.]]]    # 这个tensor的rank 为3 并且 shape 为 [2, 1, 3]

Operation: operation 计算的单元,在是computational graph 的 节点。

c = tf.matmul(a, b) # 创造了一个"MatMul" 类型的 Operation, 输入是a 和b 输出是 c

Session:

computational graph 必须在session中运行;
Session 是运行class的类, 一个 Session object 封装了computational graph的环境, Operation 的计算在这个环境中被执行,tensor 的结果在这个环境中被求出;

Naive实例

import tensorflow as tf
# build graph
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)     # also tf.float32 implicitly
node3 = tf.add(node1, node2)
# Launch the graph in a session.
sess=tf.Session()
# run the graph
print(sess.run(node3))
# release resource
sess.close()

上面的naive Example 展示了一个完整的tensorflow 程序的过程,但这个程序的输入输出都是常数,而外部输入和输出的形式各异,显然还需要有其它的概念加入才能满足需求。

Feeding 和 Placeholders

TensorFlow 的 feed 机制 使你能够将数据注入到computational graph 中的任意一个tensor 中去,这种机制主要借助于 placeholder 完成。

Placeholders :

是一种 operation,这种operation必须在被执行前feed 数据进去。

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  
with tf.Session() as sess:
    print(sess.run(adder_node,{a:3, b:4.5}))
    print(sess.run(adder_node,{a:[1, 3], b:[2, 4]}))

上面的代码块第一第二行定义了两个placeholder操作,之后第5和第6行 分别利用feed 机制注入了 将 tensor 注入到了 a, 和 b

Variable :

主要是当做graph的一些可变参数,用来使得多次执行computational graph 时改变参数的状态;

W=tf.Variable([.3],tf.float32)
b=tf.Variable([-.3],tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b

上面的代码定义了variable, 但没有初始化,在TensorFlow 程序中初始化所有的Variable必须调用一个特殊的operation , 具体如下:

init=tf.global_variables_initializer()
sess.run(init)

有了以上基础知识,下面利用完成一个简单的线下拟合模型的程序

线下拟合代码

import numpy as np
import tensorflow as tf

# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x=tf.placeholder(tf.float32)
linear_model=W*x+b
y=tf.placeholder(tf.float32)
# loss
loss=tf.reduce_sum(tf.square(linear_model-y))# sum of the squares

# optimizer
optimizer=tf.train.GradientDescentOptimizer(0.01)
train=optimizer.minimize(loss)

# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)# reset values to wrong
for i in range(1000):
    sess.run(train,{x:x_train,y:y_train})
# evaluate training accuracy
curr_W,curr_b,curr_loss=sess.run([W,b,loss],{x:x_train,y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

上面代码可以在tensorboard 生成如下的图:


Paste_Image.pngPaste_Image.png

总结

本文主要介绍了tensorflow的一些发展历史以及现状
核心基础概念:

  • graph

  • tensor

  • operation

  • session

  • palaceholder

  • variable
    最后以一个简单的实例结束了本小节

相关文章

网友评论

    本文标题:Tensorflow 之一 核心基础篇

    本文链接:https://www.haomeiwen.com/subject/xpzdzttx.html