简介

TensorFlow是目前最流行的深度学习框架。我们先引用一段官网对于TensorFlow的介绍,来看一下Google对于它这个产品的定位。

TensorFlow™ is an open source software library for numerical computation using data flow graphs. Nodes in the graph represent mathematical operations, while the graph edges represent the multidimensional data arrays (tensors) communicated between them. The flexible architecture allows you to deploy computation to one or more CPUs or GPUs in a desktop, server, or mobile device with a single API.

上文并没有提到大红大紫的Deep Learning,而是聚焦在一个更广泛的科学计算应用领域。引文的关键词有:

Numerical Computation:应用领域是数值计算,所以TensorFlow不仅能支持Deep Learning,还支持其他机器学习算法,甚至包括更一般的数值计算任务(如求导、积分、变换等)。

Data Flow Graph:用graph来描述一个计算任务。

Node:代表一个数学运算(mathmatical operations,简称ops),这里面包括了深度学习模型经常需要使用的ops。

Edge:指向node的edge代表这个node的输入,从node引出来的edge代表这个node的输出,输入和输出都是multidimensional data arrays,即多维数组,在数学上又称之为tensor。这也是TensorFlow名字的由来,表示多维数组在graph中流动。

CPUs/GPUs:支持CPU和GPU两种设备,支持单机和分布式计算。

TensorFlow提供多种语言的支持,其中支持最完善的是Python语言,因此本文将聚焦于Python API。

Hello World

下面这段代码来自于TensorFlow官网的Get Started,展示了TensorFlow训练线性回归模型的能力。

import tensorflow as tf

import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3

x_data = np.random.rand(100).astype(np.float32)

y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b

# (We know that W should be 0.1 and b 0.3, but TensorFlow will

# figure that out for us.)

W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

b = tf.Variable(tf.zeros([1]))

y = W * x_data + b

# Minimize the mean squared errors.

loss = tf.reduce_mean(tf.square(y - y_data))

optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(loss)

# Before starting, initialize the variables. We will 'run' this first.

init = tf.global_variables_initializer()

# Launch the graph.

sess = tf.Session()

sess.run(init)

# Fit the line.

for step in range(201):

sess.run(train)

if step % 20 == 0:

print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]

下面我们来剖析一下关键代码。TensorFlow的代码往往由两个部分组成:

A construction phase, that assembles a graph, and an execution phase that uses a session to execute ops in the graph.

Session是一个类,作用是把graph ops部署到Devices(CPUs/GPUs),并提供具体执行这些op的方法。

为什么要这么设计呢?考虑到Python运行性能较低,我们在执行numerical computing的时候,都会尽量使用非python语言编写的代码,比如使用NumPy这种预编译好的C代码来做矩阵运算。在Python内部计算环境和外部计算环境(如NumPy)切换需要花费的时间称为overhead cost。对于一个简单运算,比如矩阵运算,从Python环境切换到Numpy,Numpy运算得到结果,再从Numpy切回Python,这个成本,比纯粹在Python内部做同类运算的成本要低很多。但是,一个复杂数值运算由多个基本运算组合而成,如果每个基本运算来一次这种环境切换,overhead cost就不可忽视了。为了减少来回的环境切换,TensorFlow的做法是,先在Python内定义好整个Graph,然后在Python外运行整个完整的Graph。因此TensorFlow的代码结构也就对应为两个阶段了。

Build Graph

W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

b = tf.Variable(tf.zeros([1]))

tf.Variable是TensorFlow的一个类,是取值可变的Tensor,构造函数的第一个参数是初始值initial_value。

initial_value: A Tensor, or Python object convertible to a Tensor, which is the initial value for the Variable.

tf.zeros(shape, dtype=tf.float32, name=None)是一个op,用于生成取值全是0的Constant Value Tensor。

tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)是一个op,用于生成服从uniform distribution的Random Tensor。

y = W * x_data + b

y是线性回归运算产生的Tensor。运算符*和+,等价为tf.multiple()和tf.add()这两个TensorFlow提供的数学类ops。tf.multiple()的输入是W和x_data;W是Variable,属于Tensor,可以直接作为op的输入;x_data是numpy的多维数组ndarray,TensorFlow的ops接收到ndarray的输入时,会将其转化为tensor。tf.multiple()的输出是一个tensor,和b一起交给optf.add(),得到输出结果y。

至此,线性回归的模型已经建立好,但这只是Graph的一部分,还需要定义损失。

loss = tf.reduce_mean(tf.square(y - y_data))

loss是最小二乘法需要的目标函数,是一个Tensor,具体的op不再赘述。

optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(loss)

这一步指定求解器,并设定求解器的最小化目标为损失。train代表了求解器执行一次的输出Tensor。这里我们使用了梯度下降求解器,每一步会对输入loss求一次梯度,然后将loss里Variable类型的Tensor按照梯度更新取值。

init = tf.global_variables_initializer()

Build Graph阶段的代码,只是在Python内定义了Graph的结构,并不会真正执行。在Launch Graph阶段,所有的变量要先进行初始化。每个变量可以单独初始化,但这样做有些繁琐,所以TensorFlow提供了一个方便的函数global_variables_initializer()可以在graph中添加一个初始化所有变量的op。

When you launch the graph, variables have to be explicitly initialized before you can run Ops that use their value. All variables are automatically collected in the graph where they are created. By default, the constructor adds the new variable to the graph collection GraphKeys.GLOBAL_VARIABLES. The convenience function global_variables() returns the contents of that collection. The most common initialization pattern is to use the convenience function global_variables_initializer() to add an Op to the graph that initializes all the variables.

