1. 认识tensorflow
1.1. 深度学习介绍
- 深度学习,如
深度神经网络、卷积神经网络
和递归神经网络已被应用计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。
1.2. 深度学习框架和支持语言
1.3. tensorflow 简介
1.4. tensorflow 特点
-
真正的可移植性
- 引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,如安卓设备、ios、树莓派等等
-
多语言支持
- Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs,你可以直接写python/c++程序。
-
高度的灵活性与效率
- TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高
-
支持
- TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望 TensorFlow 成为机器学习研究人员和开发人员的通用语言
1.5. tensorflow安装
- CPU版本:https://blog.csdn.net/niuxinzan/article/details/80269345
- GPU版本:https://blog.csdn.net/weixin_41294780/article/details/80482186
2. tensorflow图的结构
2.1. 名词解释
- tensor: 张量,要区别与变量(就指代的是数据)
- operation(op):专门运算的操作结点,所有操作都是一个op(只要使用tensorflow的API定义的函数都是op)
- graph(图): 整个程序的结构
- session(会话): 运算程序的图
2.2. 入门案例
- tensorflow1.15
import tensorflow as tf
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a, b)
with tf.Session() as sess:
print(sess.run(sum1))
- tensorflow2.0
import tensorflow as tf
g = tf.Graph()
with g.as_default():
a = tf.constant(2.0)
b = tf.constant(1.0)
sum1 = tf.add(a, b)
print(sum1)
with tf.compat.v1.Session(graph=g) as sess:
print(sess.run(sum1))
2.3. 图
2.3.1. 默认的图(tensorflow2.0已经没有默认的图了)
- 图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象
- 获取调用
- tf.get_default_graph() (注意:tensorflow2.0已经没有这个方法了)
- op、sess或者tensor 的graph属性
2.3.2. 图的创建
import tensorflow as tf
# 创建一张图,包含了op和tensor 上下文环境
# op: 只要使用tensorflow的API定义的函数都是op
# tensor: 就指代的是数据
g = tf.Graph()
with g.as_default():
c = tf.constant(11.0)
# 断言
assert c.graph is g
2.3.3. op的类型
- 标量运算:Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal
- 向量运算:Concat、Slice、Splot、Constant、Rank、Shape、Shuffle
- 矩阵运算:Matmul、MatrixInverse、MatrixDeterminant
- 带状态的运算:Variable、Assign、AssignAdd
- 神经网络组件:SoftMax、Sigmoid、ReLU、Convolution2D、MaxPooling
- 存储、恢复:Save、Restore
- 队列及同步运算:Enqueue、Dequeue、MutexAcquire、MutexRelease
- 控制流:Merge、Switch、Enter、Leave、Nextlteration
2.4. 会话
2.4.1. tensorflow 前后端系统
- 前端系统: 定义程序的图结构
- 后端系统: 运算图结构
2.4.2. 会话的作用
- 运行图的结构
- 分配资源计算
- 掌握资源(
变量
的资源,队列,线程)
2.4.3. 会话的参数
-
config=tf.compat.v1.ConfigProto(log_device_placement=True) 打印相关运行的设备信息
-
tensorflow1.15
import tensorflow as tf g = tf.Graph() with g.as_default(): a = tf.constant(3.0) b = tf.constant(4.0) sum1 = tf.add(a, b) with tf.Session(graph=g, config=tf.ConfigProto(log_device_placement=True)) as sess: print(sess.run(a)) print(sess.run(b)) print(sess.run(sum1)) print(sum1.eval())
-
tensorflow2.0
import tensorflow as tf g = tf.Graph() with g.as_default(): a = tf.constant(3.0) b = tf.constant(4.0) sum1 = tf.add(a, b) with tf.compat.v1.Session(graph=g, config=tf.compat.v1.ConfigProto(log_device_placement=True)) as sess: print(sess.run(a)) print(sess.run(b)) print(sess.run(sum1)) print(sum1.eval())
-
-
交互式:tf.compat.v1.InteractiveSession() 开启交互式会话,方便测试
-
a.eval() 相当于 sess.run(a)
- 注意: 在tensorflow2.0中使用了a.numpy()
2.4.4. 会话的run方法
-
run(fetches, feed_dict=None,graph=None)运行ops和计算tensor
-
嵌套列表,元组,
- namedtuple,dict或OrderedDict(
重载的运算符也能运行
, 比如tensorflow中的张量与python中的数据进行加减乘除运算)
- namedtuple,dict或OrderedDict(
-
feed_dict 允许调用者覆盖图中指定张量的值,提供给
-
placeholder使用
-
-
返回值异常
- RuntimeError:如果它Session处于无效状态(例如已关闭)。
- TypeError:如果fetches或feed_dict键是不合适的类型。
- ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在
-
重载逻辑
import tensorflow as tf
g = tf.Graph()
with g.as_default():
a = tf.constant(3.0)
# 重载
sum2 = a + 10
with tf.compat.v1.Session(graph=g, config=tf.compat.v1.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(sum2))
# 直接打印python普通变量报错
# print(sess.run(var1))
- placeholder占位符
import tensorflow as tf
g = tf.Graph()
with g.as_default():
# 训练模型
# 实时的提供数据区进行训练
# placeholder是一个占位符, feed_dict是一个字典,plt也是一个op
plt = tf.compat.v1.placeholder(tf.float32, [None, 3])
with tf.compat.v1.Session(graph=g, config=tf.compat.v1.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(plt, feed_dict={plt:[[1,2,3],[4,5,6]]}))
3. 张量的定义及数据
3.1. 张量
- Tensorflow基本的数据格式,可以理解为numpy中的数组
- 一个类型化的N维度数组(tf.Tensor)
- 由三部分,名字,形状,数据类型
3.2. 张量的阶
- 阶就是维度的意思,注意,0阶也就是标量
3.3. 张量的数据类型
- 一般比较常用的tf.float32 和 tf.int32
3.4. 张量的属性
- graph: 张量所属的图
- op: 张量的操作名
- name:张量的字符串描述
- shape:张量的形状
- tensorflow:打印出来的形状表示
- 0维:()
- 1维:(5)
- 2维:(2,3)
- 3维:(2,3,4)
- tensorflow:打印出来的形状表示
3.5. 张量的动态形状和静态形状
-
静态形状
- 创建一个张量或者由操作推导出一个张量时,初始状态的形状
- tf.Tensor.get_shape:获取静态形状
- tf.Tensor.set_shape():更新Tensor对象的静态形状
import tensorflow as tf g = tf.Graph() with g.as_default(): # 训练模型 # 实时的提供数据区进行训练 # placeholder是一个占位符, feed_dict是一个字典,plt也是一个op plt = tf.compat.v1.placeholder(tf.float32, [None, 2]) print(plt) print(plt.get_shape()) # 固定形状 plt.set_shape([3,2]) print(plt.get_shape())
- 创建一个张量或者由操作推导出一个张量时,初始状态的形状
-
动态形状
- 一种描述原始张量在执行过程中的一种形状
- tf.reshape:
创建一个
具有不同动态形状的新张量(注意: numpy中reshape直接修改原数据,tensorflow中创建了一个新的,不修改原来的)
import tensorflow as tf g = tf.Graph() with g.as_default(): # 训练模型 # 实时的提供数据区进行训练 # placeholder是一个占位符, feed_dict是一个字典,plt也是一个op plt = tf.compat.v1.placeholder(tf.float32, [None, 2]) # 动态修改形状,生成了一个新的张量 plt_reshape = tf.reshape(plt, [2,2]) print(plt) print(plt_reshape)
- tf.reshape:
- 一种描述原始张量在执行过程中的一种形状
-
注意要点:
- 转换静态形状的时候, 1-D到1-D,2-D到2-D,不能跨阶数改变
- 对于已经固定或者设置静态形状的张量/变量, 不能再次设置静态形状
- tf.reshape()动态创建新张量时, 元素个数不能不匹配