作者|blackblog  编辑| 布袋熊

AI基础技能学习 一步步上手TensorFlow

TensorFlow 是一个用于人工智能的开源神器。作为常用的机器学习框架,可被用于语音识别或图像识别等多项机器学习和深度学习领域,且上手简单,教材丰富。

本篇文章将带领大家一步一步上手TensorFlow,小伙伴们学起来呀~

TensorFlow从名字上,我们就可以对他有一定的理解。

Tensor:张量,表示N维数组。

Flow:流,表示给予数据流图的计算。

TensorFlow一句话:一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。

本文重点在于TensorFlow基础知识的讲解,包括安装,Graph,Session,Variable,Feed,Fetch的讲解。

更多关于TensorFlow的知识,可以登陆其官网进行查询:

https://www.tensorflow.org

TensorFlow的安装

工欲善其事 必先利其器,安装tf自然是第一步。

首先安装好python,我使用的是python3.6,确认自己是否安装有pip。
使用这两句话可以查询自己的pip是否安装正确

1
2
$ pip -V # for Python 2.7
$ pip3 -V # for Python 3.n

安装TensorFlow

1
2
$ pip -V # for Python 2.7
$ pip3 -V # for Python 3.n

如果上一句代码执行失败,执行如下代码

1
2
$ sudo pip install --upgrade tfBinaryURL # Python 2.7
$ sudo pip3 install --upgrade tfBinaryURL # Python 3.n

如果想要安装其他版本的tf,执行如下代码,自行修改URL就可以安装不同版本的tf了

1
2
$ sudo pip3 install --upgrade \
https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.6.0-py3-none-any.whl

安装好后进入python

1
2
3
4
import tensorflow as tf
hello = tf.constant( 'Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

正确输出如下内容,表示安装成功

1
Hello, TensorFlow!

TensorFlow的基本概念

TensorFlow就是一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。

此图来自于TensorFlow中文社区

图(Graph):表示计算任务。

会话(Session):建立会话,此时会生成一张空图;在会话中添加节点和边,形成一张图,一个会话可以有多个图,通过执行这些图得到结果。

张量(Tensor):一个N维数组,用来表示数据。

变量(Variable):用来记录一些数据和状态。

feed和fetch:用于对数据进行操作

创建图

TensorFlow 是一个编程系统, 使用图来表示计算任务。 图中的节点被称之为 op (operation 的缩写)。一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor。

每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels]。

构建图的第一步, 是创建源op。

源op不需要任何输入, 例如 常量 (Constant)。源 op 的输出被传递给其它 op 做运算.

创建一个图

1
2
3
4
5
6
7
8
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点加到默认图中.
t1 = tf.constant([[ 3., 3.]])
#创建另外一个常量 op, 产生一个 2x1 矩阵.
t2 = tf.constant([[ 4.],[ 4.]])
#创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(t1,t2)

用到的两个函数:

1
2
3
tf.constant(value, dtype= None, shape= None, name= 'Const') #用于创建一个内容为value,类型为dtype,大小为shape的常量Tensor。
tf.matmul(a, b, transpose_a= False, transpose_b= False, a_is_sparse= False, b_is_sparse= False, name= None) #将矩阵a与矩阵b相乘,返回a*b的结果

启动图

上一步中完成后,默认图中现有三个节点,两个constant op,一个matmul op。但这仅仅是完成了图的创建,如果要得到最终的结果,我们必须要启动这个图。

启动图的第一步就是构造一个会话(Sess),创建一个Session对象。调用 sess 的 run() 方法来执行矩阵乘法 op, 传入 product 作为该方法的参数。函数调用 ‘run(product)’ 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行。最终任务结束,关闭会话。

1
2
3
4
5
6
7
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
result = sess.run(product)
print (result)
# 任务完成, 关闭会话.
sess.close()

最终的输出结果为:

1
[[ 24.]] #没问题,算对了

我们也可以使用with代码块来实现对话的自动关闭,在离开with代码块时,会话会自动关闭。

1
2
3
with tf.Session() as sess:
result = sess.run(product)
print(result)

最终的输出结果为:

1
[[ 24.]]

交互式对话

使用上述方法,会出现一个对话被绑定在一个变量上的情况,有的时候我们并不想这么做,所以我们可以使用交互式对话的方式避免这样的情况。

使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()

