深度学习介绍
(1)介绍:
深度学习,如深度神经网络、卷积神经网络和递归神经网络已被应用
计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域
并获取了极好的效果。
(2)深度学习框架
Tensorflow
(1)认识Tensorflow
(2)Tensorflow特点
- 真正的可移植性
引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,
如安卓设备、ios、树莓派等等 - 多语言支持
Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和
执行你的graphs,你可以直接写python/c++程序。 - 高度的灵活性与效率
TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库
能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高 - 支持 TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望 TensorFlow 成为机器学习研究人员和开发人员的通用语言
(3)tensorflow安装
- conda创建一个新的python环境
conda create -n name python==3.6
- 激活环境
activate name
- 在该环境下下载tensorflow
conda install -n name tensorflow==1.15.0
- pycharm下使用该环境即可
(4)tensorflow初体验
tensorflow实现加法运算:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
# 实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a,b)
print(sum1) # Tensor("Add:0", shape=(), dtype=float32)
with tf.Session() as sess:
print(sess.run(sum1)) # 11.0
运行结果:
(5)分析
- 数据流图:
其中:
tensor:张量【一种数据类型】
operation(op):专门运算的操作节点,所有操作都是一个op
graph(图):你的整个程序的结构
(6)tensorflow进阶
1、图
2、会话
3、张量
4、变量
5、模型保存和加载
6、自定义命令行参数
1、图(op+tensor)
图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor
表示操作之间流动的数据单元的对象
(1)获取调用
1、tf.get_default_graph()
2、op、sess或者tensor 的graph属性
(2)图的创建
tf.Graph()
使用新创建的图
g = tf.Graph()
with g.as_default():
a = tf.constant(1.0)
assert c.graph is g
(3)哪些是op
(4)举例
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
# 创建一张图包含了一组op和tensor,上下文环境
# op:只要使用tensorflow的API定义的函数都是op
# 张量:就指代的是数据
g = tf.Graph()
print(g) # <tensorflow.python.framework.ops.Graph object at 0x00000157B6CDB470>
with g.as_default():
c = tf.constant(11.0)
print(c.graph) # <tensorflow.python.framework.ops.Graph object at 0x00000157B6CDB470>
# 实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(6.0)
sum1 = tf.add(a,b)
# print(sum1) # Tensor("Add:0", shape=(), dtype=float32)
# 默认的这张图,相当于是给程序分配一段内存
graph = tf.get_default_graph()
print(graph) # <tensorflow.python.framework.ops.Graph object at 0x00000157B6CF8860>
with tf.Session() as sess:
print(sess.run(sum1)) # 11.0
print(a.graph)
print(sum1.graph)
print(sess.graph) # <tensorflow.python.framework.ops.Graph object at 0x00000157B6CF8860>
# 这些都是一张图,都在一个地址
2、会话
(1)作用:
- 运行图的结构
- 分配资源计算
- 掌控资源(变量的资源,队列,线程)
(2)使用:
# 只能运行一个图,可以在会话当中指定图去运行
with tf.Session(graph=g) as sess:
print(sess.run(c)) # 11.0
运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图)
sess = tf.Session()
sess.run(...) # 会话的启用,启动整个图
sess.close() # 进行资源释放
使用上下文管理器:(默认结束时运行sess.close())
with tf.Session() as sess:
sess.run(...)
打印设备:
config=tf.ConfigProto(log_device_placement=True)
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(sum1)) # 11.0
交互式:tf.InteractiveSession()
sess.run(sum1) == sum1.eval()
# 只要有会话的上下文环境,就可以使用方便的eval()
(3)会话里的run()方法(会话的启动)
run(fetches, feed_dict=None,graph=None)
其中:
- fetches:嵌套列表,元组,namedtuple,dict或OrderedDict(重载的运算符也能运行)
# 不是op不能放入会话的run方法运行
var1 = 1
var2 = 3
sum2 = var1+var2
# 有重载的机制,默认会给运算符重载成op类型
sum3 = var1+a # 呗重载成op类型
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run([sum1,a,b])) # op元组类型
print(sess.run(sum2)) # 报错,不是op类型
print(sess.run(sum3))
- feed_dict:允许调用者覆盖图中指定张量的值,提供给placeholder使用(语法:placeholder提供占位符,run时候通过feed_dict指定参数)
意义:在程序执行的时候,不确定输入的是什么,提前“占个坑”
# 训练模型
# 实时的提供数据进行训练
# placeholder是一个占位符,feed_dict一个字典
plt = tf.placeholder(tf.float32,[None,3])
print(plt)
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(plt,feed_dict={plt:[[1,2,3],[4,5,6]]}))
- graph:指定图去运行
# 只能运行一个图,可以在会话当中指定图去运行
with tf.Session(graph=g) as sess:
print(sess.run(c)) # 11.0
- 返回值异常:
RuntimeError:如果它Session处于无效状态(例如已关闭)。
TypeError:如果fetches或feed_dict键是不合适的类型。
ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在
3、张量
张量:相当于numpy中的ndarray数组
(1)张量的阶(维度)
(2)张量的数据类型
(3)张量的属性
- graph : 张量所属的默认图
- op :张量的操作名
- name : 张量的字符串描述
- shape : 张量形状
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(plt,feed_dict={plt:[[1,2,3],[4,5,6]]}))
print(a.graph)
print("---------")
print(a.shape)
print(plt.shape)
print("--------")
print(a.name)
print("-------")
print(a.op)
(4)张量的动态形状与静态形状
区别:在于有没有生成一个新的张量数据
TensorFlow中,张量具有静态形状和动态形状
静态形状:
创建一个张量或者由操作推导出一个张量时,初始状态的形状
tf.Tensor.get_shape:获取静态形状
tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下
注意:对于静态形状来说,一旦张量形状固定了,不能再次设置静态形状,不能跨维度修改 1D->1D,2D->2D
动态形状:
一种描述原始张量在执行过程中的一种形状
tf.reshape:创建一个具有不同动态形状的新张量
注意:动态形状可以去创建一个新的张量,改变时候一定要注意元素数量要匹配 1D->2D,1D->3D
要点:1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状
3、tf.reshape()动态创建新张量时,元素个数不能不匹配
plt = tf.placeholder(tf.float32,[None,2])
print(plt)
plt.set_shape([3,2])
print(plt)
# plt.set_shape([4,2]) # 不能再次修改
plt_reshape = tf.reshape(plt,[2,3])
print(plt_reshape)
(4)张量的操作
- 生成固定值张量
tf.InteractiveSession() # 开启交互式会话
zero = tf.zeros([3,4],tf.float32)
print(zero.eval()) # 只要有会话的上下文环境,就可以使用方便的eval()
- 生成随机值张量
其中:mean为期望平均值,stddev为标准差
random = tf.random_normal([3,4],mean=4,stddev=0.2,dtype=tf.float32)
print(random.eval())
正态分布:
3. 张量变换
(1)改变类型
(2)形状和变换
(3)切片和拓展
a = [[1,2,3],[4,5,6]]
b = [[4,5,6],[7,8,9]]
c = tf.concat([a,b],axis=0)
print(c.eval())
d = tf.concat([a,b],axis=1)
print(d.eval())
(4)提供给Tensor运算的数学函数
https://www.tensorflow.org/versions/r1.0/api_guides/python/math_ops