深度学习
目录
1.深度学习介绍
-
学习
- 抽象说,学习就是认知的过程,从未知到已知的探索和思考。
- 任何从已经有的信息,无论是通过计算,判断,推理而后得到一个认知的过程都可以称为"学习"
-
输入
- 就是已知的信息
-
输出
- 就是最终获得的认知的结果
-
学习策略
- 思考过程,经验不同而导致的差异,可以统一归为"学习策略",好的学习策略会更快更准确的得到认知的结果,而不好的学习策略可能会花费更多的时间或者获得错误的结论
-
神经网络
-
现实世界中很多问题都可以归为分类或者回归问题,研究此类问题,学术界研究出来一种叫做"神经网络"的学习策略
-
在人脑中负责活动的基本单元是"神经元",它是细胞体为主体,由许多向周围延伸的不规则树枝状纤维构成的神经细胞。人脑中含有上百亿个神经元,这些神经元互相连接成一个更庞大的结构,就称为"神经网络"。学术界试图模仿人脑的"神经网络"建立一个类似的学习策略,也取名为"神经网络"。
-
-
从
x1,x2,x3
输入到输出的过程,定义了层次的概念。例如上图:包含四层,包括最左边的的输入层和最右边的输出层。L1和L4
分别是输入层和输出层。l2和L3
是隐藏层。即题目越难,给出的解题条件的信息可能越多,而解题所需要的过程就越复杂,也就可能需要更多的"隐藏层"来计算最终的结果 -
深度
- 就是从"输入层"到"输出层"所经历层次的数目,即"隐藏层"的层数,层数越多,网络的深度越深。所以越是复杂的问题,越需要深度和层次越多,每层的"神经元"数目也会变多。例如:
AlphaGo
的策略网络是13层,每一层的神经元数量为192个
- 就是从"输入层"到"输出层"所经历层次的数目,即"隐藏层"的层数,层数越多,网络的深度越深。所以越是复杂的问题,越需要深度和层次越多,每层的"神经元"数目也会变多。例如:
-
总结:深度学习就是用多层次的分析和计算手段,得到结果的一种方法
2.深度学习代表性的应用
-
图像识别(图像理解)
- 给机器一张图片让机器可以理解图片的内容
- 人脸识别
- 验证码识别
- 给机器一张图片让机器可以理解图片的内容
-
语音识别
-
自然语言处理NLP
-
理解人类的语言
- 情感分析
- 智能对话
- 图像识别和NLP的结合
- 例如:根据图片,得到一句图片相关内容的句子
-
-
机器自主(无人驾驶)
3.机器学习和深度学习的区别
- 算法方面:
- 机器学习的算法主要是处理回归和分类的相关问题
- 深度学习算法主要是处理较为复杂的相关事物的处理,比如NLP,图像识别,语音识别等
- 应用领域方面:
- 在NLP,图像识别,语音识别等领域中使用机器学习处理效果不好,但是深度学习可达到很好的效果。且深度学习已经被应用到了计算机的视觉,语音识别,NLP,音频识别于生物信息学等领域并获取了极好的结果
- 总结:机器学习和深度学习主要的区别就是算法和效率的不同
4.深度学习框架
-
TensorFlow
-
Caffe
-
Torch
-
…
5.TensorFlow
5.1认识tensorflow
- 谷歌大脑的产物,谷歌大脑最初是由吴恩达带领的
- 在谷歌内部很多产品都应用了
TensorFlow
,比如AlphaGo,Gmail,
谷歌地图等 TensorFlow
的特点:- 真正的可移植性
- 引入各种计算机设备的支持,包括
CPU,GPU
以及能够很好的运行在各个系统的移动端
- 引入各种计算机设备的支持,包括
- 多语言支持
- 支持
C++,python,R
语言等
- 支持
- 高度的灵活性和效率
- 真正的可移植性
5.2 环境安装
cpu
和gpu
的区别cpu
:在电脑中起着控制计算机运行的作用,是电脑的中央处理器gpu
:是一个附属型的处理器,主要处理计算中与图像计算有关的工作,并将数据更好地呈现在显示器中
- 总结:使用
gpu
的数据处理要比cpu
效率更快
6.tensorflow
进阶
- 图:
Tensorflow
是一个编程系统(一个编程语言),使用图(graph
)来表示一个计算任务或者计算单元- 计算任务:实现一个加法器,任意值的加法运算就是一个计算任务
- 会话:图必须要在会话中进行执行
tensor
:就是numpy
中的ndarray
,因此tensor
是一种数据类型,每个tensor
是一个类型化的数组或者是op
的返回值,就是tensorflow
中的数据。tensor
也可以被称为张量,张量的阶就是数组的维度- 节点
op(operation)
:图表示tensorflow
的计算任务,而一个计算任务的具体实现操作就是op
,一个op
需要使用0个或者多个tensor
来执行计算且会产生0个或多个tensor
,即tensorflow
的api
定义的函数都是op
- 总结
- 图描述了
tensorflow
计算的过程,为了进行计算,土必须在会话历被启动,会话将图的op
分发到诸如cpu或gpu
之类的设备上,图同时提供执行op
的方法,这些方法执行后,将产生的tensor
返回
- 图描述了
5.2属性与方法
-
实现加法运算
add(a,b)
-
矩阵运算
tf.matmul(a,b)
-
平方
tf.square(x)
-
均值
tf.reduce_mean()
-
梯度下降
api
- 类:
tf.train.GradientDescentOptimizer(learn_rate)
learning_rate
:需要指定学习率
- 类:
-
获取图
tf.get_default_graph()
op,session,tensor
的graph
属性
-
创建新图(创建一个单独的计算任务单元)
tf.Graph()
:新图对应的操作必须作用在上下文中- 上下文写法
with g.as_default()
-
会话
Session
- 会话就是运行图的一个资源类,运行的是默认的图,也可以单独运行指定图
- 会话的资源包含如下资源,会话结束后需要关闭对应的资源,因此需要在上下文资源管理器中使用会话
-
tf.Variable(initial_value=None,trainable=True)
trainable=True
表示在训练的过程中变量的值可以跟随训练而实时变化
-
tf.QueueBase
-
tf.ReaderBase
-
-
tensorflow
可以分为前端系统和后端系统- 前端系统:定义图的结构(定义张量
tensor
,定义op
等) - 后端系统:运行图
- 前端系统:定义图的结构(定义张量
-
会话的作用
- 运行图的结构
- 分配计算资源
- 掌握资源:会话只可以运行其对应图中的资源
Session(graph=g)
指定图
-
重载运算符:
session
只可以运行op或tensor
,不可以运行其他类型的数据,但是如果一个tensor
或者op
使用某个运算符和其他类型数据相加,则返回的为op
或tensor
类型a=tf.constant(3) b=4 sum=a+b print(sum) #Tensor("add_8:0", shape=(), dtype=int32)
-
run
方法s.run(fetches,feed_dict=None,graph)
fetches
:就是运行的op和tensor
,例如run(sum)
也可以run([a,b,run])
feed_dict
:程序在执行的时候,不确定输入数据是什么,提前使用placeholder
占位- 给
session
提供实时运行的数据 - 应用场景,训练模型时,样本数量不确定时使用
- 给
import tensorflow as tf #创建一个op,placeholder为占位对象,现在占据了一个n行3列的位置 feature=tf.placeholder(dtype=tf.float32,shape=(None,3))#None为任意行数 with tf.Session() as s: print(s.run(feature,feed_dict={feature:[[1,2,3],[4,5,6],[4,5,6]]})) #[[1. 2. 3.] # [4. 5. 6.] # [4. 5. 6.]]
-
张量相关的
api
-
自动生成张量:
tf.zeros(shape=(3,2))
tf.ones()
tf.random_normal(shape,mean,stddev)
mean
:平均值stddev
:方差
-
改变类型:
tf.cast(x,dtype)
arr=tf.zeros(shape=(4,5)) rand_arr=tf.random_normal(shape=(3,4),mean=2,stddev=2) print(rand_arr)#Tensor("random_normal_1:0", shape=(3, 4), dtype=float32)
-
-
变量
- 概念:变量也是一种
op
,是一种特殊的张量,能够进行持久化存储(普通张量不行),变量的值为张量 api
:tf.Varilable(initial_value,name,trainable)
initial_value
:变量接收的值(张量)
- 必须进行变量的显示的初始化,返回一个初始化变量的
op
:init_op=tf.global_variables_initializer()
import tensorflow as tf a=tf.constant([1,2,3,4,5]) #创建了一个op var=tf.Variable(initial_value=a) #显示的初始化 init_op=tf.global_variables_initializer() with tf.Session() as s: s.run(init_op) print(s.run(var)) print(a.eval()) #[1 2 3 4 5] # [1 2 3 4 5]
- 概念:变量也是一种
-
模型保存与加载
- 定义
saver
的op
saver=tf.train.Saver()
- 在会话中运行保存函数
saver.save(session,'path')
path
:保存模型的路径,携带模型的名称
- 在会话运行时加载模型:
if os.path.exists('./xxx/checkpoint')
:saver.restore(session,'path')
- 定义
6.示例
-
定义张量
import tensorflow as tf #定义a,b两个tensor(张量) a=tf.constant(1.0) b=tf.constant(2.0) print(a,b)#Tensor("Const_2:0", shape=(), dtype=float32) Tensor("Const_3:0", shape=(), dtype=float32)
-
调用
add
的函数(op)
实现两数的相加import tensorflow as tf a=tf.constant(3) b=tf.constant(4) #定义一个op,相当于函数 sum=tf.add(a,b) print(sum)#Tensor("Add:0", shape=(), dtype=int32)
-
在会话中启动图
import tensorflow as tf #定义a,b两个张量 a=tf.constant(3) b=tf.constant(4) #定义一个op sum=tf.add(a,b) with tf.Session() as s: print(s.run(sum)) #7
-
获取图
import tensorflow as tf a=tf.constant(3) b=tf.constant(4) sum=tf.add(a,b) with tf.Session() as s: print(s.run(sum)) print(tf.get_default_graph())#返回当前的图 print(sum.graph) print(a.graph) print(s.graph) #7 # <tensorflow.python.framework.ops.Graph object at 0x000001D557E21C48> # <tensorflow.python.framework.ops.Graph object at 0x000001D557E21C48> # <tensorflow.python.framework.ops.Graph object at 0x000001D557E21C48> # <tensorflow.python.framework.ops.Graph object at 0x000001D557E21C48>
-
创建新图
import tensorflow as tf #创建一个新图 g=tf.Graph() with g.as_default(): #新图对应的操作 d=tf.constant([1,2,3]) c=tf.constant([4,5,6]) sum_=tf.add(c,d) print(d.graph) a=tf.constant(3) b=tf.constant(4) sum=tf.add(a,b) with tf.Session() as s: print(s.run(sum)) print(s.graph) #<tensorflow.python.framework.ops.Graph object at 0x000001D559096BC8> # 7 # <tensorflow.python.framework.ops.Graph object at 0x000001D557E21C48>
-
实现会话运行指定图
import tensorflow as tf #创建一个新图 g=tf.Graph() with g.as_default(): #新图对应的操作 d=tf.constant([1,2,3]) c=tf.constant([4,5,6]) sum_=tf.add(c,d) print(d.graph) a=tf.constant(3) b=tf.constant(4) #定义一个op sum=tf.add(a,b) #指定g图 with tf.Session(graph=g) as s: print(s.run(sum_)) print(s.graph) # <tensorflow.python.framework.ops.Graph object at 0x000001D559099A08> # [5 7 9] # <tensorflow.python.framework.ops.Graph object at 0x000001D559099A08>