1
2
3
4
5
6
7
8
sess = tf.InteractiveSession()
x = tf.Variable([ 1.0, 2.0]) #后面会讲到Variable
a = tf.constant([ 5.0, 3.0])
# 使用初始化器 initializer op 的 run() 方法初始化 'x',由于x是一个Variable,所以我们要对其进行初始化。
x.initializer.run()
# 增加一个减法 subtract op, 从 'x' 减去 'a'. 运行减法 op, 输出结果
sub = tf.subtract(x,a)
print (sub.eval())

最终的输出结果为:

1
[ -4. -1.] #没错,又算对了

张量(Tensor)

TensorFlow的名字中第一个单词就是Tensor,可见Tensor在TensorFlow中的重要性。

Tensor可以理解为是一个数据结构,其实就是一个N维数组。TensorFlow用tensor表示所有的数据。

在计算图中,操作间传递的数据都是tensor。

一个 tensor包含一个静态类型rank,和一个shape。

阶(Rank)

阶(Rank)用于描述张量的维数

一阶Tensor可以理解为数学上的向量,二阶Tensor可以理解为数学上的矩阵。

对于一个二阶张量你可以用语句t[i, j]来访问其中的任何元素。而对于三阶张量你可以用’t[i, j, k]’来访问其中的任何元素。

1
2
3
4
5
6
7
8
with tf.Session() as sess:
t1 = tf.constant([ 1.0, 2.0, 3.0])
t2 = tf.constant([[ 1.0, 2.0],[ 3.0, 4.0]])
t3 = tf.constant([[[ 2.0, 4.0],[ 6.0, 8.0]],[[ 1.0, 2.0],[ 3.0, 4.0]]])
print(t1[ 0].eval())
print(t2[ 1].eval())
print(t2[ 1, 0].eval())
print(t3[ 1, 0].eval())

输出结果如下:

1
2
3
4
1.0
[ 3. 4.]
3.0
[ 1. 2.]

不同阶的数学表示

形状(Shape)

这个属性与nparray的shape属性基本一致,因为一个Tensor可以理解为是一个N维数组,所以Shape属性就是获取数组的大小。

1
2
3
4
5
6
7
with tf.Session() as sess:
t1 = tf.constant([ 1.0, 2.0, 3.0])
t2 = tf.constant([[ 1.0, 2.0],[ 3.0, 4.0]])
t3 = tf.constant([[[ 2.0, 4.0],[ 6.0, 8.0]],[[ 1.0, 2.0],[ 3.0, 4.0]]])
print(t1.shape)
print(t2.shape)
print(t3.shape)

输出结果如下:

1
2
3
( 3,)
( 2, 2)
( 2, 2, 2)

数据类型(dtype)

不同的数据类型

变量

变量用来记录一些数据和状态,维护图执行过程中的状态信息。

当训练模型时,用变量来存储和更新参数。变量包含张量 (Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。

变量的创建

当创建一个变量时,可以一个张量作为初始值传入构造函数Variable()。初始值可以是常量也可以是随机值。

但注意,初始化变量时,都需要指定传入张量的Shape,Tensor的Shape会自动成为变量的Shape。

1
2
3
#创建两个变量
weights = tf.Variable(tf.random_normal([ 784, 20], stddev= 0.35),name= "weights")
biases = tf.Variable(tf.zeros([ 20]), name= "biases")

变量的初始化

变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。
除此之外,也可以从检查点文件中重新获取变量值。
使用tf.initialize_all_variables()初始化所有变量

1
init = tf.global_variables_initializer()

使用tf.initialize_all_variables()将所有的变量并行的初始化。
我们也可以使用一个变量的initialized_value()方法初始化另一个变量的值。

1
2
#使用weights初始化w2
w2 = tf.Variable(w1.initialized_value(), name= "w2")

最后我们整体执行一下

1
2
3
4
5
6
7
8
9
10
11
12
#创建两个变量
w1 = tf.Variable(tf.random_normal([ 784, 20], stddev= 0.35),name= "weights")
b1 = tf.Variable(tf.zeros([ 20]), name= "biases")
#初始化所有变量
init = tf.global_variables_initializer()
#使用weights初始化w2
w2 = tf.Variable(w1.initialized_value(), name= "w2")
with tf.Session() as sess:
sess.run(init)
print(w1)
print(b1)
print(w2)

输出结果:

1
2
3
<tf.Variable 'weights:0' shape=( 784, 20) dtype=float32_ref>
<tf.Variable 'biases:0' shape=( 20,) dtype=float32_ref>
<tf.Variable 'w2:0' shape=( 784, 20) dtype=float32_ref>

变量的保存与恢复

我们在训练模型的过程中,经常需要将已经训练好的模型进行保存,这个时候我们需要将其变量进行保存,并在下一次使用时进行恢复。

使用tf.train.Saver()创建一个Saver来管理模型中的所有变量。

变量的保存

1
2
3
4
5
6
7
8
9
10
# 创建一些变量
w1 = tf.Variable(tf.random_normal([ 784, 20], stddev= 0.35),name= "weights")
b1 = tf.Variable(tf.zeros([ 20]), name= "biases")
# 初始化
init_op = tf.global_variables_initializer()
# 创建一个Saver
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(init_op)
save_path = saver.save(sess, "./tmp/model.ckpt")

保存成功后,一般会得到这四个文件

变量的恢复

此时我们不再需要对变量进行初始化

1
2
3
4
5
6
7
8
# 创建一些变量
w1 = tf.Variable(tf.random_normal([ 784, 20], stddev= 0.35),name= "weights")
b1 = tf.Variable(tf.zeros([ 20]), name= "biases")
# 创建一个Saver
saver = tf.train.Saver()
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "./tmp/model.ckpt")

