目录

什么是TensorFlow

TensorFlow的特点

安装方法

在线安装

离线安装

案例1:Hello TensorFlow! 

案例2:张量相加

TensorFlow体系结构

体系结构概述

单机模式与分布式模式

后端逻辑层次

基本概念

张量(Tensor)

数据流

操作(Operation, 简称OP)

图(Graph)和会话(Session)

变量(Variable)和占位符(Placeholder)

TensorFlow的基本操作

图及相关操作

案例3:查看默认图的属性

会话及相关操作

相关操作

会话常见的错误及原因

案例4:指定会话运行某个图

张量的阶与形状

张量的数据类型

张量常用属性

案例5:查看张量属性

案例6:生成张量

张量类型转换

案例7:张量类型转换

占位符及其用法

案例8:占位符使用

张量形状改变

案例9:修改张量形状

张量数学计算

案例10:张量数学计算

变量及其操作

案例11:变量使用示例


什么是TensorFlow

TensorFlow是由谷歌人工智能团队谷歌大脑开发和维护的开源深度学习平台,是目前人工智能领域主流的开发平台,在全世界有着广泛的用户群体。

TensorFlow的特点

  • 优秀的构建设计,通过"张量流"进行数据的传递和计算,用户可以容易的、可视化的看到张亮流动的每一个环节
  • 可轻松地在cpu/gpu上部署,进行分布式计算,为大数据分析提供计算能力的支撑
  • 跨平台性好灵活性强,Tensorflow不仅可在Linux,Mac和Windows系统中运行,甚至还可以在移动终端下工作

安装方法

在线安装

安装tensorflow及依赖包:pip install tf-nightly

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tensorflow

安装纯净包:pip install tensorflow

安装gpu版:pip install tf-nightly-gpu

离线安装

https: //pypi. org/project/tensorflow/#files

案例1:Hello TensorFlow! 

import tensorflow as tf
hello = tf. constant("hello TensorFlow! ")#定义一个常量(张量)
sess = tf. session()#创建一个session用来执行操作
print(sess. run(hello))#用sess的run方法执行hello操作,并打印结果
sess. close()

案例2:张量相加

import tensorflow as tf
a = tf. constant(5. 0)#张量a
b = tf. constant(1. 0)#张量b
c = tf. add(a, b)#张量相加
with tf. session as sess:
print(sess. run(c))

TensorFlow体系结构

体系结构概述

         tensorflow属于"定义""运行"相分离的运行机制。从操作层面可以抽象为两种:模型构建和模型运行。

客户端:用户编程,执行使用

调度器master:用来与客户端交互并进行任务调度。

工作节点work process:每个work process的可以访问一到多个device。

设备device:tensorflow的计算核心执行计算。

单机模式与分布式模式

TensorFlow的实现分为"单机实现"和"分布式实现"。

tensorflow 在线教程_tensorflow

后端逻辑层次

tensorflow 在线教程_pycharm_02

基本概念

张量(Tensor)

多维数组或向量,张量是数据的载体,包含名字、形状、数据类型等属性。

tensorflow 在线教程_tensorflow 在线教程_03

数据流

  • 数据流图用"节点"和"线"的有向图来描述数学计算。
  • "节点"一般用来表示数学操作,也可以表示数据输入的起点/输出的终点,或者是读取/写入持久变量的终点。
  • "线"表示"节点"之间的输入或输出关系,这些数据"线"可以运输多维数据数组,即"张量"。
  • 一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行的执行运算。

tensorflow 在线教程_pycharm_04

操作(Operation, 简称OP)

指专门执行计算的节点,tensorflow函数或api定义的都是操作。

常用操作包括:标量运算、向量运算、矩阵运算、带状态的运算、神经网络组件、存储、恢复、控制流、队列及同步运算等等。

图(Graph)和会话(Session)

  • 图描述整个程序结构,TensorFlow中所有的计算都构建在图中。就算我们不定义图,系统会定义一个默认的图来执行Session。
  • 会话用来执行图的运算。

变量(Variable)和占位符(Placeholder)

  • 在tensorflow中,变量是一种操作,是一种特殊的张量,保存的值能够进行存储持久化(张量不能进行持久化),它的值是张量。
  • 占位符是变量占位符,当不能确定变量的值时,可以先声明一个占位符真正执行时再传入变量。

TensorFlow的基本操作

