1.深度学习
深度学习,如深度神经网络、卷积神经网络和递归神经网络已被应用计算机视觉、语音识别、图像识别(卷积神经网络)、自然语言处理(循环神经网络)、音频识别与生物信息学等领域并获取了极好的效果。
1.1 深度学习之运行速度
因为深度学习涉及到的数据量非常的大,特征非常多,再加上算法设计的本身比较复杂,所以计算需要等很长时间去优化。
- cpu: 运⾏操作系统,吹处理业务 计算能⼒不是特别突出。
- gpu:专⻔为计算设计的
所以,tensorflow的版本分别为cpu和gpu两个版本。
2. tensorflow图的结构
2.1 tensorflow实现加法运算
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 去掉警告用的
# 实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a, b)
print(sum1)
# 只要有会话的上下文环境,就可以方便的使用eval()
with tf.Session() as sess:
print(sess.run(sum1)) # 等价于print(sum1.eval())
输出的结果为:
2.2 数据流图
- 框架
- 计算密集型:tensorflow(cpu计算)
- IO密集型:django,scrapy(磁盘操作,HTTP请求等)
2.3 tensorflow进阶
2.3.1 图
- 图默认已经注册,一组表示 tf.Operation 计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象。
- 获取调用:
- tf.get_default_graph()
- op、sess或者tensor 的graph属性。
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 去掉警告用的
# 实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a, b)
# 默认的这张图,相当于是给程序分配一段内存
graph = tf.get_default_graph()
print(graph))
with tf.Session() as sess:
print(sess.run(sum1))
print(a.graph)
print(sum1.graph)
print(sess.graph)
输出的结果为:
2.3.2 图的创建
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 去掉警告用的
# 【tensorflow中需要某个东西时,需要使用上下文环境】
# 创建一张图包含了一组op和tensor,
# op:只要使用tensorflow的API定义的函数都是OP
# tensor:就指代的是数据
g = tf.Graph()
print(g)
with g.as_default():
c = tf.constant(11.0)
print(c.graph)
2.3.3 Session会话
-
会话把tensorflow框架分成了前端系统和后端系统:
- 前端系统:定义图的结构
- 后端系统:运算图结构
-
tf.Session() 运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图)
-
会话资源
会话可能拥有很多资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase,会话结束后需要进行资源释放。
- sess = tf.Session() sess.run(…) sess.close()
- 使用上下文管理器
with tf.Session() as sess:
sess.run(…)
-
config=tf.ConfigProto(log_device_placement=True)
-
交互式:tf.InteractiveSession()
2.3.4 会话的run()方法
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 去掉警告用的
# 实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a, b)
print(sum1)
with tf.Session() as sess:
print(sess.run([a,b,sum1]))
输出的结果为:
注意: sess.run([a,b,sum1])不要写成sess.run(a,b,sum1)他会被误认为传递的3个参数。
2.3.4.1 有关重载的运算符运行案例
# 错误案例
# 不是op不能运行
var1 = 2.0
var2 = 3
sum2 = var1 + var2
with tf.Session() as sess:
print(sess.run([sum2]))
上述代码不能运行
# 正确案例
# 不是op不能运行
var1 = 2.0
a = tf.constant(5.0)
# 有重载的机制,默认会给运算符重载成op类型
sum2 = var1 + a
with tf.Session() as sess:
print(sess.run([sum2]))
输出的结果为:正确
2.3.4.2 placeholder作为占位符的使用[Tensorflow Feed操作]
语法:placeholder提供占位符,run时候通过feed_dict指定参数
# placeholder是一个占位符,feed_dict一个字典
plt = tf.placeholder(tf.float32, [None, 3]) # 第二个参数是shape,这里为2行3列的一个二位数组
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(plt, feed_dict={plt: [[1, 2, 3], [4, 5, 36], [2, 3, 4]]}))
输出的结果为:
2.3.5 张量的定义
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
a = tf.constant(5.0)
# placeholder是一个占位符,feed_dict一个字典
plt = tf.placeholder(tf.float32, [2, 3, 4])
print(plt)
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(a.graph)
print("---------")
print(a.shape)
print(plt.shape)
print("-------")
print(a.name)
print("-------")
print(a.op)
# tensorflow:打印出来的形状表示
# 0维:() 1维:(5) 2维:(5,6) 3维:(2,3,4)
输出的结果为:
2.3.6 张量的动态形状与静态形状
动态性状和静态形状:在于有没有⽣成⼀个新的张量数据.
TensorFlow中,张量具有静态形状和动态形状
-
静态形状:
创建一个张量或者由操作推导出一个张量时,初始状态的形状
tf.Tensor.get_shape:获取静态形状
tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推
断的情况下 -
动态形状:
一种描述原始张量在执行过程中的一种形状(动态变化)
tf.reshape:创建一个具有不同动态形状的新张量
# 形状的概念
# 静态形状和动态性状
# 对于静态形状来说,一旦张量形状固定了,不能再次设置静态形状, 不能夸维度修改 只可以1D->1D 2D->2D
# 动态形状可以去创建一个新的张量,改变时候一定要注意元素数量要匹配 1D->2D 1->3D
plt = tf.placeholder(tf.float32, [None, 2])
print(plt)
plt.set_shape([3, 2])
print(plt)
# plt.set_shape([2, 3]) # 不能再次修改 打印错误
plt_reshape = tf.reshape(plt, [2, 3]) # 通过reshape改变张量的形状
print(plt_reshape)
with tf.Session() as sess:
pass
输出的结果为:
要点
2.3.7 张量的运算
创建随机张量