使用变量实现一个计数器

# 创建一个变量, 初始化为标量 0.
state = tf.Variable( 0, name= "counter")
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant( 1)
new = tf.add(state, one)
update = tf.assign(state, new) #使用assign将 new 赋值给 state
# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.global_variables_initializer()
# 启动图, 运行 op
with tf.Session() as sess:
# 运行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
print (sess.run(state))
# 运行 op, 更新 'state', 并打印 'state'
for _ in range( 3):
sess.run(update)
print(sess.run(state))

输出结果:

1
2
3
4
0
1
2
3

其中的一个函数:

tf.assign(ref, value, validate_shape=None, use_locking=None, name=None),函数完成了将value赋值给ref的作用。其中:ref 必须是tf.Variable创建的tensor,如果ref=tf.constant()会报错!

Fetch

Fetch用于取回操作的输出内容。

为了取回操作的输出内容,可以在使用 Session对象的 run()调用执行图时,传入一些 tensor,这些tensor会帮助你取回结果。

需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。

1
2
3
4
5
6
7
input1 = tf.constant( 3.0)
input2 = tf.constant( 2.0)
added= tf.add(input1, input2)
mul = tf.multiply(input1, added)
with tf.Session() as sess:
result = sess.run([mul, added]) #需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。
print (result)

输出的结果:

1
[ 15.0, 5.0]

Feed

feed 使用一个tensor值临时替换一个操作的输出结果。

可以将feed数据作为run()调用的参数。

feed只在调用它的方法内有效,方法结后,feed就会消失。

最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。

1
2
3
4
5
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
print (sess.run([output], feed_dict={input1:[ 5.], input2:[ 2.]}))

输出的结果:

1
[array([ 10.], dtype=float32)]

END

实战案例

▍Python机器学习实践:随机森林算法训练及调参 (附代码)

▍自己动手构建一个人脸识别模型----看她是否认识您

▍Python实战 爬取万条票房数据分析2019春节档电影状况

▍教你用Python撩妹:微信推送天气早报/睡前故事/精美图片

▍用Python的Sklearn库预测电信客户流失分析

▍Python爬虫基础:验证码的爬取和识别详解

▍Python爬取3w条游戏评分数据,看看哪款最热门?

▍用大数据扒一扒蔡徐坤的真假流量粉 |

▍用Python爬取数据来分析 2019年金三银四 Python就业行情

▍一个完整的电信客服分析平台大数据项目:架构、实现、数据

▍如何使用 Deepfakes 给主播换脸?教程来了

爱数据,爱技术,爱AI,36大数据社群(大数据交流、AI技术学习群、机器人研究、AI+行业、企业合作群)火热招募中,对大数据和AI感兴趣的小伙伴们。增加AI小秘书微信号:a769996688,说明身份即可加入。

长按识别二维码关注我们

欢迎投稿,投稿/合作:dashuju36@qq.com

如果您觉得文章不错,那就分享到朋友圈~