Launch Graph

sess.run(init)

在进行任何计算以前,先给Variable赋初始值。

for step in range(201):

sess.run(train)

train操作对应梯度下降法的一步迭代。当step为0时,train里的variable取值为初始值,根据初始值可以计算出梯度,然后将初始值根据梯度更新为更好的取值;当step为1时,train里的variable为上一步更新的值,根据这一步的值可以计算出一个新的梯度,然后将variable的取值更新为更好的取值;以此类推,直到达到最大迭代次数。

print(step, sess.run(W), sess.run(b))

如果我们将sess.run()赋值给Python环境的变量,或者传给Python环境的print,可以fetch执行op的输出Tensor取值,这些取值会转化为numpy的ndarray结构。因此,这就需要一次环境的切换,会增加overhead cost。所以我们一般会每隔一定步骤才fetch一下计算结果,以减少时间开销。

基础练习:线性模型

TensorFlow是一个面向数值计算的通用平台,可以方便地训练线性模型。下面这几篇文章采用TensorFlow完成Andrew Ng主讲的Deep Learning课程练习题,提供了整套源码。

进阶练习1:深度学习

TensorFlow虽然是面向通用的数值计算,但是对深度学习的支持是它最大的特色,也是它能够引爆业界获得目前这么大的流行度的主要原因。下面这几篇文章采用TensorFlow对MNIST进行建模,涵盖了Deep Learning中最重要的两类模型:卷积神经网络CNN和循环神经网络RNN。

进阶练习2:TensorBoard

TensorFlow安装时自带了一个TensorBoard,可以对数据集进行可视化地探索分析,可以对学习过程进行可视化,可以对Graph进行可视化,对于我们分析问题和改进模型有极大的帮助。

部署

python tensorflow教程_TensorFlow入门教程相关推荐

  1. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  2. TensorFlow发布语音识别入门教程,附1GB数据集代码

    原标题:TensorFlow发布语音识别入门教程,附1GB数据集&代码 机械鸡的鸡友经常问:如何开始入门深度学习语音和其他音频识别,例如关键字检测或语音命令. 虽然有一些伟大的开源语音识别系统 ...

  3. TensorFlow 中文资源精选,官方网站,安装教程,入门教程,实战项目,学习路径。

    转载至:http://www.nanjixiong.com/thread-122211-1-1.html Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习 ...

  4. 笔记本电脑下载python视频教程-Python的Jupyter Notebook入门教程

    适用于Python的Jupyter Notebook入门教程 在下面的教程中,将指导您完成安装Jupyter Notebook的过程.同时,我们将探索Jupyter Notebook的基本功能,通过尝 ...

  5. python图形用户界面pyside_PySide——Python图形化界面入门教程(一)

    标签: PySide--Python图形化界面入门教程(一) --基本部件和HelloWorld 原文链接:http://pythoncentral.io/intro-to-pysidepyqt-ba ...

  6. qpython3可视图形界面_PySide——Python图形化界面入门教程(三)

    PySide--Python图形化界面入门教程(三) --使用内建新号和槽 --Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  7. qpython3绘图_比Excel制图更强大,Python可视化工具Altair入门教程

    比 Excel 制图更强大,Python 可视化工具 Altair 入门教程 数据转化成更直观的图片,对于理解数据背后的真相很有帮助.如果你有这方面的需求,而且还在使用 Python,那么强烈推荐你试 ...

  8. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  9. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

最新文章

  1. 大学计算机系一周上几节课,大学生晒课程表,一周45节课无双休,三个专业是满课重灾区...
  2. C++中set按降序排序
  3. PHP学习笔记01: 安装PHP开发套件xampp
  4. VMware view client for ipad 测试
  5. 数据库系统概念 第五章 习题答案
  6. (百例编程)76.小明买书
  7. 0ctf-2017-pwn-char 题解
  8. 2020科目一考试口诀_科目一口诀顺口溜2020
  9. 转 TensorFlow Object Detection API 多GPU 卡平行计算,加速模型训练速度教学
  10. 今天来聊聊函数function func()
  11. 京东API网关实践之路
  12. H5 css伪类选择器
  13. SHELL : echo字体控制
  14. 张俊林:由ChatGPT反思大语言模型(LLM)的技术精要
  15. 【人工智能】人工智能课程复习笔记
  16. 一台完整的微型计算机应由,计算机文化基础试题库
  17. java合集系列之pring@Component @Repository@Service的区别
  18. 技嘉GIGABYTE AERO 15SA风扇噪音过大加油修理方法
  19. 链接平台负责人对百度绿萝算法的控诉
  20. Arduino Proteus仿真

热门文章

  1. 乐玩自动化测试模块_五大测试框架介绍,附带全套黑马自动化测试视频教程(完结)...
  2. 【算法】克鲁斯卡尔算法
  3. 【Elasticsearch】 解决数据较少的时候 算分不准的问题 dfs_query_then_fetch
  4. 【clickhouse】clickhouse数据文件目录移动到新目录并建立软连接
  5. 【jmx】java jmx 获取 kafka topic的logStart LogEnd信息
  6. hdfs集成ldap
  7. HDFS报错:there are 15871 missing blocks,the following files may be corrupted
  8. 【安全】CDH集群开启Kerberos安全认证
  9. 12-linux安装kibana
  10. 【mysql安装】阿里云centos7环境mysql安装