概述
TensorFlow 是由 Google Brain 团队为深度神经网络(DNN)开发的功能强大的开源软件库,于 2015 年 11 月首次发布。他是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。
TensorFlow 的特点:
- 支持所有流行语言,如 Python、C++、Java、R和Go;
- 可以在多种平台上工作,甚至是移动平台和分布式平台;
- 它受到所有云服务(AWS、Google和Azure)的支持;
- Keras——高级神经网络 API,已经与 TensorFlow 整合;
- 与 Torch/Theano 比较,TensorFlow 拥有更好的计算图表可视化;
- 允许模型部署到工业生产中,并且容易使用;
- 有非常好的社区支持;
- TensorFlow 不仅仅是一个软件库,它是一套包括 TensorFlow,TensorBoard 和
- TensorServing 的软件。
一、基本概念
tensorflow是一个编程系统,使用图来表示计算任务,图中的节点称为op(operation),一个op获得0个或者多个Tensor,执行计算,产生0个或者多个Tensor。Tensor看作是一个n维的数组或者列表。图必须在会话(Session)中被启动。
- 使用图来表示计算任务;
- 在被称之为会话(Session)的上下文(context)中执行图;
- 使用Tensor表示数据;
- 通过变量(Variable)维护状态;
- 使用feed和fetch可以为任意的操作赋值从其中获取数据。
二、基础语法
2.1 常量、图和会话
在tensorflow中,用tf.constant()定义常量,用 Session 来启动图, 并调用 Session.run() 方法执行操作.
import tensorflow as tf
#创建常量op
m1=tf.constant([[3,3]])
#创建一个常量op
m2=tf.constant([[2],[3]])
#创建矩阵乘法
product=tf.matmul(m1,m2)
#定义会话,启动默认图
with tf.Session() as sess:
# 调用sess的run方法来执行矩阵乘法
# run(product)触发了图中的3个op
print("m1:",sess.run(m1))
print("m2:", sess.run(m2))
#其实,只需要最后一步就可以,这里显示需要,打印了m1和m2
print("product:",sess.run(product))
结果如下:
#输出:
m1:
[[3 3]]
m2:
[[2]
[3]]
product:
[[15]]
2.2变量
在tensorflow中,用tf.Variable()定义变量,并用tf.global_variables_initializer()来初始化变量,用 Session 来启动图, 并调用 Session.run() 方法执行操作.
import tensorflow as tf
#定义一个变量
x=tf.Variable([1,2])
a=tf.constant([3,3])
#增加一个减法op
sub=tf.subtract(x,a)
#增加一个加法op
add=tf.add(x,sub)
#全局变量的初始化
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print("sub:\n",sess.run(sub))
print("add:\n",sess.run(add))
结果如下:
#输出:
sub:
[-2 -1]
add:
[-1 1]
2.3 Fetch
为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session():
result = sess.run([mul, intermed])
print result
输出结果:
# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。
2.4 Feed和placeholder
feed 使用一个 tensor 值临时替换一个操作的输出结果。你可以提供 feed 数据作为 run() 调用的参数。 feed 只在调用它的方法内有效, 方法结束, feed 就会消失。最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。
#创建占位符,初始没有值,在运行时才传入值
input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)
output=tf.multiply(input1,input2)
with tf.Session() as sess:
#feed的数据以字典的形式传入
print(sess.run(output,feed_dict={input1:[7.],input2:[2.]}))
输出结果:
# 输出:
# [array([ 14.], dtype=float32)]
三、简单示例
利用tensorflow采用最小二乘法去简单的去拟合一条曲线,给出曲线的斜率和截距:
y
=
0.1
x
+
0.2
y=0.1x+0.2
y=0.1x+0.2
import tensorflow as tf
import numpy as np
#使用numpy生成100个随机点
x_data=np.random.rand(100)
y_data=x_data*0.1+0.2
#构造一个线性模型
b=tf.Variable(0.)
k=tf.Variable(0.)
y=k*x_data+b #常量相乘可以直接用乘号
#二次代价函数
loss=tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降法来训练模型
optimizer=tf.train.GradientDescentOptimizer(0.2)
#定义最小化代价函数
train=optimizer.minimize(loss)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(201):
sess.run(train)
if step%20==0:
print(step,sess.run([k,b]))
结果如下:
0 [0.054136854, 0.10028906]
20 [0.10375962, 0.19796239]
40 [0.10223676, 0.19878778]
60 [0.10133075, 0.1992788]
80 [0.100791715, 0.19957092]
100 [0.10047101, 0.19974473]
120 [0.100280225, 0.19984813]
140 [0.100166716, 0.19990964]
160 [0.10009918, 0.19994625]
180 [0.10005901, 0.19996803]
200 [0.10003511, 0.19998097]
循环201步后,得到的 k k k和 b b b已经非常接近0.1和0.2。