教程▍一步步上手TensorFlow——基础知识相关推荐

  1. Python基础教程(第3版)中文版 第一章 快速上手:基础知识(笔记)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,分享给大家: https://www.captainai.net/lf 如果你学完了Python不知道干什么,不妨去了解一下. 第一章 快速 ...

  2. 计算机java语言教程,计算机JAVA教程二讲Java语言基础知识.doc

    计算机JAVA教程二讲Java语言基础知识 2.1简单数据类型 2.1.1 标识符和保留字 1.标识符 程序员对程序中的各个元素加以命名时使用的命名记号称为标识符(identifier).Java语言 ...

  3. 3.1 Tensorflow基础知识

    3.1 Tensorflow基础知识 3.1.1 深度学习框架介绍 框架对比: 1.技术层面 对于个人开发者,它的主要用途为科研,而企业用户的主要用途为进行AI应用,提升生产效率.在此,主要从两类用户 ...

  4. 软考 程序员教程-第三章 数据库基础知识

    软考 程序员教程-第三章 数据库基础知识 第三章 数据库基础知识 3.1 基本概念 数据库系统(DataBase System,DBS)由数据库(DataBase,DB).硬件.软件和人员4大部分组成 ...

  5. JAVA转GO第一步,我跟着教程看了一遍基础知识

    ** JAVA转GO第一步,我跟着教程看了一遍基础知识 ** 时间飞逝,转眼间工作快满5年了,看着同期毕业的朋友们大部分都选择了稳定的公务员.事业单位.学校的老师,前途大好.而我毕业后一直留在互联网公 ...

  6. 好程序员web前端教程分享web前端入门基础知识

    好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML.CSS和JavaScript.只懂其中一两个还不行,必须对这三门语言都要熟悉.下面我们一起来看一看吧! ...

  7. MATLAB基础教程(2) 语言基础知识

    本教程主要讲到MATLAB语法.运算符.数据类型.数组索引及处理等等语言基础知识.大概可分四大部分: (1)输入命令 输入命令- MATLAB & Simulink- MathWorks 中国 ...

  8. 不染计算机演奏教程,全国计算机等级考试一级教程-第1章 计算机基础知识 .pdf...

    电饭锅电饭锅电饭锅电饭锅电饭锅大范甘迪发过的个dfg 全国计算机等级考试一级教程 王爱敏 主讲:贾鹏老师 考试介绍-考试信息 l 考试时间 :每年3月20日和9月20日前后考试 . l 考试方式 :1 ...

  9. Python爬虫教程(一):基础知识

    目录 01 基础知识 1.1 渲染 1.2 http(超文本传输协议)协议 1.3 requests进阶 02 数据解析 2.1 re模块 2.2 bs4模块 2.3 xpath模块 01 基础知识 ...

最新文章

  1. golang import后带“_”下划线的意义
  2. re2c php,PHP的词法解析器:re2c
  3. Linux内核启动速度优化,嵌入式Linux启动时间优化的秘密之五-Bootloader
  4. 利用velocity.js将svg动起来
  5. 【直播讲座】用友摩天联合光环国际,听国学学项目管理
  6. 常用php时间戳格式化与转换
  7. 用python实现时间的动态(动态时钟)+ 算出某年某月星期几的所有日期
  8. hexo+git+github+域名搭建个人博客提示404_不用花一分线,松哥手把手教你上线个人博客...
  9. beego mysql按时间排序_beego的数据库操作优化
  10. FTP下载文件夹到windows
  11. 每个产品经理都应该了解的5大技术技能
  12. VCL界面组件DevExpress VCL v22.1 - 发布全新的Shell组件
  13. 网络socket编程--多路复用
  14. 违反唯一约束条件 ORA-00001
  15. 爬取图片-工作常用小工具01
  16. 自动驾驶技术之——被低估的传感器超声波雷达
  17. vue_music:歌手singer.vue页面
  18. append和appendTo的区别以及js中的appendChild用法
  19. 赛宁网安“网络安全卓越中心”:立足科技创新 推动网安产业高质量发展
  20. SAP VF11冲销发票BADI

热门文章

  1. ARKit之路-AR截屏
  2. 2021 年度总结——平安喜乐
  3. Flutter开发之——AlertDialog
  4. soapUI文件头带请求
  5. 记录一下,关于查考勤的脚本
  6. AlertDialog和ProgressDialog
  7. 什么品牌蓝牙耳机音质好?平价好用的蓝牙耳机推荐
  8. 无线蓝牙耳机排行榜_2021公认性价比最高蓝牙耳机品牌
  9. Games104现代游戏引擎入门-lecture3如何构建一个游戏世界
  10. 如何在word中插入excel文件