图及相关操作

  • 图描述了计算的过程。TensorFlow程序通常被整合成一个构建阶段和一个执行阶段,在构建阶段中,op的执行步骤被描述成一个图;在执行阶段中,使用会话执行图中的op。
  • TensorFlow Python库中有一个默认图(default graph),op构造器可以为其增加节点。这个默认图对许多程序来说已经够用了,也可以创建新的图来描述计算过程。
  • 在tensorflow中,op/session/tensor都有graph属性。

案例3:查看默认图的属性

import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant (5. 0)
b = tf. constant (1. 0)
c = tf. add (a, b)
graph = tf. get_default_graph()#获取默认的图
with tf. Session() as ass: 
print(sess. run(c))
print(a. graph)#打印张量的graph属性
print(c. graph)#打印操作c的graph属性
print(sess. graph)#打印session的graph属性

会话及相关操作

  • 会话用来执行图中的计算,并且保存了计算张亮对象的上下文信息。
  • 会话的作用主要有:运行图结构、分配资源、掌握资源(如变量、队列、线程)
  • 一个session只能执行一个图的运算。可以在绘画对象创建时,指定运行的图。如果在构建绘画时未指定图形参数,则将会在图会话中使用默认图。如果在同一个进程中使用多个图(使用tf. graph()创建),则必须为每个图使用不同的会话,但每个图可以在多个会话中使用

相关操作

  • 创建会话

tf. Session()#使用默认图

  • 运行

-   session. run.(fetches, feed_dict = None)

-   参数:fetches 图中的单个操作,或多个操作的列表

                  feed_dict 运行传入的参数构成的字典,可以覆盖之前的值

  • 关闭

session. close()

会话常见的错误及原因

调用run()方法时,可能会出现的错误及原因:

    - RuntimeError:Session处于无效(如关闭)

    - TypeError:fetches或feed_dict的键是不合适的值

    - ValueError:fetches或feed_dict的键无效或引用的值不存在

案例4:指定会话运行某个图

import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant (5. 0)
b = tf. constant (1. 0)
c = tf. add (a, b)
graph = tf. get_default_graph()#获取默认的图
print(graph)
#新创建一个图
graph2 = tf. Graph()
print(graph2)
with graph2. as_default_graph(): #设置默认图
d = tf. constant (11.0)#操作d属于graph2
with tf. Session(graph = graph2) as ass: #执行graph2
print(sess. run(c))#报错,因为c不在graph2中
print(sess. run(d))
print(a. graph)#打印张量的graph属性
print(c. graph)#打印操作c的graph属性
print(sess. graph)#打印session的graph属性

张量的阶与形状

  • 阶:张量的维度(数方括号的层数)
  • 形状表示方法:

0维:()                         1维: (5) 一行5个元素

2维: (2, 3)2行三列 3维: (2, 3, 4)两个3行4列的矩阵

张量的数据类型

tensorflow 在线教程_pycharm_05

张量常用属性

tensorflow 在线教程_tensorflow_06

案例5:查看张量属性

import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant(5. 0)
with tf. Session() as sess: 
print(sess,. run(a))
print("name: ", a. name)
print("dtype: ", a. dtype)
print("shape:", a. shape)
print("op:", a. op)
print("graph:", a. graph)

案例6:生成张量

import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
#创建一个值全部为0的张量
tensor_zeros = tf. zeros(shape = [2, 3], dtype ="float32")
#创建一个值全部为1的张量
tensor_ones = tf. ones(shape = [2, 3], dtype ="float32")
#创建正态分布随机张量
tensor_nd = tf. random_normal(shape = [10], mean = 1. 7, stddev = 0. 2, dtype = "floar32")
#创建一个形状和tensor_ones一样,值全为0的张量
tensor_zeros_like = tf. zeros_like(tensor_ones)
with tf. Session() as sess: 
print(tensor_zeros. eval())#eval表示在session中执行计算,相当于sess. run(),但更便捷
print(tensor_ones. eval())
print(tensor_nd,. eval())
print(tensor_zeros_like. eval())

张量类型转换

tensorflow 在线教程_python_07

案例7:张量类型转换

import tensorflow as tf
tensor_ones = tf. ones(shape =[2, 3], dtype ="int32")
tensor_float = tf. constant(1. 1, 2.2, 3. 3)
with tf. Session as sess: 
print(tf. cast(tensor_ones, tf. float32). eval())#将tensor_ones转换为浮点型并打印
print(tf. cast(tensor_float, tf. string). eval())#类型不兼容的转换,不允许直接转换

占位符及其用法

  • 不确定张量内容情况下,可以使用占位符先占个位置,然后执行计算时再通过参数传入具体数据执行计算(通过feed_dict参数指定)。
  • placeholder节点被声明的时候是未初始化的,也不包含数据,如果没有为他提供数据,则tensorflow运算时会产生错误。
  • 占位符定义:

name = placeholder(dtype, shape = None, name = None)

案例8:占位符使用

import tensorflow as tf
#定义两个占位符
plhd = tf. placeholder(tf. float32, [2, 3])
plhd2 = tf. placeholder(tf. float32, [None, 3])
plhd3 = tf. placeholder(tf. float32, [None, 4])
with tf. Session as sess: 
d = [[1, 2, 3], [4, 5, 6]]
print(sess. run(plhd, feed_dict = {plhd: d}))#执行占位符操作需要传入数据
print(sess. run(plhd2, feed_dict = {plhd2: d}))#定义为n行3列,执行时传入两行三列
print(sess. run(plhd3, feed_dict = {plhd3: d})#定义为n行4列,执行时传入2行3列,报错

张量形状改变

  • 静态形状:在创建一个张量时初始形态的形状

tf. Tensor. get_shape(): 获取Tensor对象的静态形状

tf. Tensor. set_shape(): 更新Tensor对象的静态形状

#注意:更换静态形状的时候,1-D到1-D, 2-D到2-D,不能跨阶数改变形状;对于已经固定或者设置静态形状的变量或张量,不能再次设置静态形状。

  • 动态形状:在运行图时,动态形状才是真正用到的,这种形状是一种描述原始张量在执行过程中的一种张量

tf. reshape(tf. Tensor, shape) : 梦见一个具有不同动态形状的新张量

可以跨纬度转换,如1-D到2-D, 1-D到3-D。

案例9:修改张量形状

import tensorflow as tf
#静态形状:初始形状,只能设置一次,不能阶界设置
#动态形状:运行时的形状,可以多次设置,可以跨接设置,但元素总数要一样
pld = tf. placeholder(tf. float32, [None, 3])
pld. set_shape([4, 3])#设置静态形状,一旦固定,就不能再次改变
print(pld)
#pld. set_shape([5, 3])静态形状只能设置一次,再次设置系统会报错
#设置张量的动态形状,实际是创建一个新的张量
new_pld = tf. reshape(pld, [3, 4])#设置动态形状
print(new_pld)
new_pld = tf. reshape(pld, [2, 6]) #多次设置动态形状
print(new_pld)
#new_pld = tf. reshape(pld, [2, 4])元素数量不匹配,系统报错
with tf. Session() as sess: 
pass

张量数学计算

tensorflow 在线教程_tensorflow_08

需要特别说明一下矩阵乘法的规则:

  • 当矩阵A的列数(columm)等于矩阵B的行数(row)时,A与B才可以相乘
  • 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数
  • 矩阵C的第M行第N列的元素等于矩阵A的第M行的元素与矩阵B的第N列对应元素乘积之和

 

案例10:张量数学计算

import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
x = td. constant([[1, 2], [3, 4]], dtype = tf. float32)
y = td. constant([[4, 3], [3, 2]], dtype = tf. float32)
x_add_y = tf. add(x, y)#张量相加
x_mul_y = tf. matmul(x, y)#张量矩阵相乘
log_x = tf. log(x)#求对数
x_sum_1 = tf. reduce_sum(x, axis = [1])#1表示在行方向 0表示在列方向
#张量计算片段和
data  = tf. constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype = tf. float32)#定义原始张量
segment_idx = tf. constant([0, 0, 0, 1, 1, 2, 2, 2, 2, 2], dtype  = tf. int32)#定义一个片段,几个元素相同元素为一组,上面相同数量的数字相加
x_seg_sum = tf. segment_sum(data, segment_ids)
with tf. Session as sess: 
print(x_add_y. eval())
print(x_mul_y. eval())
print(log_x. eval())
print(x_sum. eval())#在指定维度上求和
print(x_seg_num. eval())

变量及其操作

  • 变量是一种op,它的值是张量
  • 尽量能够持久化保存,普通张量则不行
  • 当定义一个变量时,需要在会话中进行初始化
  • 变量创建:

tf. Variable(initial_Value = None, name = None)

案例11:变量使用示例

"""
1.变量是一种特殊的张量
2.变量可以进行持久化保存,张量则不可以
3.变量使用之前,要进行显式的初始化
"""
import tensorflow as tf
a = tf.costant([1,2,3,4])
var = tf.Variable(tf.random_normal([2,3],mean = 0.0,stddev = 1.0),
                  name = "var")
#在变量操作执行之前,要执行全局初始化(初始化也是一个OP,需要在Session的run方法中执行)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(see.run(a))