Merge pull request #4 from scutan90/master

sycn upstream
This commit is contained in:
Suseike 2018-11-26 12:28:58 +08:00 committed by GitHub
commit 1a6c896127
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
186 changed files with 4752 additions and 1192 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

6
.gitignore vendored
View File

@ -1,2 +1,4 @@
.ipynb_checkpoints .ipynb_checkpoints
.DS_Store .DS_Store
.gitignore
*.ipynb

View File

@ -9,9 +9,10 @@
# 3. 加入以及文档规范 # 3. 加入以及文档规范
寻求有愿意继续完善的朋友、编辑、写手;如有意合作,完善出书(成为共同作者)。 1、寻求有愿意继续完善的朋友、编辑、写手如有意合作完善出书成为共同作者
所有提交内容的贡献者,将会在文中体现贡献者个人信息(例: 大佬-西湖大学) 2、所有提交内容的贡献者将会在文中体现贡献者个人信息例: 大佬-西湖大学)
为了让内容更充实完善集思广益欢迎Fork该项目并参与编写。请在修改MD文件的同时或直接留言备注自己的姓名单位大佬斯坦福大学一经采纳会在原文中显示贡献者的信息如有收益会进一步分红谢谢 3、为了让内容更充实完善集思广益欢迎Fork该项目并参与编写。请在修改MD文件的同时或直接留言备注自己的姓名单位大佬斯坦福大学一经采纳会在原文中显示贡献者的信息谢谢
4、推荐使用typora-Markdown阅读器https://typora.io/
例子: 例子:
@ -57,7 +58,7 @@
|<font size="1">第十六章 自然语言处理NLP</font>|<font size="1">电子科技大学博士-盛泳潘深圳乌灵图明科技有限公司CTO-何建宏;DaoCloud研发工程师-张善干澳洲monash大学Research Scientist/Telstra(澳洲电信)Data Scientist-钟申俊博士;华南理工大学&UCI博士-黄振华</font>|| |<font size="1">第十六章 自然语言处理NLP</font>|<font size="1">电子科技大学博士-盛泳潘深圳乌灵图明科技有限公司CTO-何建宏;DaoCloud研发工程师-张善干澳洲monash大学Research Scientist/Telstra(澳洲电信)Data Scientist-钟申俊博士;华南理工大学&UCI博士-黄振华</font>||
|<font size="1">第十七章 移动端框架部署(新增)                                         </font>|<font size="1">川大硕士-顺丰科技-谈继勇;贵州大学硕士-三星-张达峰</font>|<font size="1">可加 </font>| |<font size="1">第十七章 移动端框架部署(新增)                                         </font>|<font size="1">川大硕士-顺丰科技-谈继勇;贵州大学硕士-三星-张达峰</font>|<font size="1">可加 </font>|
|<font size="1">第十八章 后端分布式框架部署(新增) </font>|<font size="1">广工学士-魅族科技-梁志成</font>|<font size="1">可加 </font>| |<font size="1">第十八章 后端分布式框架部署(新增) </font>|<font size="1">广工学士-魅族科技-梁志成</font>|<font size="1">可加 </font>|
|<font size="1">MD编辑</font>|<font size="2">汪明阔;南京大学硕士研究生-汪然;乐刻-张梦欣</font>|<font size="1">可加</font>| |<font size="1">MD编辑</font>|<font size="1">汪明阔;南京大学硕士研究生-汪然;乐刻-张梦欣;梅红伟-长虹-云服务开发</font>|<font size="1">可加</font>|
# 5. 更多 # 5. 更多
1. 寻求有愿意继续完善的朋友、编辑、写手; 如有意合作,完善出书(成为共同作者)。 1. 寻求有愿意继续完善的朋友、编辑、写手; 如有意合作,完善出书(成为共同作者)。
@ -74,9 +75,11 @@
![《深度学习500问》微信交流群二维码](/WechatIMG3.jpeg) ![《深度学习500问》微信交流群二维码](/WechatIMG3.jpeg)
3. 注意, 现出现不法分子冒充发起人,请广大伙伴儿知悉! 3. Markdown阅读器推荐https://typora.io/ 免费且对于数学公式显示支持的比较好。
4. 接下来将提供MD版本大家一起编辑完善敬请期待希望踊跃提建议补充修改内容 4. 注意, 现出现不法分子冒充发起人,请广大伙伴儿知悉!
5. 接下来将提供MD版本大家一起编辑完善敬请期待希望踊跃提建议补充修改内容
# 6. 目录 # 6. 目录
@ -574,6 +577,6 @@
**参考文献 366** **参考文献 366**
hey you are looked like a cool developer. hey you look like a cool developer.
Translate it in english. Translate it in english.

View File

@ -10,4 +10,6 @@
**贡献者(排名不分先后):** **贡献者(排名不分先后):**
内容贡献者可自加信息 内容贡献者可自加信息
刘彦超-东南大学
########################################################### ###########################################################

View File

@ -8,29 +8,29 @@
> Editor: 谈继勇 &乔成磊-同济大学 & 哈工大博士生-袁笛 > Editor: 谈继勇 &乔成磊-同济大学 & 哈工大博士生-袁笛
> Contact: scutjy2015@163.com qchl0318@163.com & dyuanhit@gmail.com > Contact: scutjy2015@163.com & qchl0318@163.com & dyuanhit@gmail.com
## 1.1 标量、向量、矩阵、张量之间的联系 ## 1.1 标量、向量、矩阵、张量之间的联系
**标量scalar)** **标量scalar)**
一个标量表示一个单独的数,它不同于线性代数中研究的其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称。 ​一个标量表示一个单独的数,它不同于线性代数中研究的其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称。
**向量vector** **向量vector**
一个向量表示一组有序排列的数。通过次序中的索引我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称比如xx。向量中的元素可以通过带脚标的斜体表示。向量$X$的第一个元素是$X_1$,第二个元素是$X_2$,以此类推。我们也会注明存储在向量中的元素的类型(实数、虚数等)。 一个向量表示一组有序排列的数。通过次序中的索引我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称比如xx。向量中的元素可以通过带脚标的斜体表示。向量$X$的第一个元素是$X_1$,第二个元素是$X_2$,以此类推。我们也会注明存储在向量中的元素的类型(实数、虚数等)。
**矩阵matrix** **矩阵matrix**
矩阵是具有相同特征和纬度的对象的集合,表现为一张二维数据表。其意义是一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值。通常会赋予矩阵粗体的大写变量名称,比如$A$。 ​矩阵是具有相同特征和纬度的对象的集合,表现为一张二维数据表。其意义是一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值。通常会赋予矩阵粗体的大写变量名称,比如$A$。
**张量tensor** **张量tensor**
在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。使用**$A$**来表示张量“A”。张量**$A$**中坐标为$(i,j,k)$的元素记作$A_{(i,j,k)}$。 ​在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。使用 $A$ 来表示张量“A”。张量$A$中坐标为$(i,j,k)$的元素记作$A_{(i,j,k)}$。
**四者之间关系** **四者之间关系**
> 标量是0阶张量向量是一阶张量。举例 > 标量是0阶张量向量是一阶张量。举例
> 标量就是知道棍子的长度,但是你不会知道棍子指向哪儿。 > ​标量就是知道棍子的长度,但是你不会知道棍子指向哪儿。
> 向量就是不但知道棍子的长度,还知道棍子指向前面还是后面。 > ​向量就是不但知道棍子的长度,还知道棍子指向前面还是后面。
> 张量就是不但知道棍子的长度,也知道棍子指向前面还是后面,还能知道这棍子又向上/下和左/右偏转了多少。 > ​张量就是不但知道棍子的长度,也知道棍子指向前面还是后面,还能知道这棍子又向上/下和左/右偏转了多少。
## 1.2 张量与矩阵的区别? ## 1.2 张量与矩阵的区别?
- 从代数角度讲, 矩阵它是向量的推广。向量可以看成一维的“表格”(即分量按照顺序排成一排), 矩阵是二维的“表格”(分量按照纵横位置排列), 那么$n$阶张量就是所谓的$n$维的“表格”。 张量的严格定义是利用线性映射来描述。 - 从代数角度讲, 矩阵它是向量的推广。向量可以看成一维的“表格”(即分量按照顺序排成一排), 矩阵是二维的“表格”(分量按照纵横位置排列), 那么$n$阶张量就是所谓的$n$维的“表格”。 张量的严格定义是利用线性映射来描述。
@ -43,33 +43,85 @@
## 1.4 向量和矩阵的范数归纳 ## 1.4 向量和矩阵的范数归纳
**向量的范数** **向量的范数**
定义一个向量为:$\vec{a}=[-5, 6, 8, -10]$。其不同范数求解如下: 定义一个向量为:$\vec{a}=[-5, 6, 8, -10]$。任意一组向量设为$\vec{x}=(x_1,x_2,...,x_N)$。其不同范数求解如下:
- 向量的1范数向量的各个元素的绝对值之和上述向量$\vec{a}$的1范数结果就是29。
$$
\Vert\vec{x}\Vert_1=\sum_{i=1}^N\vert{x_i}\vert
$$
- 向量的2范数向量的每个元素的平方和再开平方根上述$\vec{a}$的2范数结果就是15。
$$
\Vert\vec{x}\Vert_2=\sqrt{\sum_{i=1}^N{\vert{x_i}\vert}^2}
$$
- 向量的1范数向量的各个元素的绝对值之和上述向量$\vec{a}$的1范数结果就是29。
- 向量的2范数向量的每个元素的平方和再开平方根上述$\vec{a}$的2范数结果就是15。
- 向量的负无穷范数:向量的所有元素的绝对值中最小的:上述向量$\vec{a}$的负无穷范数结果就是5。 - 向量的负无穷范数:向量的所有元素的绝对值中最小的:上述向量$\vec{a}$的负无穷范数结果就是5。
- 向量的正无穷范数:向量的所有元素的绝对值中最大的:上述向量$\vec{a}$的负无穷范数结果就是10。
- 向量的L-P范数$L_p=|\vec{x}|_p=\sqrt[p]{\sum_{i=1}^{n}x_i^p},\vec{x}=( x_1,x_2,...,x_n )$ $$
\Vert\vec{x}\Vert_{-\infty}=\min{|{x_i}|}
$$
- 向量的正无穷范数:向量的所有元素的绝对值中最大的:上述向量$\vec{a}$的负无穷范数结果就是10。
$$
\Vert\vec{x}\Vert_{+\infty}=\max{|{x_i}|}
$$
- 向量的p范数
$$
L_p=\Vert\vec{x}\Vert_p=\sqrt[p]{\sum_{i=1}^{N}|{x_i}|^p}
$$
**矩阵的范数** **矩阵的范数**
定义一个矩阵$A=[-1, 2, -3; 4, -6, 6]$。 ​定义一个矩阵$A=[-1, 2, -3; 4, -6, 6]$。 任意矩阵定义为:$A_{m\times n}$,其元素为 $a_{ij}$。
矩阵的范数定义为
矩阵的范数定义为
$$ $$
\|A\|_p :=\sup_{x\neq 0}\frac{\|Ax\|_p}{\|x\|_p}. \Vert{A}\Vert_p :=\sup_{x\neq 0}\frac{\Vert{Ax}\Vert_p}{\Vert{x}\Vert_p}
$$ $$
当向量取不同范数时, 相应得到了不同的矩阵范数。 ​当向量取不同范数时, 相应得到了不同的矩阵范数。
- **矩阵的1范数列范数**:矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大),上述矩阵$A$的1范数先得到$[5,8,9]$再取最大的最终结果就是9。
$$
\Vert A\Vert_1=\max_{1\le j\le}\sum_{i=1}^m|{a_{ij}}|
$$
- **矩阵的2范数**:矩阵$A^TA$的最大特征值开平方根,上述矩阵$A$的2范数得到的最终结果是10.0623。
$$
\Vert A\Vert_2=\sqrt{\lambda_{max}(A^T A)}
$$
其中, $\lambda_{max}(A^T A)$ 为 $A^T A$ 的特征值绝对值的最大值。
- **矩阵的无穷范数(行范数)**:矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大),上述矩阵$A$的1范数先得到$[616]$再取最大的最终结果就是16。
$$
\Vert A\Vert_{\infty}=\max_{1\le i \le n}\sum_{j=1}^n |{a_{ij}}|
$$
- **矩阵的1范数**:矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大),上述矩阵$A$的1范数先得到$[5,8,9]$再取最大的最终结果就是9。
- **矩阵的2范数**:矩阵$A^TA$的最大特征值开平方根,上述矩阵$A$的2范数得到的最终结果是10.0623。
- **矩阵的无穷范数**:矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大),上述矩阵$A$的1范数先得到$[616]$再取最大的最终结果就是16。
- **矩阵的核范数**矩阵的奇异值将矩阵svd分解之和这个范数可以用来低秩表示因为最小化核范数相当于最小化矩阵的秩——低秩上述矩阵A最终结果就是10.9287。 - **矩阵的核范数**矩阵的奇异值将矩阵svd分解之和这个范数可以用来低秩表示因为最小化核范数相当于最小化矩阵的秩——低秩上述矩阵A最终结果就是10.9287。
- **矩阵的L0范数**矩阵的非0元素的个数通常用它来表示稀疏L0范数越小0元素越多也就越稀疏上述矩阵$A$最终结果就是6。 - **矩阵的L0范数**矩阵的非0元素的个数通常用它来表示稀疏L0范数越小0元素越多也就越稀疏上述矩阵$A$最终结果就是6。
- **矩阵的L1范数**矩阵中的每个元素绝对值之和它是L0范数的最优凸近似因此它也可以表示稀疏上述矩阵$A$最终结果就是22。 - **矩阵的L1范数**矩阵中的每个元素绝对值之和它是L0范数的最优凸近似因此它也可以表示稀疏上述矩阵$A$最终结果就是22。
- **矩阵的F范数**矩阵的各个元素平方之和再开平方根它通常也叫做矩阵的L2范数它的有点在它是一个凸函数可以求导求解易于计算上述矩阵A最终结果就是10.0995。 - **矩阵的F范数**矩阵的各个元素平方之和再开平方根它通常也叫做矩阵的L2范数它的有点在它是一个凸函数可以求导求解易于计算上述矩阵A最终结果就是10.0995。
- **矩阵的L21范数**矩阵先以每一列为单位求每一列的F范数也可认为是向量的2范数然后再将得到的结果求L1范数也可认为是向量的1范数很容易看出它是介于L1和L2之间的一种范数上述矩阵$A$最终结果就是17.1559。
$$
\Vert A\Vert_F=\sqrt{(\sum_{i=1}^m\sum_{j=1}^n{| a_{ij}|}^2)}
$$
- **矩阵的L21范数**矩阵先以每一列为单位求每一列的F范数也可认为是向量的2范数然后再将得到的结果求L1范数也可认为是向量的1范数很容易看出它是介于L1和L2之间的一种范数上述矩阵$A$最终结果就是17.1559。
- **矩阵的 p范数**
$$
\Vert A\Vert_p=\sqrt[p]{(\sum_{i=1}^m\sum_{j=1}^n{| a_{ij}|}^p)}
$$
## 1.5 如何判断一个矩阵为正定? ## 1.5 如何判断一个矩阵为正定?
- 顺序主子式全大于0 - 顺序主子式全大于0
@ -83,45 +135,58 @@ $$
## 1.6 导数偏导计算 ## 1.6 导数偏导计算
**导数定义**: **导数定义**:
导数代表了在自变量变化趋于无穷小的时候,函数值的变化与自变量的变化的比值。几何意义是这个点的切线。物理意义是该时刻的(瞬时)变化率。 ​导数代表了在自变量变化趋于无穷小的时候,函数值的变化与自变量的变化的比值。几何意义是这个点的切线。物理意义是该时刻的(瞬时)变化率。
*注意*:在一元函数中,只有一个自变量变动,也就是说只存在一个方向的变化率,这也就是为什么一元函数没有偏导数的原因。
在物理学中有平均速度和瞬时速度之说。平均速度有
*注意*:在一元函数中,只有一个自变量变动,也就是说只存在一个方向的变化率,这也就是为什么一元函数没有偏导数的原因。在物理学中有平均速度和瞬时速度之说。平均速度有
$$ $$
v=\frac{s}{t} v=\frac{s}{t}
$$ $$
其中$v$表示平均速度,$s$表示路程,$t$表示时间。这个公式可以改写为
​其中$v$表示平均速度,$s$表示路程,$t$表示时间。这个公式可以改写为
$$ $$
\bar{v}=\frac{\Delta s}{\Delta t}=\frac{s(t_0+\Delta t)-s(t_0)}{\Delta t} \bar{v}=\frac{\Delta s}{\Delta t}=\frac{s(t_0+\Delta t)-s(t_0)}{\Delta t}
$$ $$
其中$\Delta s$表示两点之间的距离,而$\Delta t$表示走过这段距离需要花费的时间。当$\Delta t$趋向于0$\Delta t \to 0$)时,也就是时间变得很短时,平均速度也就变成了在$t_0$时刻的瞬时速度,表示成如下形式:
​其中$\Delta s$表示两点之间的距离,而$\Delta t$表示走过这段距离需要花费的时间。当$\Delta t$趋向于0$\Delta t \to 0$)时,也就是时间变得很短时,平均速度也就变成了在$t_0$时刻的瞬时速度,表示成如下形式:
$$ $$
v(t_0)=\lim_{\Delta t \to 0}{\bar{v}}=\lim_{\Delta t \to 0}{\frac{\Delta s}{\Delta t}}=\lim_{\Delta t \to 0}{\frac{s(t_0+\Delta t)-s(t_0)}{\Delta t}} v(t_0)=\lim_{\Delta t \to 0}{\bar{v}}=\lim_{\Delta t \to 0}{\frac{\Delta s}{\Delta t}}=\lim_{\Delta t \to 0}{\frac{s(t_0+\Delta t)-s(t_0)}{\Delta t}}
$$ $$
实际上,上式表示的是路程$s$关于时间$t$的函数在$t=t_0$处的导数。一般的,这样定义导数:如果平均变化率的极限存在,即有
​实际上,上式表示的是路程$s$关于时间$t$的函数在$t=t_0$处的导数。一般的,这样定义导数:如果平均变化率的极限存在,即有
$$ $$
\lim_{\Delta x \to 0}{\frac{\Delta y}{\Delta x}}=\lim_{\Delta x \to 0}{\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}} \lim_{\Delta x \to 0}{\frac{\Delta y}{\Delta x}}=\lim_{\Delta x \to 0}{\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}}
$$ $$
则称此极限为函数$y=f(x)$在点$x_0$处的导数。记作$f'(x_0)$或$y'|_{x=x_0}$或$\frac{dy}{dx}|_{x=x_0}$或$\frac{df(x)}{dx}|_{x=x_0}$。
通俗地说,导数就是曲线在某一点切线的斜率。 ​则称此极限为函数 $y=f(x)$ 在点 $x_0$ 处的导数。记作 $f'(x_0)$ 或 $y'\vert_{x=x_0}$ 或 $\frac{dy}{dx}\vert_{x=x_0}$ 或 $\frac{df(x)}{dx}\vert_{x=x_0}$。
​通俗地说,导数就是曲线在某一点切线的斜率。
**偏导数**: **偏导数**:
既然谈到偏导数那就至少涉及到两个自变量。以两个自变量为例z=fx,y从导数到偏导数也就是从曲线来到了曲面。曲线上的一点其切线只有一条。但是曲面上的一点切线有无数条。而偏导数就是指多元函数沿着坐标轴的变化率。 既然谈到偏导数那就至少涉及到两个自变量。以两个自变量为例z=fx,y从导数到偏导数也就是从曲线来到了曲面。曲线上的一点其切线只有一条。但是曲面上的一点切线有无数条。而偏导数就是指多元函数沿着坐标轴的变化率。
注意:直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。
*注意*:直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。
​设函数$z=f(x,y)$在点$(x_0,y_0)$的领域内有定义,当$y=y_0$时,$z$可以看作关于$x$的一元函数$f(x,y_0)$,若该一元函数在$x=x_0$处可导,即有
设函数$z=f(x,y)$在点$(x_0,y_0)$的领域内有定义,当$y=y_0$时,$z$可以看作关于$x$的一元函数$f(x,y_0)$,若该一元函数在$x=x_0$处可导,即有
$$ $$
\lim_{\Delta x \to 0}{\frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x}}=A \lim_{\Delta x \to 0}{\frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x}}=A
$$ $$
函数的极限$A$存在。那么称$A$为函数$z=f(x,y)$在点$(x_0,y_0)$处关于自变量$x$的偏导数,记作$f_x(x_0,y_0)$或$\frac{\eth z}{\eth x}|_{y=y_0}^{x=x_0}$或$\frac{\eth f}{\eth x}|_{y=y_0}^{x=x_0}$或$z_x|_{y=y_0}^{x=x_0}$。
偏导数在求解时可以将另外一个变量看做常数,利用普通的求导方式求解,比如$z=3x^2+xy$关于$x$的偏导数就为$z_x=6x+y$,这个时候$y$相当于$x$的系数 函数的极限$A$存在。那么称$A$为函数$z=f(x,y)$在点$(x_0,y_0)$处关于自变量$x$的偏导数,记作$f_x(x_0,y_0)$或$\frac{\partial z}{\partial x}\vert_{y=y_0}^{x=x_0}$或$\frac{\partial f}{\partial x}\vert_{y=y_0}^{x=x_0}$或$z_x\vert_{y=y_0}^{x=x_0}$
某点$(x_0,y_0)$处的偏导数的几何意义为曲面$z=f(x,y)$与面$x=x_0$或面$y=y_0$交线在$y=y_0$或$x=x_0$处切线的斜率。 ​偏导数在求解时可以将另外一个变量看做常数,利用普通的求导方式求解,比如$z=3x^2+xy$关于$x$的偏导数就为$z_x=6x+y$,这个时候$y$相当于$x$的系数。
​某点$(x_0,y_0)$处的偏导数的几何意义为曲面$z=f(x,y)$与面$x=x_0$或面$y=y_0$交线在$y=y_0$或$x=x_0$处切线的斜率。
## 1.7 导数和偏导数有什么区别? ## 1.7 导数和偏导数有什么区别?
导数和偏导没有本质区别如果极限存在都是当自变量的变化量趋于0时函数值的变化量与自变量变化量比值的极限。 导数和偏导没有本质区别如果极限存在都是当自变量的变化量趋于0时函数值的变化量与自变量变化量比值的极限。
> - 一元函数,一个$y$对应一个$x$,导数只有一个。 > - 一元函数,一个$y$对应一个$x$,导数只有一个。
> - 二元函数,一个$z$对应一个$x$和一个$y$,有两个导数:一个是$z$对$x$的导数,一个是$z$对$y$的导数,称之为偏导。 > - 二元函数,一个$z$对应一个$x$和一个$y$,有两个导数:一个是$z$对$x$的导数,一个是$z$对$y$的导数,称之为偏导。
@ -133,58 +198,62 @@ $$
- 特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。 - 特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。
如果说一个向量$\vec{v}$是方阵$A$的特征向量,将一定可以表示成下面的形式: 如果说一个向量$\vec{v}$是方阵$A$的特征向量,将一定可以表示成下面的形式:
$$ $$
A\nu = \lambda \nu A\nu = \lambda \nu
$$ $$
$\lambda$为特征向量$\vec{v}$对应的特征值。特征值分解是将一个矩阵分解为如下形式: $\lambda$为特征向量$\vec{v}$对应的特征值。特征值分解是将一个矩阵分解为如下形式:
$$ $$
A=Q\sum Q^{-1} A=Q\sum Q^{-1}
$$ $$
其中,$Q$是这个矩阵$A$的特征向量组成的矩阵,$\sum$是一个对角矩阵,每一个对角线元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。也就是说矩阵$A$的信息可以由其特征值和特征向量表示。 其中,$Q$是这个矩阵$A$的特征向量组成的矩阵,$\sum$是一个对角矩阵,每一个对角线元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。也就是说矩阵$A$的信息可以由其特征值和特征向量表示。
## 1.9 奇异值与特征值有什么关系? ## 1.9 奇异值与特征值有什么关系?
那么奇异值和特征值是怎么对应起来的呢?我们将一个矩阵$A$的转置乘以$A$,并对$AA^T$求特征值,则有下面的形式: ​那么奇异值和特征值是怎么对应起来的呢?我们将一个矩阵$A$的转置乘以$A$,并对$AA^T$求特征值,则有下面的形式:
$$ $$
(A^TA)V = \lambda V (A^TA)V = \lambda V
$$ $$
这里$V$就是上面的右奇异向量,另外还有: 这里$V$就是上面的右奇异向量,另外还有:
$$ $$
\sigma_i = \sqrt{\lambda_i}, u_i=\frac{1}{\sigma_i}A\mu_i \sigma_i = \sqrt{\lambda_i}, u_i=\frac{1}{\sigma_i}A\mu_i
$$ $$
这里的$\sigma$就是奇异值,$u$就是上面说的左奇异向量。【证明那个哥们也没给】 这里的$\sigma$就是奇异值,$u$就是上面说的左奇异向量。【证明那个哥们也没给】
奇异值$\sigma$跟特征值类似,在矩阵$\sum$中也是从大到小排列,而且$\sigma$的减少特别的快在很多情况下前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前$r$$r$远小于$m、n$)个的奇异值来近似描述矩阵,即部分奇异值分解: ​奇异值$\sigma$跟特征值类似,在矩阵$\sum$中也是从大到小排列,而且$\sigma$的减少特别的快在很多情况下前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前$r$$r$远小于$m、n$)个的奇异值来近似描述矩阵,即部分奇异值分解:
$$ $$
A_{m\times n}\thickapprox U_{m \times r}\sum_{r\times r}V_{r \times n}^T A_{m\times n}\approx U_{m \times r}\sum_{r\times r}V_{r \times n}^T
$$ $$
右边的三个矩阵相乘的结果将会是一个接近于$A$的矩阵,在这儿,$r$越接近于$n$,则相乘的结果越接近于$A$。 右边的三个矩阵相乘的结果将会是一个接近于$A$的矩阵,在这儿,$r$越接近于$n$,则相乘的结果越接近于$A$。
## 1.10 机器学习为什么要使用概率? ## 1.10 机器学习为什么要使用概率?
事件的概率是衡量该事件发生的可能性的量度。虽然在一次随机试验中某个事件的发生是带有偶然性的,但那些可在相同条件下大量重复的随机试验却往往呈现出明显的数量规律。 ​事件的概率是衡量该事件发生的可能性的量度。虽然在一次随机试验中某个事件的发生是带有偶然性的,但那些可在相同条件下大量重复的随机试验却往往呈现出明显的数量规律。
机器学习除了处理不确定量,也需处理随机量。不确定性和随机性可能来自多个方面,使用概率论来量化不确定性。 ​机器学习除了处理不确定量,也需处理随机量。不确定性和随机性可能来自多个方面,使用概率论来量化不确定性。
概率论在机器学习中扮演着一个核心角色,因为机器学习算法的设计通常依赖于对数据的概率假设。 ​概率论在机器学习中扮演着一个核心角色,因为机器学习算法的设计通常依赖于对数据的概率假设。
> 例如在机器学习Andrew Ng的课中会有一个朴素贝叶斯假设就是条件独立的一个例子。该学习算法对内容做出假设用来分辨电子邮件是否为垃圾邮件。假设无论邮件是否为垃圾邮件单词x出现在邮件中的概率条件独立于单词y。很明显这个假设不是不失一般性的因为某些单词几乎总是同时出现。然而最终结果是这个简单的假设对结果的影响并不大且无论如何都可以让我们快速判别垃圾邮件。 > 例如在机器学习Andrew Ng的课中会有一个朴素贝叶斯假设就是条件独立的一个例子。该学习算法对内容做出假设用来分辨电子邮件是否为垃圾邮件。假设无论邮件是否为垃圾邮件单词x出现在邮件中的概率条件独立于单词y。很明显这个假设不是不失一般性的因为某些单词几乎总是同时出现。然而最终结果是这个简单的假设对结果的影响并不大且无论如何都可以让我们快速判别垃圾邮件。
## 1.11 变量与随机变量有什么区别? ## 1.11 变量与随机变量有什么区别?
**随机变量**random variable **随机变量**random variable
表示随机现象(在一定条件下,并不总是出现相同结果的现象称为随机现象)中各种结果的实值函数(一切可能的样本点)。例如某一时间内公共汽车站等车乘客人数,电话交换台在一定时间内收到的呼叫次数等,都是随机变量的实例。 ​表示随机现象(在一定条件下,并不总是出现相同结果的现象称为随机现象)中各种结果的实值函数(一切可能的样本点)。例如某一时间内公共汽车站等车乘客人数,电话交换台在一定时间内收到的呼叫次数等,都是随机变量的实例。
随机变量与模糊变量的不确定性的本质差别在于,后者的测定结果仍具有不确定性,即模糊性。 ​随机变量与模糊变量的不确定性的本质差别在于,后者的测定结果仍具有不确定性,即模糊性。
**变量与随机变量的区别:** **变量与随机变量的区别:**
当变量的取值的概率不是1时,变量就变成了随机变量当随机变量取值的概率为1时,随机变量就变成了变量。 当变量的取值的概率不是1时,变量就变成了随机变量当随机变量取值的概率为1时,随机变量就变成了变量。
> 比如: > 比如:
> 当变量$x$值为100的概率为1的话,那么$x=100$就是确定了的,不会再有变化,除非有进一步运算. > 当变量$x$值为100的概率为1的话,那么$x=100$就是确定了的,不会再有变化,除非有进一步运算.
> 当变量$x$的值为100的概率不为1,比如为50的概率是0.5,为100的概率是0.5,那么这个变量就是会随不同条件而变化的,是随机变量,取到50或者100的概率都是0.5,即50%。 > 当变量$x$的值为100的概率不为1,比如为50的概率是0.5,为100的概率是0.5,那么这个变量就是会随不同条件而变化的,是随机变量,取到50或者100的概率都是0.5,即50%。
## 1.12 常见概率分布 ## 1.12 常见概率分布
(https://wenku.baidu.com/view/6418b0206d85ec3a87c24028915f804d2b168707) (https://wenku.baidu.com/view/6418b0206d85ec3a87c24028915f804d2b168707)
![常见概率分布](./img/ch1/prob_distribution_1.png) ![常见概率分布](./img/ch1/prob_distribution_1.png)
![常见概率分布](./img/ch1/prob_distribution_2.png) ![常见概率分布](./img/ch1/prob_distribution_2.png)
@ -195,63 +264,72 @@ $$
![常见概率分布](./img/ch1/prob_distribution_7.png) ![常见概率分布](./img/ch1/prob_distribution_7.png)
## 1.13 举例理解条件概率 ## 1.13 举例理解条件概率
条件概率公式如下: ​条件概率公式如下:
$$ $$
P(A/B) = P(A\cap B) / P(B) P(A/B) = P(A\cap B) / P(B)
$$ $$
说明:在同一个样本空间$\Omega$中的事件或者子集$A$与$B$,如果随机从$\Omega$中选出的一个元素属于$B$,那么下一个随机选择的元素属于$A$ 的概率就定义为在$B$的前提下$A$的条件概率。 ​说明:在同一个样本空间$\Omega$中的事件或者子集$A$与$B$,如果随机从$\Omega$中选出的一个元素属于$B$,那么下一个随机选择的元素属于$A$ 的概率就定义为在$B$的前提下$A$的条件概率。
![条件概率](./img/ch1/conditional_probability.jpg) ![条件概率](./img/ch1/conditional_probability.jpg)
根据文氏图可以很清楚地看到在事件B发生的情况下事件A发生的概率就是$P(A\bigcap B)$除以$P(B)$。 根据文氏图可以很清楚地看到在事件B发生的情况下事件A发生的概率就是$P(A\bigcap B)$除以$P(B)$。
举例:一对夫妻有两个小孩,已知其中一个是女孩,则另一个是女孩子的概率是多少?(面试、笔试都碰到过) ​举例:一对夫妻有两个小孩,已知其中一个是女孩,则另一个是女孩子的概率是多少?(面试、笔试都碰到过)
**穷举法**已知其中一个是女孩那么样本空间为男女女女女男则另外一个仍然是女生的概率就是1/3。 **穷举法**已知其中一个是女孩那么样本空间为男女女女女男则另外一个仍然是女生的概率就是1/3。
**条件概率法**$P(女|女)=P(女女)/P(女)$,夫妻有两个小孩,那么它的样本空间为女女,男女,女男,男男,则$P(女女)$为1/4$P= 1-P(男男)=3/4$,所以最后$1/3$。 **条件概率法**$P(女|女)=P(女女)/P(女)$,夫妻有两个小孩,那么它的样本空间为女女,男女,女男,男男,则$P(女女)$为1/4$P= 1-P(男男)=3/4$,所以最后$1/3$。
这里大家可能会误解,男女和女男是同一种情况,但实际上类似姐弟和兄妹是不同情况。 这里大家可能会误解,男女和女男是同一种情况,但实际上类似姐弟和兄妹是不同情况。
## 1.14 联合概率与边缘概率联系区别? ## 1.14 联合概率与边缘概率联系区别?
**区别:** **区别:**
联合概率:联合概率指类似于$P(X=a,Y=b)$这样,包含多个条件,且所有条件同时成立的概率。联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。 ​联合概率:联合概率指类似于$P(X=a,Y=b)$这样,包含多个条件,且所有条件同时成立的概率。联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。
边缘概率:边缘概率是某个事件发生的概率,而与其它事件无关。边缘概率指类似于$P(X=a)$$P(Y=b)$这样,仅与单个随机变量有关的概率。 ​边缘概率:边缘概率是某个事件发生的概率,而与其它事件无关。边缘概率指类似于$P(X=a)$$P(Y=b)$这样,仅与单个随机变量有关的概率。
**联系:** **联系:**
联合分布可求边缘分布,但若只知道边缘分布,无法求得联合分布。 ​联合分布可求边缘分布,但若只知道边缘分布,无法求得联合分布。
## 1.15 条件概率的链式法则 ## 1.15 条件概率的链式法则
由条件概率的定义,可直接得出下面的乘法公式: ​由条件概率的定义,可直接得出下面的乘法公式:
乘法公式 设$A, B$是两个事件,并且$P(A) > 0$, 则有 ​乘法公式 设$A, B$是两个事件,并且$P(A) > 0$, 则有
$$ $$
P(AB) = P(B|A)P(A) P(AB) = P(B|A)P(A)
$$ $$
推广 ​推广
$$ $$
P(ABC)=P(C|AB)P(B)P(B|A)P(A) P(ABC)=P(C|AB)P(B|A)P(A)
$$ $$
一般地,用归纳法可证:若$P(A_1A_2...A_n)>0$,则有 ​一般地,用归纳法可证:若$P(A_1A_2...A_n)>0$,则有
$$ $$
P(A_1A_2...A_n)=P(A_n|A_1A_2...A_{n-1}P(A_{n-1}|A_1A_2...A_{n-2})...P(A_2|A_1)P(A_1) P(A_1A_2...A_n)=P(A_n|A_1A_2...A_{n-1})P(A_{n-1}|A_1A_2...A_{n-2})...P(A_2|A_1)P(A_1)
=P(A_1)\prod_{i=2}^{n}P(A_i|A_1A_2...A_{i-1})
$$ $$
任何多维随机变量联合概率分布,都可以分解成只有一个变量的条件概率相乘形式。 ​任何多维随机变量联合概率分布,都可以分解成只有一个变量的条件概率相乘形式。
## 1.16 独立性和条件独立性 ## 1.16 独立性和条件独立性
**独立性** **独立性**
两个随机变量$x$和$y$,概率分布表示成两个因子乘积形式,一个因子只包含$x$,另一个因子只包含$y$,两个随机变量相互独立(independent)。 ​两个随机变量$x$和$y$,概率分布表示成两个因子乘积形式,一个因子只包含$x$,另一个因子只包含$y$,两个随机变量相互独立(independent)。
条件有时为不独立的事件之间带来独立,有时也会把本来独立的事件,因为此条件的存在,而失去独立性。 ​条件有时为不独立的事件之间带来独立,有时也会把本来独立的事件,因为此条件的存在,而失去独立性。
举例:$P(XY)=P(X)P(Y)$, 事件$X$和事件$Y$独立。此时给定$Z$ ​举例:$P(XY)=P(X)P(Y)$, 事件$X$和事件$Y$独立。此时给定$Z$
$$ $$
P(X,Y|Z) \not = P(X|Z)P(Y|Z) P(X,Y|Z) \not = P(X|Z)P(Y|Z)
$$ $$
事件独立时,联合概率等于概率的乘积。这是一个非常好的数学性质,然而不幸的是,无条件的独立是十分稀少的,因为大部分情况下,事件之间都是互相影响的。
​事件独立时,联合概率等于概率的乘积。这是一个非常好的数学性质,然而不幸的是,无条件的独立是十分稀少的,因为大部分情况下,事件之间都是互相影响的。
**条件独立性** **条件独立性**
给定$Z$的情况下,$X$和$Y$条件独立,当且仅当 ​给定$Z$的情况下,$X$和$Y$条件独立,当且仅当
$$ $$
X\bot Y|Z \iff P(X,Y|Z) = P(X|Z)P(Y|Z) X\bot Y|Z \iff P(X,Y|Z) = P(X|Z)P(Y|Z)
$$ $$
$X$和$Y$的关系依赖于$Z$,而不是直接产生。
$X$和$Y$的关系依赖于$Z$,而不是直接产生。
>**举例**定义如下事件: >**举例**定义如下事件:
>$X$:明天下雨; >$X$:明天下雨;
@ -261,14 +339,12 @@ $$
## 1.17 期望、方差、协方差、相关系数总结 ## 1.17 期望、方差、协方差、相关系数总结
**期望** **期望**
在概率论和统计学中,数学期望(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和。它反映随机变量平均取值的大小。 ​在概率论和统计学中,数学期望(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和。它反映随机变量平均取值的大小。
线性运算: $E(ax+by+c) = aE(x)+bE(y)+c$ - 线性运算: $E(ax+by+c) = aE(x)+bE(y)+c$
推广形式: $E(\sum_{k=1}^{n}{a_ix_i+c}) = \sum_{k=1}^{n}{a_iE(x_i)x_i+c}$ - ​推广形式: $E(\sum_{k=1}^{n}{a_ix_i+c}) = \sum_{k=1}^{n}{a_iE(x_i)+c}$
函数期望:设$f(x)$为$x$的函数,则$f(x)$的期望为 - 函数期望:设$f(x)$为$x$的函数,则$f(x)$的期望为
- 离散函数: $E(f(x))=\sum_{k=1}^{n}{f(x_k)P(x_k)}$
离散函数: $E(f(x))=\sum_{k=1}^{n}{f(x_k)P(x_k)}$ - 连续函数: $E(f(x))=\int_{-\infty}^{+\infty}{f(x)p(x)dx}$
连续函数: $E(f(x))=\int_{-\infty}^{+\infty}{f(x)p(x)dx}$
> 注意: > 注意:
> >
@ -278,8 +354,8 @@ $$
**方差** **方差**
概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。 ​概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。方差是一种特殊的期望。定义为:
方差是一种特殊的期望。定义为:
$$ $$
Var(x) = E((x-E(x))^2) Var(x) = E((x-E(x))^2)
$$ $$
@ -292,24 +368,37 @@ $$
> 4如果$X$和$Y$相互独立, $Var(ax+by)=a^2Var(x)+b^2Var(y)$ > 4如果$X$和$Y$相互独立, $Var(ax+by)=a^2Var(x)+b^2Var(y)$
**协方差** **协方差**
协方差是衡量两个变量线性相关性强度及变量尺度。 ​协方差是衡量两个变量线性相关性强度及变量尺度。 两个随机变量的协方差定义为:
两个随机变量的协方差定义为:
$$ $$
Cov(x,y)=E((x-E(x))(y-E(y))) Cov(x,y)=E((x-E(x))(y-E(y)))
$$ $$
方差是一种特殊的协方差。当$X=Y$时,$Cov(x,y)=Var(x)=Var(y)$。
​方差是一种特殊的协方差。当$X=Y$时,$Cov(x,y)=Var(x)=Var(y)$。
> 协方差性质: > 协方差性质:
> >
> 1独立变量的协方差为0。 > 1独立变量的协方差为0。
> 2协方差计算公式$$ Cov(\sum_{i=1}^{m}{a_ix_i}, \sum_{j=1}^{m}{b_jy_j}) = \sum_{i=1}^{m} \sum_{j=1}^{m}{a_ib_jCov(x_iy_i)} $$ > 2协方差计算公式
$$
Cov(\sum_{i=1}^{m}{a_ix_i}, \sum_{j=1}^{m}{b_jy_j}) = \sum_{i=1}^{m} \sum_{j=1}^{m}{a_ib_jCov(x_iy_i)}
$$
> >
> 3特殊情况$$ Cov(a+bx, c+dy) = bdCov(x, y) $$ > 3特殊情况
$$
Cov(a+bx, c+dy) = bdCov(x, y)
$$
**相关系数** **相关系数**
相关系数是研究变量之间线性相关程度的量。 ​相关系数是研究变量之间线性相关程度的量。两个随机变量的相关系数定义为:
两个随机变量的相关系数定义为:$$ Corr(x,y) = \frac{Cov(x,y)}{\sqrt{Var(x)Var(y)}} $$
$$
Corr(x,y) = \frac{Cov(x,y)}{\sqrt{Var(x)Var(y)}}
$$
> 相关系数的性质: > 相关系数的性质:
> 1有界性。相关系数的取值范围是 ,可以看成无量纲的协方差。 > 1有界性。相关系数的取值范围是 ,可以看成无量纲的协方差。
> 2值越接近1说明两个变量正相关性线性越强。越接近-1说明负相关性越强当为0时表示两个变量没有相关性。 > 2值越接近1说明两个变量正相关性线性越强。越接近-1说明负相关性越强当为0时表示两个变量没有相关性。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 KiB

After

Width:  |  Height:  |  Size: 671 KiB

View File

@ -11,4 +11,6 @@ xxx-xxx
**贡献者(排名不分先后):** **贡献者(排名不分先后):**
内容贡献者可自加信息 内容贡献者可自加信息
刘彦超-东南大学
########################################################### ###########################################################

File diff suppressed because it is too large Load Diff

View File

@ -151,7 +151,7 @@ sigmoid 激活函数图像如下图所示:
深度学习是机器学习的一种,现在深度学习比较火爆。在传统机器学习中,手工设计特征对学习效果很重要,但是特征工程非常繁琐。而深度学习能够从大数据中自动学习特征,这也是深度学习在大数据时代受欢迎的一大原因。 深度学习是机器学习的一种,现在深度学习比较火爆。在传统机器学习中,手工设计特征对学习效果很重要,但是特征工程非常繁琐。而深度学习能够从大数据中自动学习特征,这也是深度学习在大数据时代受欢迎的一大原因。
![](.img/ch3/3-10.jpg) ![](./img/ch3/3-10.jpg)
![](./img/ch3/3-11.jpg) ![](./img/ch3/3-11.jpg)
@ -179,8 +179,6 @@ sigmoid 激活函数图像如下图所示:
设最终中误差为 $ E $,对于输出那么 $ E $ 对于输出节点 $ y_l $ 的偏导数是 $ y_l - t_l $,其中 $ t_l $ 是真实值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函数,$ z_l $ 是上面提到的加权和,那么这一层的 $ E $ 对于 $ z_l $ 的偏导数为 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一层也是这么计算,只不过 $ \frac{\partial E}{\partial y_k} $ 计算方法变了,一直反向传播到输入层,最后有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j $。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果; 设最终中误差为 $ E $,对于输出那么 $ E $ 对于输出节点 $ y_l $ 的偏导数是 $ y_l - t_l $,其中 $ t_l $ 是真实值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函数,$ z_l $ 是上面提到的加权和,那么这一层的 $ E $ 对于 $ z_l $ 的偏导数为 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一层也是这么计算,只不过 $ \frac{\partial E}{\partial y_k} $ 计算方法变了,一直反向传播到输入层,最后有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j $。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果;
### 3.2.2如何计算神经网络的输出? ### 3.2.2如何计算神经网络的输出?
答案来源:[零基础入门深度学习(3) - 神经网络和反向传播算法](https://www.zybuluo.com/hanbingtao/note/476663) 答案来源:[零基础入门深度学习(3) - 神经网络和反向传播算法](https://www.zybuluo.com/hanbingtao/note/476663)
@ -209,8 +207,6 @@ $$
同理,我们还可以计算出 $ y_2 $。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 $ x_1, x_2, x_3, x_4 $ 时,神经网络的输出向量 $ y_1, y_2 $ 。这里我们也看到,输出向量的维度和输出层神经元个数相同。 同理,我们还可以计算出 $ y_2 $。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 $ x_1, x_2, x_3, x_4 $ 时,神经网络的输出向量 $ y_1, y_2 $ 。这里我们也看到,输出向量的维度和输出层神经元个数相同。
### 3.2.3如何计算卷积神经网络输出值? ### 3.2.3如何计算卷积神经网络输出值?
答案来源:[零基础入门深度学习(4) - 卷积神经网络](https://www.zybuluo.com/hanbingtao/note/485480) 答案来源:[零基础入门深度学习(4) - 卷积神经网络](https://www.zybuluo.com/hanbingtao/note/485480)
@ -293,7 +289,6 @@ $$
以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且 filter 的权值对于上一层所有神经元都是一样的。对于包含两个 $ 3 * 3 * 3 $ 的 fitler 的卷积层来说,其参数数量仅有 $ (3 * 3 * 3+1) * 2 = 56 $ 个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。 以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且 filter 的权值对于上一层所有神经元都是一样的。对于包含两个 $ 3 * 3 * 3 $ 的 fitler 的卷积层来说,其参数数量仅有 $ (3 * 3 * 3+1) * 2 = 56 $ 个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。
### 3.2.4 如何计算 Pooling 层输出值输出值? ### 3.2.4 如何计算 Pooling 层输出值输出值?
Pooling 层主要的作用是下采样,通过去掉 Feature Map 中不重要的样本进一步减少参数数量。Pooling 的方法很多,最常用的是 Max Pooling。Max Pooling 实际上就是在 n\*n 的样本中取最大值,作为采样后的样本值。下图是 2\*2 max pooling Pooling 层主要的作用是下采样,通过去掉 Feature Map 中不重要的样本进一步减少参数数量。Pooling 的方法很多,最常用的是 Max Pooling。Max Pooling 实际上就是在 n\*n 的样本中取最大值,作为采样后的样本值。下图是 2\*2 max pooling
@ -624,9 +619,9 @@ $\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)$
### 3.4.11 为什么Tanh收敛速度比Sigmoid快贡献者黄钦建华南理工大学 ### 3.4.11 为什么Tanh收敛速度比Sigmoid快贡献者黄钦建华南理工大学
`$tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)$` $tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)$
`$s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]$` $s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]$
由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻所以Tanh收敛速度比Sigmoid快。 由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻所以Tanh收敛速度比Sigmoid快。
@ -634,14 +629,14 @@ $\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)$
### 3.5.1 为什么需要 Batch_Size ### 3.5.1 为什么需要 Batch_Size
Batch 的选择,首先决定的是下降的方向。 Batch的选择首先决定的是下降的方向。
如果数据集比较小,可采用全数据集的形式,好处是: 如果数据集比较小,可采用全数据集的形式,好处是:
1. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。 1. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
2. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。 2. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。
对于更大的数据集,采用全数据集的形式,坏处是: 对于更大的数据集,假如采用全数据集的形式,坏处是:
1. 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。 1. 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2. 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。 2. 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。
@ -649,11 +644,11 @@ Batch 的选择,首先决定的是下降的方向。
假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面横截面是椭圆。对于多层神经元、非线性网络在局部依然近似是抛物面。此时每次修正方向以各自样本的梯度方向修正横冲直撞各自为政难以达到收敛。 假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面横截面是椭圆。对于多层神经元、非线性网络在局部依然近似是抛物面。此时每次修正方向以各自样本的梯度方向修正横冲直撞各自为政难以达到收敛。
既然 Batch_Size 为全数据集或者Batch_Size = 1 都有各自缺点可不可以选择一个适中的Batch_Size值呢 既然 Batch_Size 为全数据集或者Batch_Size = 1都有各自缺点可不可以选择一个适中的Batch_Size值呢
此时可采用批梯度下降法Mini-batches Learning。因为如果数据集足够充分那么用一半甚至少得多的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。 此时可采用批梯度下降法Mini-batches Learning。因为如果数据集足够充分那么用一半甚至少得多的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
### 3.5.3 在合理范围内,增大 Batch_Size 有何好处? ### 3.5.3 在合理范围内增大Batch_Size有何好处
1. 内存利用率提高了,大矩阵乘法的并行化效率提高。 1. 内存利用率提高了,大矩阵乘法的并行化效率提高。
2. 跑完一次 epoch全数据集所需的迭代次数减少对于相同数据量的处理速度进一步加快。 2. 跑完一次 epoch全数据集所需的迭代次数减少对于相同数据量的处理速度进一步加快。
@ -667,12 +662,16 @@ Batch 的选择,首先决定的是下降的方向。
### 3.5.5 调节 Batch_Size 对训练效果影响到底如何? ### 3.5.5 调节 Batch_Size 对训练效果影响到底如何?
1. Batch_Size 太小,可能导致算法不收敛 1. Batch_Size 太小,模型表现效果极其糟糕(error飙升)
2. 随着 Batch_Size 增大,处理相同数据量的速度越快。 2. 随着 Batch_Size 增大,处理相同数据量的速度越快。
3. 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。 3. 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
4. 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。 4. 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
5. 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。 5. 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
### 3.5.6 受限于客观条件无法给足够的Batch Size怎么办
在极小的情况下(低于十),建议使用[Group Norm](https://arxiv.org/abs/1803.08494)。
## 3.6 归一化 ## 3.6 归一化
### 3.6.1 归一化含义? ### 3.6.1 归一化含义?

View File

@ -1,7 +1,7 @@
[TOC] [TOC]
# 第四章 经典网络 # 第四章 经典网络
## 4.1 LetNet5 ## 4.1 LeNet5
一种典型的用来识别数字的卷积网络是LeNet-5。 一种典型的用来识别数字的卷积网络是LeNet-5。
### 4.1.1 模型结构 ### 4.1.1 模型结构
@ -291,7 +291,7 @@ AlexNet共8层前五层为卷积层后三层为全连接层。
![](./img/ch4/image19.jpeg) ![](./img/ch4/image19.jpeg)
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
**特征不变性:** 一般来说,小的变化对于模型的第一层都有非常大的影响,但对于最高层的影响却几乎没有。对于图像的平移、尺度、旋转的变化来说,网络的输出对于平移和尺度变化都是稳定的,但却不具有旋转不变性,除非目标图像时旋转对称的。下图为分别对平移,尺度,旋转做的分析图。 **特征不变性:** 一般来说,就深度模型来说,只要深度超过七层,微小的变化对于模型的第一层都有比较大的影响,但对于较深层几乎没有没有影响。对于图像的平移、尺度、旋转的变化来说,网络的输出对于平移和尺度变化都是稳定的,但却不具有旋转不变性,除非目标图像时旋转对称的。下图为分别对平移,尺度,旋转做的分析图。
![](./img/ch4/image20.jpeg) ![](./img/ch4/image20.jpeg)
@ -309,7 +309,6 @@ AlexNet共8层前五层为卷积层后三层为全连接层。
![](./img/ch4/image2.jpeg) ![](./img/ch4/image2.jpeg)
![](./img/ch4/image21.jpeg) ![](./img/ch4/image21.jpeg)
## 4.4 VGGNet ## 4.4 VGGNet
### 4.4.1 模型结构 ### 4.4.1 模型结构
@ -320,13 +319,9 @@ AlexNet共8层前五层为卷积层后三层为全连接层。
1. 整个网络都使用了同样大小的卷积核尺寸3 \* 3和最大池化尺寸2 \* 2 1. 整个网络都使用了同样大小的卷积核尺寸3 \* 3和最大池化尺寸2 \* 2
2. 1 \* 1卷积的意义主要在于线性变换而输入通道数和输出通道数不变没有发生降维。 2. 1 \* 1卷积的意义主要在于线性变换而输入通道数和输出通道数不变没有发生降维。
3. 两个3 \* 3的卷积层串联相当于1个5 \* 5的卷积层即一个像素会跟周围5 \* 5的像素产生关联可以说感受野大小为5 \* 5。而3个3 \* 3的卷积层串联的效果则相当于1个7 \* 7的卷积层。除此之外3个串联的3 \* 3的卷积层拥有比1个7 \* 7的卷积层更少的参数量只有后者的(3 \* 3 \* 3)/(7 \* 7)=55%。最重要的是3个3 \* 3的卷积层拥有比1个7 \* 7的卷积层更多的非线性变换前者可以使用三次ReLU激活函数而后者只有一次使得CNN对特征的学习能力更强。
4. VGGNet在训练时有一个小技巧先训练级别A的简单网络再复用A网络的权重来初始化后面的几个复杂模型这样训练收敛的速度更快。在预测时VGG采用Multi-Scale的方法将图像scale到一个尺寸Q并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测将不同窗口的分类结果平均再将不同尺寸Q的结果平均得到最后结果这样可提高图片数据的利用率并提升预测准确率。在训练中VGGNet还使用了Multi-Scale的方法做数据增强将原始图像缩放到不同尺寸S然后再随机裁切224*224的图片这样能增加很多数据量对于防止模型过拟合有很不错的效果。
1. 两个3 \* 3的卷积层串联相当于1个5 \* 5的卷积层即一个像素会跟周围5 \* 5的像素产生关联可以说感受野大小为5 \* 5。而3个3 \* 3的卷积层串联的效果则相当于1个7 \* 7的卷积层。除此之外3个串联的3 \* 3的卷积层拥有比1个7 \* 7的卷积层更少的参数量只有后者的(3 \* 3 \* 3)/(7 \* 7)=55%。最重要的是3个3 \* 3的卷积层拥有比1个7 \* 7的卷积层更多的非线性变换前者可以使用三次ReLU激活函数而后者只有一次使得CNN对特征的学习能力更强。
2. VGGNet在训练时有一个小技巧先训练级别A的简单网络再复用A网络的权重来初始化后面的几个复杂模型这样训练收敛的速度更快。在预测时VGG采用Multi-Scale的方法将图像scale到一个尺寸Q并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测将不同窗口的分类结果平均再将不同尺寸Q的结果平均得到最后结果这样可提高图片数据的利用率并提升预测准确率。在训练中VGGNet还使用了Multi-Scale的方法做数据增强将原始图像缩放到不同尺寸S然后再随机裁切224*224的图片这样能增加很多数据量对于防止模型过拟合有很不错的效果。
## 4.5 Network in Network ## 4.5 Network in Network
### 4.5.1 模型结构 ### 4.5.1 模型结构
@ -339,7 +334,6 @@ AlexNet共8层前五层为卷积层后三层为全连接层。
论文的创新点: 论文的创新点:
1. 提出了抽象能力更高的Mlpconv层 1. 提出了抽象能力更高的Mlpconv层
2. 提出了Global Average Pooling全局平均池化 2. 提出了Global Average Pooling全局平均池化
- Mlpconv层 <br> - Mlpconv层 <br>
@ -377,11 +371,9 @@ MLP的优点
## 4.6 GoogleNet ## 4.6 GoogleNet
### 4.6.1 模型结构 ### 4.6.1 模型结构
![](./img/ch4/image25.jpeg) ![](./img/ch4/image25.jpeg)
![](./img/ch4/image26.png) ![](./img/ch4/image26.png)
### 4.6.2 Inception 结构 ### 4.6.2 Inception 结构
![](./img/ch4/image27.jpeg) ![](./img/ch4/image27.jpeg)
@ -449,7 +441,6 @@ MLP的优点
<img src="./img/ch4/image37.png"/> <img src="./img/ch4/image37.png"/>
</center> </center>
- 在梯度为8x8时使用可以增加滤波器输出的模块如下图以此来产生高维的稀疏特征。 - 在梯度为8x8时使用可以增加滤波器输出的模块如下图以此来产生高维的稀疏特征。
![](./img/ch4/image38.png) ![](./img/ch4/image38.png)
@ -671,11 +662,9 @@ S. XieR. GirshickP. DollarZ. Tu和 K. He在[Aggregated Residual Transfo
## 4.9 为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的 ## 4.9 为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的
&nbsp;&nbsp;&nbsp;
- 评测对比为了让自己的结果更有说服力在发表自己成果的时候会同一个标准的baseline及在baseline上改进而进行比较常见的比如各种检测分割的问题都会基于VGG或者Resnet101这样的基础网络。 - 评测对比为了让自己的结果更有说服力在发表自己成果的时候会同一个标准的baseline及在baseline上改进而进行比较常见的比如各种检测分割的问题都会基于VGG或者Resnet101这样的基础网络。
- 时间和精力有限:在科研压力和工作压力中,时间和精力只允许大家在有限的范围探索。 - 时间和精力有限:在科研压力和工作压力中,时间和精力只允许大家在有限的范围探索。
- 模型创新难度大:进行基本模型的改进需要大量的实验和尝试,并且需要大量的实验积累和强大灵感,很有可能投入产出比比较小。 - 模型创新难度大:进行基本模型的改进需要大量的实验和尝试,并且需要大量的实验积累和强大灵感,很有可能投入产出比比较小。
- 资源限制:创造一个新的模型需要大量的时间和计算资源,往往在学校和小型商业团队不可行。 - 资源限制:创造一个新的模型需要大量的时间和计算资源,往往在学校和小型商业团队不可行。
- &nbsp;&nbsp;&nbsp;&nbsp;在实际的应用场景中,其实是有大量的非标准模型的配置。&nbsp; - 在实际的应用场景中,其实是有大量的非标准模型的配置。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -18,3 +18,8 @@ modify_log---->用来记录修改日志
3. 修改modify内容 3. 修改modify内容
4. 修改章节内容,图片路径等 4. 修改章节内容,图片路径等
<------Troyliu777-2018-11-13------->
1. 修改图片img12 img13 img14
2. 修改第五章内容,杨文英的部分还未合并进来

View File

@ -1,48 +1,41 @@
# 第五章 卷积神经网络CNN [TOC]
# 第五章 卷积神经网络CNN
标签(空格分隔): 原创性 深度学习 协作
卷积神经网络负责人:
重庆大学研究生-刘畅 787913208@qq.com
铪星创新科技联合创始人-杨文英;
标签(空格分隔): 深度学习
---
Markdown Revision 1; Markdown Revision 1;
Date: 2018/11/08 Date: 2018/11/08
Editor: 李骁丹-杜克大学 Editor: 李骁丹-杜克大学
Contact: xiaodan.li@duke.edu Contact: xiaodan.li@duke.edu
## 5.1 卷积神经网络的组成层 ## 5.1 卷积神经网络的组成层
1. 卷积神经网络主要应用于具有网格拓扑结构的数据集。 在卷积神经网络中一般包含5种类型的层
2. 卷积神经网络在语音识别,图像处理以及人脸识别方面有了广泛的应用并取得了巨大的成功。 > * 输入层
3. 卷积神经网络主要包含3种层 > * 卷积运算层
> * 激活函数层
> * 池化层
> * 全连接层
> * 卷积运算层:该层利用过滤器对输入特征进行卷积化以获得本地特征。本地特征构成特征图(feature map)。 **输入层**主要包含对原始图像进行预处理,包括白化、归一化、去均值等等。
> * 池化层: 池化操作包括取最值,取和以及取平均。池化操作将作用于特征图(feature map)。
> * 全连接层:基于池化层结果,全连接层将进行将分类预测等操作。
一个完整的神经网络就是由这三种层叠加组成的 **卷积运算层**主要使用滤波器,通过设定步长、深度等参数,对输入进行不同层次的特征提取。滤波器中的参数可以通过反向传播算法进行学习。
**结构示例** **激活函数层**主要是将卷积层的输出做一个非线性映射。常见的激活函数包括sigmoid,tanh,Relu等。
拿CIFAR-10数据集举例一个典型的卷积神经网络分类器应该有[INPUT - CONV - RELU - POOL - FC]的结构, **池化层**主要是用于参数量压缩。可以减轻过拟合情况。常见的有平均池化和最大值池化,不包含需要学习的参数。
> * INPUT[32\*32\*3]包含原始图片数据中的全部像素长宽都是32有RGB 3个颜色通道。 **全连接层**主要是指两层网络,所有神经元之间都有权重连接。常见用于网络的最后一层,用于计算类别得分。
> * CONV卷积层中每个神经元会和上一层的若干小区域连接计算权重和小区域像素的内积比如结果数据为[32\*32\*12]的。
> * RELU层就是神经元激励层主要的计算就是max(0,x),结果数据依旧是[32\*32\*12]。
> * POOLing层操作可以理解成一个下采样得到的结果维度就变为[16\*16\*12]。
> * 全连接层一般用于最后计算类别得分,得到的结果为[1\*1\*10]其中的10对应10个不同的类别。该层的所有神经元会和上一层的所有神经元连接。
这样卷积神经网络作为一个中间通道就一步步把原始图像数据转成最后的类别得分。有一点我们要提一下刚才提及的几种不同神经网络层其中有一些层是需要进行参数训练另外一些不需要。详细一点说卷积层和全连接层包含权重和偏移而RELU和POOLing层只是一个固定的函数运算是不包含权重和偏移参数的。不过POOLing层包含了我们手动指定的超参数。
**总结一下**
* 一个卷积神经网络由多种不同类型的层(卷积层/RELU层/POOLing层/全连接层等)叠加而成。
* 每一层的输入结构是3维的数据计算完输出依旧是3维的数据。
* 卷积层和全连接层包含训练参数但是RELU 和 POOLing 层不包含。
* 卷积层,全连接层和 POOLing 层包含超参数RELU 层没有。
下图为 CIFAR-10 数据集构建的一个卷积神经网络结构示意图:
![](./img/ch5/img1.png)
## 5.2 卷积如何检测边缘信息? ## 5.2 卷积如何检测边缘信息?
卷积运算是卷积神经网络最基本的组成部分。在神经网络中以物体识别为例特征的检测情况可大致做一下划分。前几层检测到的是一些边缘特征中间几层检测到的是物体的局部区域靠后的几层检测到的是完整物体。每个阶段特征的形成都是由多组滤波器来完成的。而其中的边缘检测部分是由滤波器来完成的。在传统的图像处理方法里面有许多边缘检测算子如canny算子。使用固定的模板来进行边缘检测。
卷积运算是卷积神经网络最基本的组成部分。神经网络的前几层首先检测边缘,接下来的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体。
先介绍一个概念,过滤器: 先介绍一个概念,过滤器:
![image](./img/ch5/img2.png) ![image](./img/ch5/img2.png)
@ -77,156 +70,103 @@
这就是检测物体垂直边缘的例子水平边缘的话只需将过滤器旋转90度。 这就是检测物体垂直边缘的例子水平边缘的话只需将过滤器旋转90度。
## 5.3 卷积的几个基本定义 ## 5.3 卷积层中的几个基本参数
首先,我们需要定义卷积层参数。 在卷积层中,有一些我们常用的参数,定义如下
### 5.3.1 卷积核大小 ### 5.3.1 卷积核大小
英文名是Kernel Size:卷积核的大小定义了卷积的感受野。二维卷积的核大小选择通常是3即3×3。
Kernel Size: 卷积核大小定义了卷积的视图范围。针对二维通常选择大小是3即3×3像素。
### 5.3.2 卷积核的步长 ### 5.3.2 卷积核的步长
英文名是Stride: Stride定义了卷积核在卷积过程中的步长。虽然它的默认值通常为1但我们可以将步长设置为2可以实现类似于pooling的下采样功能。
Stride: Stride定义了卷积核步长。虽然它的默认值通常为1但我们可以将步长设置为2然后对类似于MaxPooling的图像进行向下采样。
### 5.3.3 边缘填充 ### 5.3.3 边缘填充
英文名是Padding: Padding用于填充输入图像的边界。一个(半)填充的卷积将使空间输出维度与输入相等而如果卷积核大于1则对于未被填充的图像卷积后将会使图像一些边界消失。
Padding: Padding用于填充输入图像的边界。一个(半)填充的卷积将使空间输出维度与输入相等而如果卷积核大于1则未被填充的卷积将会使一些边界消失。
### 5.3.4 输入和输出通道 ### 5.3.4 输入和输出通道
英文名是 Input/Output Channels 一个卷积层接受一定数量的输入通道I并计算一个特定数量的输出通道O这一层所需的参数可以由I*O*K计算K等于卷积核中参数的数量。
一个卷积层接受一定数量的输入通道(I),并计算一个特定数量的输出通道(O)这一层所需的参数可以由I\*O\*K计算K等于卷积核中值的数量。
## 5.4 卷积的网络类型分类? ## 5.4 卷积的网络类型分类?
### 5.4.1 普通卷积 ### 5.4.1 普通卷积
普通卷积如下图所示。 普通卷积即如下图所示,使用一个固定大小的滤波器,对图像进行加权提特征。
![image](./img/ch5/img7.png) ![image](./img/ch5/img7.png)
### 5.4.2 扩张卷积 ### 5.4.2 扩张卷积
扩张卷积又称为带孔atrous卷积或者空洞dilated卷积。在使用扩张卷积时会引入一个称作扩张率dilation rate的参数。该参数定义了卷积核内参数间的行间隔数。例如下图所示一个3×3的卷积核扩张率为2它的感受野与5×5卷积核相同而仅使用9个参数。这样做的好处是在参数量不变的情况下可以获得更大的感受野。扩张卷积在实时分割领域应用非常广泛。
又名空洞atrous卷积扩张的卷积引入了另一个被称为扩张率dilation rate的卷积层。扩张率定义了卷积核中值之间的间隔。一个3×3卷积核的扩张率为2它的视图与5×5卷积核相同而只使用9个参数。一个5×5卷积核每两行或两列删除一行或一列。
这将以同样的计算代价提供更广阔的视角。扩张的卷积在实时分割领域特别受欢迎。如果需要广泛视图,但不能负担较多个卷积或更大的卷积核,往往会使用扩张卷积。
举例:
![image](./img/ch5/img8.png) ![image](./img/ch5/img8.png)
### 5.4.3 转置卷积 ### 5.4.3 转置卷积
转置卷积也就是反卷积deconvolution。虽然有些人经常直接叫它反卷积但严格意义上讲是不合适的因为它不符合一个反卷积的概念。反卷积确实存在但它们在深度学习领域并不常见。一个实际的反卷积会恢复卷积的过程。想象一下将一个图像放入一个卷积层中。现在把输出传递到一个黑盒子里然后你的原始图像会再次出来。这个黑盒子就完成了一个反卷积。这是一个卷积层的数学逆过程。
转置卷积也称反卷积deconvolution。虽然有些人经常直接叫其反卷积但严格意义上讲是不合适的因为它不符合反卷积的基本概念。反卷积确实存在但它们在深度学习领域并不常见。一个实际的反卷积会恢复卷积的过程。将一个图像放入一个卷积层中。接着把输出传输到一个黑盒子里最后该黑盒将输出原始图像。这个黑盒子就完成了一个反卷积。其是卷积层的数学逆过程。 一个转置的卷积在某种程度上是相似的,因为它产生的空间分辨率是跟反卷积后产生的分辨率相同。不同之处是在卷积核值上执行的实际数学操作。转置卷积层使用的是常规的卷积,但是它能够恢复其空间变换。
转置卷积在某种程度上与反卷积类似因为它在相同的空间分辨率下是一个假设的反卷积层。然而在数值上执行的实际数学操作是不同的。一个转置卷积层执行一个常规的卷积但是它会恢复它的空间变换spatial transformation
在这一点上,你应该非常困惑,让我们来看一个具体的例子:
5×5的图像被馈送到一个卷积层。步长设置为2无边界填充而卷积核是3×3。结果得到了2×2的图像。
如果想要逆转这个过程我们需要反向的数学运算以便从我们输入的每个像素中生成9个值。我们将步长设置为2来遍历输出图像。这就是一个反卷积过程。
在这一点上,让我们来看一个具体的例子:
将5×5的图像送到一个卷积层。步长设置为2无边界填充而卷积核是3×3。结果得到了2×2的图像。如果我们想要逆向该过程则需要数学上的逆运算以便从输入的每个像素值中生成9个值。然后我们将步长设置为2来遍历输出图像。这就是一个反卷积过程。
![image](./img/ch5/img9.png) ![image](./img/ch5/img9.png)
转置卷积的实现过程则不同。为了保证输出将是一个5×5的图像在使用卷积运算时我们需要在输入上执行一些特别的填充。而这一过程并不是逆转了卷积运算它仅仅是重新构造了之前的空间分辨率并进行了卷积运算。这样的做法并不是数学上的逆过程但是很适用于编码-解码器Encoder-Decoder架构。我们就可以把图像的上采样upscaling和卷积操作结合起来而不是做两个分离的过程。
一个转置的卷积做法与此不同。唯一的共同点是它的输出仍然是一个5×5的图像但其实际上执行的是正常卷积运算。为了实现这一点我们需要在输入上执行一些奇特的填充。
因此这一步不会逆转上面的过程。至少不考虑数值。
它仅仅是重新构造了之前的空间分辨率并进行了卷积运算。这不是数学上的逆过程,但是对于编码-解码器Encoder-Decoder架构来说这仍然是非常有用的。这样我们就可以把图像的尺度上推upscaling和卷积结合起来而不是做两个分离的过程。
如果我们想反转这个过程我们需要反数学运算以便从我们输入的每个像素中生成9个值。之后我们以2步幅的设置来遍历输出图像。这将是一个反卷积。
![image](./img/ch5/img10.png) ![image](./img/ch5/img10.png)
### 5.4.4 可分离卷积 ### 5.4.4 可分离卷积
在一个可分离卷积中我们可以将内核操作拆分成多个步骤。我们用y = convxk表示卷积其中y是输出图像x是输入图像k是核大小。这一步很简单。接下来我们假设k可以由下面这个等式计算得出k = k1.dotk2。这将使它成为一个可分离的卷积因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果而不是用k做二维卷积。
在一个可分离卷积中我们可以将内核操作拆分成多个步骤。我们用y = convxk表示卷积其中y是输出图像x是输入图像k是内核。这一步很简单。接下来我们假设k可以由下面这个等式计算得出k = k1.dotk2。这将使它成为一个可分离的卷积因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果而不是用k做二维卷积。
![image](./img/ch5/img11.png) ![image](./img/ch5/img11.png)
我们以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[10-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时你只需要6个而不是9个参数。 以图像处理中的Sobel算子为例。你可以通过乘以向量[10-1]和[1,2,1] .T获得相同的核大小。在执行相同的操作时你只需要6个参数而不是9个。上面的示例显示了所谓的空间可分离卷积。即将一个二维的卷积分离成两个一维卷积的操作。在神经网络中为了减少网络参数加速网络运算速度。我们通常使用的是一种叫深度可分离卷积的神经网络。
上面的示例显示了所谓的空间可分离卷积,据我所知,这并不是在深度学习中使用的。我只是想确保在他人费劲地操作时,你不会受到如此困惑。在神经网络中,我们通常使用的是一种叫做深度可分离卷积的神经网络。
## 5.5 图解12种不同类型的2D卷积 ## 5.5 图解12种不同类型的2D卷积
http://www.sohu.com/a/159591827_390227 http://www.sohu.com/a/159591827_390227
## 5.6 2D卷积与3D卷积有什么区别 ## 5.6 2D卷积与3D卷积有什么区别
### 5.6.1 2D卷积 ### 5.6.1 2D卷积
二维卷积操作如图所示为了更直观的说明分别展示了单通道和多通道的操作。假定只使用了1个滤波器即输出图像只有一个channel。其中针对单通道输入图像的channel为1卷积核尺寸为 (k_h, k_w, 1),卷积核在输入图像的空间维度上进行滑窗操作,每次滑窗和 (k_h, k_w)窗口内的值进行卷积操作得到输出图像中的一个值。针对多通道假定输入图像的channel为3卷积核尺寸则为 (k_h, k_w, 3)则每次滑窗与3个channels上的 (k_h, k_w)窗口内的所有值进行卷积操作,得到输出图像中的一个值。
2D卷积操作如图所示为了解释的更清楚分别展示了单通道和多通道的操作。且为了画图方便假定只有1个filter即输出图像只有一个chanel。
其中针对单通道输入图像的channel为1卷积核尺寸为 (k_h, k_w, 1),卷积核在输入图像上的的空间维度(即(height,width)两维)上进行进行滑窗操作,每次滑窗和 (k_h, k_w) 窗口内的values进行卷积操作现在都用相关操作取代得到输出图像中的一个value。针对多通道假定输入图像的channel为3卷积核尺寸为 (k_h, k_w, 3) 卷积核在输入图像上的的空间维度(即(h, w)两维上进行进行滑窗操作每次滑窗与3个channels上的 (k_h, k_w) 窗口内的所有的values进行相关操作得到输出图像中的一个value。
![image](./img/ch5/img12.png) ![image](./img/ch5/img12.png)
### 5.6.2 3D卷积 ### 5.6.2 3D卷积
3D卷积操作如图所示同样分为单通道和多通道且假定只使用1个滤波器即输出图像仅有一个channel。其中针对单通道与2D卷积不同之处在于输入图像多了一个length维度卷积核也多了一个k_l维度因此3D卷积核的尺寸为k_h, k_w, k_l),每次滑窗与 (k_h, k_w, k_l)窗口内的值进行相关操作得到输出3D图像中的一个值.针对多通道则与2D卷积的操作一样每次滑窗与3个channels上的 (k_h, k_w, k_l) 窗口内的所有值进行相关操作得到输出3D图像中的一个值。
3D卷积操作如图2所示同样分为单通道和多通道且只使用一个filter输出一个channel。其中针对单通道与2D卷积不同之处在于输入图像多了一个 length 维度卷积核也多了一个k_l维度因此卷积核在输入3D图像的空间维度height和widthw维和length维度上均进行滑窗操作每次滑窗与 (k_h, k_w, k_l) 窗口内的values进行相关操作得到输出3D图像中的一个value.
针对多通道则与2D卷积的操作一样每次滑窗与3个channels上的 (k_h, k_w, k_l) 窗口内的所有values进行相关操作得到输出3D图像中的一个value。
![image](./img/ch5/img13.png) ![image](./img/ch5/img13.png)
## 5.7 有哪些池化方法? ## 5.7 有哪些池化方法?
在构建卷积神经网络时,经常会使用池化操作,而池化层往往在卷积层后面,通过池化操作来降低卷积层输出的特征维度,同时可以防止过拟合现象。池化操作可以降低图像维度的原因,本质上是因为图像具有一种“静态性”的属性,这个意思是说在一个图像区域有用的特征极有可能在另一个区域同样有用。因此,为了描述一个大的图像,很直观的想法就是对不同位置的特征进行聚合统计。例如,可以计算图像在固定区域上特征的平均值 (或最大值)来代表这个区域的特征。[1]
在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
为什么可以通过降低维度呢?
因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。
### 5.7.1 一般池化General Pooling ### 5.7.1 一般池化General Pooling
池化作用于图像中不重合的区域(这与卷积操作不同,过程如下图。 池化操作与卷积操作不同,过程如下图。
![image](./img/ch5/img14.png) ![image](./img/ch5/img14.png)
池化操作过程如图所示对固定区域的特征使用某一个值来表示。最常见的池化操作有两种分为平均池化mean pooling和最大池化max pooling
![image](./img/ch5/img15.png) 1、平均池化计算图像区域的平均值作为该区域池化后的值。
我们定义池化窗口的大小为sizeX即下图中红色正方形的边长定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的所以sizeX=stride。 2、最大池化选图像区域的最大值作为该区域池化后的值。
![image](./img/ch5/img16.png)
最常见的池化操作为平均池化mean pooling和最大池化max pooling
* 平均池化:计算图像区域的平均值作为该区域池化后的值。
* 最大池化:选图像区域的最大值作为该区域池化后的值。
上述的池化过程,相邻的池化窗口间没有重叠部分。
### 5.7.2 重叠池化General Pooling ### 5.7.2 重叠池化General Pooling
重叠池化正如其名字所说的相邻池化窗口之间会有重叠区域此时sizeX>stride。论文中有作者使用了重叠池化其他的设置都不变的情况下 top-1和top-5 的错误率分别减少了0.4% 和0.3%。 重叠池化即是一种相邻池化窗口之间会有重叠区域的池化技术。论文中[2]中作者使用了重叠池化其他的设置都不变的情况下top-1和top-5 的错误率分别减少了0.4% 和0.3%。
### 5.7.3 空金字塔池化Spatial Pyramid Pooling
### 5.7.3 空间金字塔池化Spatial Pyramid Pooling 空间金字塔池化可以将任意尺度的图像卷积特征转化为相同维度这不仅可以让CNN处理任意尺度的图像还能避免cropping和warping操作导致一些信息的丢失。一般的卷积神经网络都需要固定输入图像大小这是因为全连接层的输入需要固定输入维度但在卷积操作时并没有对图像大小有限制所以作者提出了空间金字塔池化方法先让图像进行卷积操作然后使用SPP方法转化成维度相同的特征最后输入到全连接层。
空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度这不仅可以让CNN处理任意尺度的图像还能避免裁剪(cropping)和弯曲(warping)操作,导致一些信息的丢失,具有非常重要的意义。
一般的CNN都需要输入图像的大小是固定的这是因为全连接层的输入需要固定输入维度但在卷积操作是没有对图像尺度有限制所以作者提出了空间金字塔池化先让图像进行卷积操作然后转化成维度相同的特征输入到全连接层这个可以把CNN扩展到任意大小的图像。
![image](./img/ch5/img17.png) ![image](./img/ch5/img17.png)
空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征我们可以得到1*1,2*2,4*4的池化结果由于conv5中共有256个过滤所以得到1个256维的特征4个256个特征以及16个256维的特征然后把这21个256维特征接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。 根据论文作者所述空间金字塔池化的思想来自于Spatial Pyramid Model,它是将一个pooling过程变成了多个尺度的pooling。用不同大小的池化窗口作用于卷积特征这样就可以得到1X1,2X2,4X4的池化结果由于conv5中共有256个滤波器所以得到1个256维的特征4个256个特征以及16个256维的特征然后把这21个256维特征链接起来输入全连接层通过这种方式把不同大小的图像转化成相同维度的特征。
![image](./img/ch5/img18.png) ![image](./img/ch5/img18.png)
对于不同的图像要得到相同大小的pooling结果就需要根据图像大小动态的计算池化窗口大小和步长。假设conv5输出的大小为a*a需要得到n*n大小的池化结果可以让窗口大小sizeX为[a/n],步长为[a/n]。下图以conv5输出的大小为13*13为例 对于不同的图像,如果想要得到相同大小的pooling结果就需要根据图像大小动态的计算池化窗口大小和步长。假设conv5输出的大小为a*a需要得到n*n大小的池化结果可以让窗口大小sizeX为[a/n],步长为[a/n]。下图展示了以conv5输出大小是13*13为例spp算法的各层参数
![image](./img/ch5/img19.png) ![image](./img/ch5/img19.png)
疑问如果conv5输出的大小为14*14[pool1*1]的sizeX=stride=14[pool2*2]的sizeX=stride=7这些都没有问题但是[pool4*4]的sizeX=5stride=4最后一列和最后一行特征没有被池化操作计算在内。 总结来说SPP方法其实就是一种使用多个尺度的池化方法可以获取图像中的多尺度信息。在卷积神经网络中加入SPP后可以让CNN处理任意大小的输入这让模型变得更加的灵活。
SPP其实就是一种多个scale的pooling可以获取图像中的多尺度信息在CNN中加入SPP后可以让CNN处理任意大小的输入这让模型变得更加的flexible。
## 5.8 1x1卷积作用 ## 5.8 1x1卷积作用
1×1的卷积主要有以下两个方面的作用
1. 实现信息的跨通道交互和整合。
2. 对卷积核通道数进行降维和升维,减小参数量。
1×1的卷积大概有两个方面的作用
1. 实现跨通道的交互和信息整合。
2. 进行卷积核通道数的降维和升维。
下面详细解释一下: 下面详细解释一下:
1. 1×1的卷积层可能引起人们的重视是在NIN(Network In Network)的结构中论文中林敏师兄的想法是利用MLP(multilayer perceptron)代替传统的线性卷积核从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释认为文中提出的MLP其实等价于在传统卷积核后面接cccp层从而实现多个feature map的线性组合实现跨通道的信息整合。而cccp层是等价于1×1卷积的因此细看NIN的caffe实现就是在每个传统卷积层后面接了两个cccp层其实就是接了两个1×1的卷积层 **第一点 实现信息的跨通道交互和整合**
对1×1卷积层的探讨最初是出现在NIN的结构论文作者的动机是利用MLP代替传统的线性卷积核从而提高网络的表达能力。文中从跨通道池化的角度进行解释认为文中提出的MLP其实等价于在传统卷积核后面接cccp层从而实现多个feature map的线性组合实现跨通道的信息整合。而查看代码实现cccp层即等价于1×1卷积层。
2. 进行降维和升维引起人们重视的可能是在GoogLeNet里。对于每一个Inception模块如下图原始模块是左图右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小但是当输入和输出的通道数很大时乘起来也会使得卷积核参数变的很大而右图加入1×1卷积后可以降低输入的通道数卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例输入的feature map是28×28×1923a模块中1×1卷积通道为643×3卷积通道为128,5×5卷积通道为32如果是左图结构那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层这样卷积核参数就变成了1×1×192×64+1×1×192×96+3×3×96×128+1×1×192×16+5×5×16×32参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量左图pooling后feature map是不变的再加卷积层得到的feature map会使输出的feature map扩大到416如果每个模块都这样网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后得到了更为紧凑的网络结构虽然总共有22层但是参数数量却只是8层的AlexNet的十二分之一当然也有很大一部分原因是去掉了全连接层 **第二点 对卷积核通道数进行降维和升维,减小参数量**
1x1卷积层能带来降维和升维的效果在一系列的GoogLeNet中体现的最明显。对于每一个Inception模块如下图左图是原始模块右图是加入1×1卷积进行降维的模块。虽然左图的卷积核都比较小但是当输入和输出的通道数很大时卷积核的参数量也会变的很大而右图加入1×1卷积后可以降低输入的通道数因此卷积核参数、运算复杂度也就大幅度下降。以GoogLeNet的3a模块为例输入的feature map是28×28×1923a模块中1×1卷积通道为643×3卷积通道为128,5×5卷积通道为32如果是左图结构那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层这样卷积核参数就变成了1×1×192×64+1×1×192×96+3×3×96×128+1×1×192×16+5×5×16×32参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量左图pooling后feature map是不变的再加卷积层得到的feature map会使输出的feature map扩大到416如果每个模块都这样网络的输出会越来越大。而右图在pooling后面加了通道数为32的1×1卷积使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后得到了更为紧凑的网络结构虽然总共有22层但是参数数量却只是8层AlexNet的十二分之一当然其中也有丢掉全连接层的原因。
![image](./img/ch5/img20.png) ![image](./img/ch5/img20.png)
而非常经典的ResNet结构同样也使用了1×1卷积并且是在3×3卷积层的前后都使用了不仅进行了降维还进行了升维使得卷积层的输入和输出的通道数都减小参数数量进一步减少如下图结构所示。
最近大热的MSRA的ResNet同样也利用了1×1卷积并且是在3×3卷积层的前后都使用了不仅进行了降维还进行了升维使得卷积层的输入和输出的通道数都减小参数数量进一步减少如下图的结构。不然真不敢想象152层的网络要怎么跑起来TAT
![image](./img/ch5/img21.png) ![image](./img/ch5/img21.png)
@ -252,18 +192,18 @@ SPP其实就是一种多个scale的pooling可以获取图像中的多尺度
3上面说了下卷积和池化再说下计算中需要注意到的。在代码中使用的是彩色图彩色图有3个通道那么对于每一个通道来说要单独进行卷积和池化有一个地方尤其是进行卷积的时候要注意到隐藏层的每一个值是对应到一幅图的3个通道穿起来的所以分3个通道进行卷积之后要加起来正好才能对应到一个隐藏层的神经元上也就是一个feature上去。 3上面说了下卷积和池化再说下计算中需要注意到的。在代码中使用的是彩色图彩色图有3个通道那么对于每一个通道来说要单独进行卷积和池化有一个地方尤其是进行卷积的时候要注意到隐藏层的每一个值是对应到一幅图的3个通道穿起来的所以分3个通道进行卷积之后要加起来正好才能对应到一个隐藏层的神经元上也就是一个feature上去。
## 5.10 卷积核一定越大越好? ## 5.10 卷积核是否一定越大越好?
首先,给出答案。不是。
在AlexNet网络结构中用到了一些非常大的卷积核比如11×11、5×5卷积核。之前研究者的想法是卷积核越大receptive field感受野越大因此获得的特征越好。虽说如此但是大的卷积核会导致计算量大幅增加不利于训练更深层的模型而相应的计算性能也会降低。于是在VGG、Inception网络中实验发现利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳同时参数量3×3×2+1 VS 5×5×1+1会更少因此后来3×3卷积核被广泛应用在各种模型中。
AlexNet中用到了一些非常大的卷积核比如11×11、5×5卷积核之前人们的观念是卷积核越大receptive field感受野越大看到的图片信息越多因此获得的特征越好。虽说如此但是大的卷积核会导致计算量的暴增不利于模型深度的增加计算性能也会降低。于是在VGG最早使用、Inception网络中利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳同时参数量3×3×2+1 VS 5×5×1+1 被降低因此后来3×3卷积核被广泛应用在各种模型中。多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多在连通性不变的情况下大大降低了参数个数和计算复杂度。当然卷积核也不是越小越好对于特别稀疏的数据比如下图所示当使用比较小的卷积核的时候可能无法表示其特征如果采用较大的卷积核则会导致复杂度极大的增加。总而言之我们应该选择多个相对小的卷积核来进行卷积。 多个小卷积核的叠加使用远比一个大卷积核单独使用效果要好的多,在连通性不变的情况下,大大降低了参数量和计算复杂度。当然,卷积核也不是越小越好,对于特别稀疏的数据,当使用比较小的卷积核的时候可能无法表示其特征,如果采用较大的卷积核则会导致复杂度极大的增加。
## 5.11 每层卷积只能用一种尺寸的卷积核? 总而言之,我们多倾向于选择多个相对小的卷积核来进行卷积。
传统的层叠式网络基本上都是一个个卷积层的堆叠每层只用一个尺寸的卷积核例如VGG结构中使用了大量的3×3卷积层。事实上同一层feature map可以分别使用多个不同尺寸的卷积核以获得不同尺度的特征再把这些特征结合起来得到的特征往往比使用单一卷积核的要好谷歌的GoogLeNet或者说Inception系列的网络就使用了多个卷积核的结构
## 5.11 每层卷积是否只能用一种尺寸的卷积核?
经典的神经网络都属于层叠式网络并且每层仅用一个尺寸的卷积核例如VGG结构中使用了大量的3×3卷积层。事实上同一层feature map可以分别使用多个不同尺寸的卷积核以获得不同尺度的特征再把这些特征结合起来得到的特征往往比使用单一卷积核的要好例如GoogLeNet、Inception系列的网络均是每层使用了多个卷积核结构。如下图所示输入的feature map在同一层分别经过1×1、3×3、5×5三种不同尺寸的卷积核再将分别得到的特征进行组合。
![image](./img/ch5/img24.png) ![image](./img/ch5/img24.png)
如上图所示一个输入的feature map 分别同时经过1×1、3×3、5×5的卷积核的处理得出的特征再组合起来获得更佳的特征。
## 5.12 怎样才能减少卷积层参数量? ## 5.12 怎样才能减少卷积层参数量?
发明GoogleNet的团队发现如果仅仅引入多个尺寸的卷积核会带来大量的额外的参数受到Network In Network中1×1卷积核的启发为了解决这个问题他们往Inception结构中加入了一些1×1的卷积核如图所示 发明GoogleNet的团队发现如果仅仅引入多个尺寸的卷积核会带来大量的额外的参数受到Network In Network中1×1卷积核的启发为了解决这个问题他们往Inception结构中加入了一些1×1的卷积核如图所示
@ -280,22 +220,14 @@ AlexNet中用到了一些非常大的卷积核比如11×11、5×5卷积核
1×1卷积核也被认为是影响深远的操作往后大型的网络为了降低参数量都会应用上1×1卷积核。 1×1卷积核也被认为是影响深远的操作往后大型的网络为了降低参数量都会应用上1×1卷积核。
## 5.13 卷积操作时必须同时考虑通道和区域吗? ## 5.13 在进行卷积操作时,必须同时考虑通道和区域吗?
![image](./img/ch5/img27.png) ![image](./img/ch5/img27.png)
标准的卷积过程可以看上图一个2×2的卷积核在卷积时对应图像区域中的所有通道均被同时考虑那么问题来了为什么一定要同时考虑图像区域和通道呢能不能将通道和空间区域分开考虑
标准的卷积过程可以看上图一个2×2的卷积核在卷积时对应图像区域中的所有通道均被同时考虑问题在于为什么一定要同时考虑图像区域和通道我们为什么不能把通道和空间区域分开考虑
![image](./img/ch5/img28.png) ![image](./img/ch5/img28.png)
Xception网络由此诞生。我们首先对每一个通道进行各自的卷积操作有多少个通道就有多少个过滤器。得到新的通道feature maps之后这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution”称为深度可分离卷积。在imagenet 1000类分类任务中取得了非常鲁棒的效果同时也减少了大量的参数。我们可以通过一个例子来算一算使用深度可分离卷积能d假设输入通道数为3要求输出通道数为256。
Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作有多少个通道就有多少个过滤器。得到新的通道feature maps之后这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” 缩写“DW”。 1. 使用标准的卷积操作使用3×3×256的卷积核参数量为3×3×3×256 = 6,912
2. 使用深度可分离的结构分两步完成。参数量为3×3×3 + 3×1×1×256 = 795。
这种操作是相当有效的在imagenet 1000类分类任务中已经超过了InceptionV3的表现而且也同时减少了大量的参数我们来算一算假设输入通道数为3要求输出通道数为256两种做法 参数量仅为标准卷积的九分之一! 因此使用depthwise操作比标准的卷积操作在降低不少参数量的同时得到了更好的分类效果。
1. 直接接一个3×3×256的卷积核参数量为3×3×3×256 = 6,912
2. DW操作分两步完成参数量为3×3×3 + 3×1×1×256 = 795又把参数量降低到九分之一
因此一个depthwise操作比标准的卷积操作降低不少的参数量同时论文中指出这个模型得到了更好的分类效果。
## 5.14 采用宽卷积的好处有什么? ## 5.14 采用宽卷积的好处有什么?
@ -308,11 +240,12 @@ Xception网络就是基于以上的问题发明而来。我们首先对每一个
### 5.14.2 为什么采用宽卷积? ### 5.14.2 为什么采用宽卷积?
通过将输入边角的值纳入到滑窗中心进行计算,以便损失更少的信息。 通过将输入边角的值纳入到滑窗中心进行计算,以便损失更少的信息。
## 5.15 卷积层输出的深度与哪个部件的个数相同?
输出深度(通道)与卷积核(过滤器)的个数相等。 ## 5.15 在卷积操作后,输出特征图(图像)大小如何计算?
在进行卷积操作时往往根据需要我们需设定一些参数。常见的参数有卷积核大小k, 窗口滑动的步长s, 进行填充的像素p, 假设输入特征图大小为Iw*Iw。则由以下公式可计算出输出特征图的大小Ow。
O_w = \frac{(I_w - k + 2p))}{s} + 1
## 5.16 如何得到卷积层输出的深度? ## 5.16 如何得到卷积层输出的深度?
参数共享在卷积层中使用参数共享是用来控制参数的数量。假设在第一个卷积层就有55x55x96=290,400个神经元每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数显然这个数目是非常大的。 参数共享在卷积层中使用参数共享是用来控制参数的数量。假设在第一个卷积层就有55x55x96=290,400个神经元每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数显然这个数目是非常大的。
@ -535,42 +468,35 @@ CNN的训练主要是在卷积层和子采样层的交互上其主要的计
对于第三个问题实际上有些人以为Matlab中对sigmoid函数进行inline的定义会更快其实不然Matlab与C/C++等等语言不一样Matlab的inline反而比普通的函数定义更费时间。所以我们可以直接在代码中使用计算sigmoid函数及其导数的真实代码。 对于第三个问题实际上有些人以为Matlab中对sigmoid函数进行inline的定义会更快其实不然Matlab与C/C++等等语言不一样Matlab的inline反而比普通的函数定义更费时间。所以我们可以直接在代码中使用计算sigmoid函数及其导数的真实代码。
## 5.24 CNN的参数经验设置 ## 5.24 卷积神经网络的经验参数设置
对于卷积神经网络的参数设置,没有很明确的指导原则,以下仅是一些经验集合。
对于卷积神经网络的参数设置,没有很明确的方法,这只是众多学者的一些经验。 1、learning-rate 学习率学习率越小模型收敛花费的时间就越长但是可以逐步稳健的提高模型精确度。一般初始设置为0.1然后每次除以0.2或者0.5来改进,得到最终值;
1、learning-rate 学习速率学习速率越小模型收敛花费的时间就越长但是可以提高模型精确度。一般初始设置为0.1然后每次除以0.2或者0.5来改进,得到最终值 2、batch-size 样本批次容量影响模型的优化程度和收敛速度需要参考你的数据集大小来设置具体问题具体分析一般使用32或64在计算资源允许的情况下可以使用大batch进行训练。有论文提出大batch可以加速训练速度并取得更鲁棒的结果
2、batch-size 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小来设置,具体问题具体分析 3、weight-decay 权重衰减用来在反向传播中更新权重和偏置一般设置为0.005或0.001
3、weight-decay 权重衰减用来在反向传播中更新权重和偏置一般设置为0.005 4、epoch-number 训练次数包括所有训练样本的一个正向传递和一个反向传递训练至模型收敛即可和迭代次数iteration不一样
总之,不是训练的次数越多,测试精度就会越高。会有各种原因导致过拟合,比如一种可能是预训练的模型太复杂,而使用的数据集样本数量太少,种类太单一。
4、epoch-number 训练次数包括所有训练样本的一个正向传递和一个反向传递训练至模型收敛即可和迭代周期iteration不一样
而且,也不是说训练的次数越多,测试精度就会越高,可能会因为预训练的模型太复杂,而我的数据集样本数量太少,种类太单一,而出现过拟合。
## 5.25 提高泛化能力的方法总结
http://blog.csdn.net/u010900574/article/details/51992156
### 5.25.1 主要方法
## 5.25 提高泛化能力的方法总结(代码示例)
本节主要以代码示例来说明可以提高网络泛化能力的方法。
代码实验是基于mnist数据集mnist是一个从0到9的手写数字集合共有60000张训练图片10000张测试图片。每张图片大小是28*28大小。目的就是通过各种手段来构建一个高精度的分类神经网络。
### 5.25.1 手段
一般来说,提高泛化能力的方法主要有以下几个: 一般来说,提高泛化能力的方法主要有以下几个:
> * 正则化 > * 使用正则化技术
> * 增加神经网络层数 > * 增加神经网络层数
> * 使用正确的代价函数 > * 使用恰当的代价函数
> * 使用好的权重初始化技术 > * 使用权重初始化技术
> * 人为拓展训练集 > * 人为增广训练集
> * 弃权技术 > * 使用dropout技术
### 5.25.2 主要方法 ### 5.25.2 主要方法
下面我们通过实验结果来判断每种手段的效果。
下面我们通过实验结果给这些参数优化理论一个直观的结果 1普通的全连接神经网络
网络结构使用一个隐藏层其中包含100个隐藏神经元输入层是784输出层是one-hot编码的形式最后一层是Softmax层。损失函数采用对数似然代价函数60次迭代学习速率η=0.1随机梯度下降的小批量数据mini-SGD大小为10没使用正则化。在测试集上得到的结果是97.8%,代码如下:
1普通的全连接神经网络的效果
我们使用一个隐藏层包含100个隐藏神经元输入层是784输出层是one-hot编码的形式最后一层是Softmax层。训练过程采用对数似然代价函数60次迭代学习速率η=0.1随机梯度下降的小批量数据大小为10没有正则化。在测试集上得到的结果是97.8%,代码如下:
```python ```python
>>> import network3 >>> import network3
>>> from network3 import Network >>> from network3 import Network
@ -581,15 +507,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) >>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
``` ```
2使用卷积神经网络 — 仅一个卷积层 2使用卷积神经网络 — 仅一个卷积层
输入层是卷积层卷积核大小是5*5一共20个特征映射。最大池化层的大小为2*2。后面接一层100个隐藏神经元的全连接层。结构如图所示
输入层是卷积层5*5的局部感受野也就是一个5*5的卷积核一共20个特征映射。最大池化层选用2*2的大小。后面是100个隐藏神经元的全连接层。结构如图所示
![image](./img/ch5/img62.png) ![image](./img/ch5/img62.png)
在这个结构中我们把卷积层和池化层看做是训练图像的特征提取而后的全连接层则是一个更抽象层次的特征提取整合全局信息。同样设定是60次迭代批量数据大小是10学习率是0.1.代码如下,
在这个架构中我们把卷积层和chihua层看做是学习输入训练图像中的局部感受野而后的全连接层则是一个更抽象层次的学习从整个图像整合全局信息。也是60次迭代批量数据大小是10学习率是0.1.代码如下。
```python ```python
>>> net = Network([ >>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
@ -600,13 +521,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
>>> net.SGD(training_data, 60, mini_batch_size, 0.1, >>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data) validation_data, test_data)
``` ```
经过三次运行取平均后准确率是98.78%提高得较多。错误率降低了1/3。
经过三次运行取平均后准确率是98.78%这是相当大的改善。错误率降低了1/3。卷积神经网络开始显现威力。
3使用卷积神经网络 — 两个卷积层 3使用卷积神经网络 — 两个卷积层
我们接着插入第二个卷积层把它插入在之前结构的池化层和全连接层之间同样是使用5*5的局部感受野2*2的池化层。
我们接着插入第二个卷积-混合层,把它插入在之前的卷积-混合层和全连接层之间同样的5*5的局部感受野2*2的池化层。
```python ```python
>>> net = Network([ >>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
@ -619,13 +537,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) >>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
``` ```
这一次准确率达到了99.06%。
这一次我们拥有了99.06%的准确率。
4使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化 4使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化
上面的网络结构我们使用的是Sigmod激活函数现在我们换成线性修正激活函数ReLU 同样设定参数为60次迭代学习速率η=0.03使用L2正则化正则化参数λ=0.1,代码如下:
上面我们使用的Sigmod激活函数现在我们换成线性修正激活函数ReLU f(z)=max(0,z)f(z)=max(0,z),我们选择60个迭代期学习速率η=0.03,η=0.03, 使用L2正则化正则化参数λ=0.1λ=0.1,代码如下:
```python ```python
>>> from network3 import ReLU >>> from network3 import ReLU
>>> net = Network([ >>> net = Network([
@ -642,13 +557,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
>>> net.SGD(training_data, 60, mini_batch_size, 0.03, >>> net.SGD(training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1) validation_data, test_data, lmbda=0.1)
``` ```
这一次准确率达到了99.23%超过了使用sigmoid激活函数的99.06%. ReLU的优势是当取最大极限时梯度不会饱和。
这一次我们获得了99.23%的准确率超过了S型激活函数的99.06%. ReLU的优势是max(0,z)max(0,z)中z取最大极限时不会饱和不像是S函数这有助于持续学习。 5卷积神经网络 —两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集
拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替无论是上一个像素下一个像素或者左右的像素。其他的方法也有改变亮度改变分辨率图片旋转扭曲位移等。我们把50000幅图像人为拓展到250000幅图像。使用与第四小节一样的网络因为我们训练时使用了5倍的数据所以减少了过拟合的风险。
5使用卷积神经网络,即两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集
拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替无论是上一个像素下一个像素或者左右的像素。其他的方法也有改变亮度改变分辨率图片旋转扭曲位移等。我们把50,000幅图像人为拓展到250,000幅图像。使用第4节一样的网络因为我们是在训练5倍的数据所以减少了过拟合的风险。
```python ```python
>>> expanded_training_data, _, _ = network3.load_data_shared( >>> expanded_training_data, _, _ = network3.load_data_shared(
"../data/mnist_expanded.pkl.gz") "../data/mnist_expanded.pkl.gz")
@ -666,12 +578,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1) validation_data, test_data, lmbda=0.1)
``` ```
这次得到了99.37的训练正确率。
这次的到了99.37的训练正确率。 6卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层
继续上面的网络我们拓展全连接层的规模使用300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%.
6使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层
继续上面的网络我们拓展全连接层的规模300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%. 我们插入一个额外的全连接层
```python ```python
>>> net = Network([ >>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
@ -688,13 +598,10 @@ http://blog.csdn.net/u010900574/article/details/51992156
>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1) validation_data, test_data, lmbda=0.1)
``` ```
这次取得了99.43%的精度。拓展后的网络并没有帮助太多。 这次取得了99.43%的精度。拓展后的网络并没有帮助太多。
7使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+弃权技术 7卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+dropout技术
dropout的基本思想就是在训练网络时随机的移除单独的激活值使得模型更稀疏不太依赖于训练数据的特质。我们尝试应用dropout到最终的全连接层(而不是在卷积层)。由于训练时间将迭代次数设置为40全连接层使用1000个隐藏神经元因为dropout会丢弃一些神经元。Dropout是一种非常有效且能提高泛化能力降低过拟合的方法
弃权的基本思想就是在训练网络时随机地移除单独的激活值,使得模型对单独的依据丢失更为强劲,因此不太依赖于训练数据的特质。我们尝试应用弃权技术到最终的全连接层(不是在卷积层)。这里减少了迭代期的数量为40个全连接层使用1000个隐藏神经元因为弃权技术会丢弃一些神经元。Dropout是一种非常有效有提高泛化能力降低过拟合的方法
```python ```python
>>> net = Network([ >>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
@ -714,14 +621,11 @@ http://blog.csdn.net/u010900574/article/details/51992156
>>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03, >>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03,
validation_data, test_data) validation_data, test_data)
``` ```
使用dropout得到了99.60%的准确率。
使用弃权技术得到了99.60%的准确率。 8卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络
8使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络
组合网络类似于随机森林或者adaboost的集成方法创建几个神经网络让他们投票来决定最好的分类。我们训练了5个不同的神经网络每个都大到了99.60%的准去率用这5个网络来进行投票表决一个图像的分类。 组合网络类似于随机森林或者adaboost的集成方法创建几个神经网络让他们投票来决定最好的分类。我们训练了5个不同的神经网络每个都大到了99.60%的准去率用这5个网络来进行投票表决一个图像的分类。
采用这种集成方法精度又得到了微小的提升达到了99.67%。
采用这个方法达到了99.67%的准确率。
## 5.26 CNN在CV与NLP领域运用的联系与区别 ## 5.26 CNN在CV与NLP领域运用的联系与区别
@ -737,32 +641,24 @@ http://blog.csdn.net/u010900574/article/details/51992156
1. 区域不变性:滤波器在每层的输入向量(图像)上滑动检测的是局部信息然后通过pooling取最大值或均值。pooling这步综合了局部特征失去了每个特征的位置信息。这很适合基于图像的任务比如要判断一幅图里有没有猫这种生物你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里词语在句子或是段落里出现的位置顺序都是很重要的信息。 1. 区域不变性:滤波器在每层的输入向量(图像)上滑动检测的是局部信息然后通过pooling取最大值或均值。pooling这步综合了局部特征失去了每个特征的位置信息。这很适合基于图像的任务比如要判断一幅图里有没有猫这种生物你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里词语在句子或是段落里出现的位置顺序都是很重要的信息。
2. 局部组合性CNN中每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。这在CV里很好理解像素组合成边缘边缘生成形状最后把各种形状组合起来得到复杂的物体表达。在语言里当然也有类似的组合关系但是远不如图像来的直接。而且在图像里相邻像素必须是相关的相邻的词语却未必相关。 2. 局部组合性CNN中每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。这在CV里很好理解像素组合成边缘边缘生成形状最后把各种形状组合起来得到复杂的物体表达。在语言里当然也有类似的组合关系但是远不如图像来的直接。而且在图像里相邻像素必须是相关的相邻的词语却未必相关。
## 5.27 CNN凸显共性的手段 ## 5.27 卷积神经网络凸显共性的方法?
### 5.27.1 局部连接 ### 5.27.1 局部连接
我们首先了解一个概念,感受野,即每个神经元仅与输入神经元相连接的一块区域。
感受视野每个神经元仅与输入神经元的一块区域连接这块局部区域称作感受野receptive field 在图像卷积操作中,神经元在空间维度上是局部连接,但在深度上是全连接。局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征;
在图像卷积操作中,即神经元在空间维度是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。
局部连接使网络可以提取数据的局部特征;
下图是一个很经典的图示,左边是全连接,右边是局部连接。 下图是一个很经典的图示,左边是全连接,右边是局部连接。
![image](./img/ch5/img63.png) ![image](./img/ch5/img63.png)
对于一个1000 × 1000的输入图像而言如果下一个隐藏层的神经元数目为10^6个采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数如此数目巨大的参数几乎难以训练而采用局部连接隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接那么此时的权值参数数量为10 × 10 × 10^6 = 10^8将直接减少4个数量级。 对于一个1000 × 1000的输入图像而言如果下一个隐藏层的神经元数目为10^6个采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数如此巨大的参数几乎难以训练而采用局部连接隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接那么此时的权值参数数量为10 × 10 × 10^6 = 10^8将直接减少4个数量级。
### 5.27.2 权值共享 ### 5.27.2 权值共享
权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。权值共享在一定程度上讲是有意义的,是由于在神经网络中,提取的底层边缘特征与其在图中的位置无关。但是在另一些场景中是无意的,如在人脸识别任务,我们期望在不同的位置学到不同的特征。
权重共享计算同一个深度切片的神经元时采用的滤波器是共享的。例如图4中计算o[:,:,0]的每个每个神经元的滤波器均相同都为W0这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的比如输入的图片是人脸眼睛和头发位于不同的位置希望在不同的位置学到不同的特征 (参考斯坦福大学公开课)。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的。 需要注意的是,权重只是对于同一深度切片的神经元是共享的。在卷积层中,通常采用多组卷积核提取不同的特征,即对应的是不同深度切片的特征,而不同深度切片的神经元权重是不共享。相反,偏置这一权值对于同一深度切片的所有神经元都是共享的。
权值共享带来的好处是大大降低了网络的训练难度。如下图假设在局部连接中隐藏层的每一个神经元连接的是一个10 × 10的局部图像因此有10 × 10个权值参数将这10 × 10个权值参数共享给剩下的神经元也就是说隐藏层中10^6个神经元的权值参数相同那么此时不管隐藏层神经元的数目是多少需要训练的参数就是这 10 × 10个权值参数也就是卷积核的大小
权值共享大大降低了网络的训练难度一个Filter只提取一个特征在整个图片或者语音文本 中进行卷积
尽管减少了几个数量级但参数数量依然较多。能不能再进一步减少呢方法就是权值共享。具体做法是在局部连接中隐藏层的每一个神经元连接的是一个10 × 10的局部图像因此有10 × 10个权值参数将这10 × 10个权值参数共享给剩下的神经元也就是说隐藏层中10^6个神经元的权值参数相同那么此时不管隐藏层神经元的数目是多少需要训练的参数就是这 10 × 10个权值参数也就是卷积核(也称滤波器)的大小),如下图。
![image](./img/ch5/img64.png) ![image](./img/ch5/img64.png)
大概就是CNN的一个神奇之处尽管只有这么少的参数依旧有出色的性能。但是这样仅提取了图像的一种特征如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像的不同映射下的特征称之为Feature Map。如果有100个卷积核最终的权值参数也仅为100 × 100 = 10^4个而已。另外偏置参数也是共享的同一种滤波器共享一个 里就体现了卷积神经网络的奇妙之处,使用少量的参数,却依然能有非常出色的性能。上述仅仅是提取图像一种特征的过程。如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像不同尺度下的特征称之为特征图feature map
### 5.27.3 池化操作 ### 5.27.3 池化操作
@ -770,34 +666,40 @@ http://blog.csdn.net/u010900574/article/details/51992156
![image](./img/ch5/img65.png) ![image](./img/ch5/img65.png)
### 5.28 全卷积与Local-Conv的异同点 ## 5.28 全卷积与Local-Conv的异同点
如果每一个点的处理使用相同的Filter则为全卷积如果使用不同的Filter则为Local-Conv。 如果每一个点的处理使用相同的Filter则为全卷积如果使用不同的Filter则为Local-Conv。
### 5.29 举例理解Local-Conv的作用 ## 5.29 举例理解Local-Conv的作用
并不是所有的卷积都会进行权重共享在某些特定任务中会使用不权重共享的卷积。下面通过人脸这一任务来进行讲解。在读人脸方向的一些paper时会发现很多都会在最后加入一个Local Connected Conv也就是不进行权重共享的卷积层。总的来说这一步的作用就是使用3D模型来将人脸对齐从而使CNN发挥最大的效果。
这个问题主要针对为什么很多做人脸的Paper会最后加入一个Local Connected Conv总体上说这一步的作用就是使用3D模型来将人脸对齐从而使CNN发挥最大的效果。
![image](./img/ch5/img66.png) ![image](./img/ch5/img66.png)
经过3D对齐以后形成的图像都是152×152的图像输入到上述网络结构中该结构的参数如下: 截取论文中的一部分图经过3D对齐以后形成的图像均是152×152输入到上述的网络结构中。该结构的参数如下:
* Conv32个11×11×3的卷积核max-pooling: 3×3 stride=2Conv: 16个9×9的卷积核。 Conv32个11×11×3的卷积核
* Local-Conv: 16个9×9的卷积核Local的意思是卷积核的参数不共享。
* Local-Conv: 16个7×7的卷积核参数不共享Local-Conv: 16个5×5的卷积核参数不共享
* Fully-connected: 4096维Softmax: 4030维。
前三层的目的在于提取低层次的特征比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的Max-pooling层因为太多的Max-pooling层会使得网络损失图像信息。 max-pooling: 3×3stride=2
后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因: Conv: 16个9×9的卷积核
1对齐的人脸图片中不同的区域会有不同的统计特征卷积的局部稳定性假设并不存在所以使用相同的卷积核会导致信息的丢失 Local-Conv: 16个9×9的卷积核
2不共享的卷积核并不增加抽取特征时的计算量而会增加训练时的计算量
3使用不共享的卷积核需要训练的参数量大大增加因而需要很大的数据量然而这个条件本文刚好满足。
全连接层将上一层的每个单元和本层的所有单元相连用来捕捉人脸图像不同位置的特征之间的相关性。其中第7层4096-d被用来表示人脸。 Local-Conv: 16个7×7的卷积核
Local-Conv: 16个5×5的卷积核
Fully-connected: 4096维
Softmax: 4030维。
前三层的目的在于提取低层次的特征比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但不能使用更多的Max-pooling层因为太多的Max-pooling层会使得网络损失图像信息。全连接层将上一层的每个单元和本层的所有单元相连用来捕捉人脸图像不同位置特征之间的相关性。最后使用softmax层用于人脸分类。
中间三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因:
1对齐的人脸图片中不同的区域会有不同的统计特征因此并不存在特征的局部稳定性所以使用相同的卷积核会导致信息的丢失。
2不共享的卷积核并不增加inference时特征的计算量仅会增加训练时的计算量。
使用不共享的卷积核,由于需要训练的参数量大大增加,因此往往需要通过其他方法增加数据量。
全连接层的输出可以用于Softmax的输入Softmax层用于分类。
## 5.30 简述卷积神经网络进化史 ## 5.30 简述卷积神经网络进化史

View File

@ -1,3 +1,7 @@
[TOC]
# 第六章 循环神经网络(RNN) # 第六章 循环神经网络(RNN)
Markdown Revision 2; Markdown Revision 2;
@ -10,8 +14,74 @@
Editor: 杨国峰-中国农业科学院 Editor: 杨国峰-中国农业科学院
Contact: tectalll@gmail.com Contact: tectalll@gmail.com
新增 https://blog.csdn.net/zhaojc1995/article/details/80572098
RNN发展简述?
为什么需要RNN?
RNN的结构及变体
标准RNN的前向输出流程?
RNN的训练方法——BPTT?
什么是长期依赖Long-Term Dependencies问题?
LSTM 网络是什么?
LSTM 的核心思想?
如何逐步理解LSTM?
常见的RNNs扩展和改进模型
RNN种类?
讲解CNN+RNN的各种组合方式 http://www.elecfans.com/d/775895.html
## CNN和RNN的对比 http://www.elecfans.com/d/775895.html
1、CNN卷积神经网络与RNN递归神经网络直观图
2、相同点
2.1. 传统神经网络的扩展。
2.2. 前向计算产生结果,反向计算模型更新。
2.3. 每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。
3、不同点
3.1. CNN空间扩展神经元与特征卷积RNN时间扩展神经元与多个时间输出计算
3.2. RNN可以用于描述时间上连续状态的输出有记忆功能CNN用于静态输出
3. 3. CNN高级100+深度RNN深度有限
http://blog.csdn.net/heyongluoyao8/article/details/48636251 http://blog.csdn.net/heyongluoyao8/article/details/48636251
## 6.1 为什么需要RNN
http://ai.51cto.com/art/201711/559441.htm
神经网络可以当做是能够拟合任意函数的黑盒子只要训练数据足够给定特定的x就能得到希望的y结构图如下
将神经网络模型训练好之后在输入层给定一个x通过网络之后就能够在输出层得到特定的y那么既然有了这么强大的模型为什么还需要RNN循环神经网络
他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
以nlp的一个最简单词性标注任务来说将我 吃 苹果 三个单词标注词性为 我/nn 吃/v 苹果/nn。
那么这个任务的输入就是:
我 吃 苹果 (已经分词好的句子)
这个任务的输出是:
我/nn 吃/v 苹果/nn(词性标注好的句子)
对于这个任务来说,我们当然可以直接用普通的神经网络来做,给网络的训练数据格式了就是我-> 我/nn 这样的多个单独的单词->词性标注好的单词。
但是很明显,一个句子中,前一个单词其实对于当前单词的词性预测是有很大影响的,比如预测苹果的时候,由于前面的吃是一个动词,那么很显然苹果作为名词的概率就会远大于动词的概率,因为动词后面接名词很常见,而动词后面接动词很少见。
所以为了解决一些这样类似的问题能够更好的处理序列的信息RNN就诞生了。
## 6.1 RNN种类
https://www.cnblogs.com/rucwxb/p/8047401.html
1. sequence-to-sequence输入输出都是一个序列。例如股票预测中的RNN输入是前N天价格输出明天的股市价格。
2. sequence-to-vector输入是一个序列输出单一向量。
3. vector-to-sequence输入单一向量输出一个序列。
4.Encoder-Decoder输入sequence-to-vector称作encoder输出vector-to-sequence称作decoder。
这是一个delay模型经过一段延迟即把所有输入都读取后在decoder中获取输入并输出一个序列。这个模型在机器翻译中使用较广泛源语言输在入放入encoder浓缩在状态信息中生成目标语言时可以生成一个不长度的目标语言序列。
## RNN train的时候Loss波动很大
https://www.jianshu.com/p/30b253561337
由于RNN特有的memory会影响后期其他的RNN的特点梯度时大时小learning rate没法个性化的调整导致RNN在train的过程中Loss是震荡起伏的……
为了解决RNN的这个问题在train的时候可以有个clipping的方式当梯度大于某个临界值直接截断用这个临界值作为梯度的大小防止飞出去…居然还能这么操作66666
## 6.1 RNNs和FNNs有什么区别 ## 6.1 RNNs和FNNs有什么区别
1. 不同于传统的前馈神经网络(FNNs)RNNs引入了定向循环能够处理输入之间前后关联问题。 1. 不同于传统的前馈神经网络(FNNs)RNNs引入了定向循环能够处理输入之间前后关联问题。

View File

@ -1,38 +0,0 @@
# 什么是生成对抗网络
## GAN的通俗化介绍
生成对抗网络(GAN, Generative adversarial network)自从2014年被Ian Goodfellow提出以来掀起来了一股研究热潮。GAN由生成器和判别器组成生成器负责生成样本判别器负责判断生成器生成的样本是否为真。生成器要尽可能迷惑判别器而判别器要尽可能区分生成器生成的样本和真实样本。
在GAN的原作[1]中,作者将生成器比喻为印假钞票的犯罪分子,判别器则类比为警察。犯罪分子努力让钞票看起来逼真,警察则不断提升对于假钞的辨识能力。二者互相博弈,随着时间的进行,都会越来越强。
# GAN的形式化表达
上述例子只是简要介绍了一下GAN的思想下面对于GAN做一个形式化的更加具体的定义。通常情况下无论是生成器还是判别器我们都可以用神经网络来实现。那么我们可以把通俗化的定义用下面这个模型来表示
![GAN网络结构](/images/7.1-gan_structure.png)
上述模型左边是生成器G其输入是$$z$$对于原始的GAN$$z$$是由高斯分布随机采样得到的噪声。噪声$$z$$通过生成器得到了生成的假样本。
生成的假样本与真实样本放到一起被随机抽取送入到判别器D由判别器去区分输入的样本是生成的假样本还是真实的样本。整个过程简单明了生成对抗网络中的“生成对抗”主要体现在生成器和判别器之间的对抗。
# GAN的目标函数
对于上述神经网络模型如果想要学习其参数首先需要一个目标函数。GAN的目标函数定义如下
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$
这个目标函数可以分为两个部分来理解:
判别器的优化通过$$\mathop {\max}\limits_D V(D,G)$$实现,$$V(D,G)$$为判别器的目标函数,其第一项$${{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)]$$表示对于从真实数据分布 中采用的样本 ,其被判别器判定为真实样本概率的数学期望。对于真实数据分布 中采样的样本其预测为正样本的概率当然是越接近1越好。因此希望最大化这一项。第二项$${{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$表示对于从噪声P_z(z)分布当中采样得到的样本经过生成器生成之后得到的生成图片,然后送入判别器,其预测概率的负对数的期望,这个值自然是越大越好,这个值越大, 越接近0也就代表判别器越好。
生成器的优化通过$$\mathop {\min }\limits_G({\mathop {\max }\limits_D V(D,G)})$$实现。注意,生成器的目标不是$$\mathop {\min }\limits_GV(D,G)$$,即生成器**不是最小化判别器的目标函数**,生成器最小化的是**判别器目标函数的最大值**判别器目标函数的最大值代表的是真实数据分布与生成数据分布的JS散度(详情可以参阅附录的推导)JS散度可以度量分布的相似性两个分布越接近JS散度越小。
# GAN的目标函数和交叉熵
判别器目标函数写成离散形式即为$$V(D,G)=-\frac{1}{m}\sum_{i=1}^{i=m}logD(x^i)-\frac{1}{m}\sum_{i=1}^{i=m}log(1-D(\tilde{x}^i))$$
可以看出,这个目标函数和交叉熵是一致的,即**判别器的目标是最小化交叉熵损失生成器的目标是最小化生成数据分布和真实数据分布的JS散度**
-------------------
[1]: Goodfellow, Ian, et al. "Generative adversarial nets." Advances in neural information processing systems. 2014.
[2]

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

View File

@ -3,12 +3,11 @@
### 深度学习500问-第 * 章 xxx ### 深度学习500问-第 * 章 xxx
**负责人(排名不分先后):** **负责人(排名不分先后):**
xxx研究生-xxxxxx 牛津大学博士生-程泽华
xxx博士生-xxx 中科院研究生-郭晓锋
xxx-xxx
**贡献者(排名不分先后):** **贡献者(排名不分先后):**
内容贡献者可自加信息 内容贡献者可自加信息
########################################################### ###########################################################

View File

@ -18,6 +18,32 @@
volume={1711}, volume={1711},
year={2017} year={2017}
} }
@article{isola2017image,
title={Image-to-image translation with conditional adversarial networks},
author={Isola, Phillip and Zhu, Jun-Yan and Zhou, Tinghui and Efros, Alexei A},
journal={arXiv preprint},
year={2017}
}
@article{radford2015unsupervised,
title={Unsupervised representation learning with deep convolutional generative adversarial networks},
author={Radford, Alec and Metz, Luke and Chintala, Soumith},
journal={arXiv preprint arXiv:1511.06434},
year={2015}
}
@inproceedings{long2015fully,
title={Fully convolutional networks for semantic segmentation},
author={Long, Jonathan and Shelhamer, Evan and Darrell, Trevor},
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
pages={3431--3440},
year={2015}
}
@article{murez2017image,
title={Image to image translation for domain adaptation},
author={Murez, Zak and Kolouri, Soheil and Kriegman, David and Ramamoorthi, Ravi and Kim, Kyungnam},
journal={arXiv preprint arXiv:1712.00479},
volume={13},
year={2017}
}
@inproceedings{yi2017dualgan, @inproceedings{yi2017dualgan,
title={DualGAN: Unsupervised Dual Learning for Image-to-Image Translation.}, title={DualGAN: Unsupervised Dual Learning for Image-to-Image Translation.},
author={Yi, Zili and Hao (Richard) Zhang and Tan, Ping and Gong, Minglun}, author={Yi, Zili and Hao (Richard) Zhang and Tan, Ping and Gong, Minglun},

View File

@ -1,24 +1,170 @@
# 第七章_生成对抗网络(GAN)
## GAN的「生成」的本质是什么 #
# 7.1 什么是生成对抗网络
## GAN的通俗化介绍
生成对抗网络(GAN, Generative adversarial network)自从2014年被Ian Goodfellow提出以来掀起来了一股研究热潮。GAN由生成器和判别器组成生成器负责生成样本判别器负责判断生成器生成的样本是否为真。生成器要尽可能迷惑判别器而判别器要尽可能区分生成器生成的样本和真实样本。
在GAN的原作[1]中,作者将生成器比喻为印假钞票的犯罪分子,判别器则类比为警察。犯罪分子努力让钞票看起来逼真,警察则不断提升对于假钞的辨识能力。二者互相博弈,随着时间的进行,都会越来越强。
## GAN的形式化表达
上述例子只是简要介绍了一下GAN的思想下面对于GAN做一个形式化的更加具体的定义。通常情况下无论是生成器还是判别器我们都可以用神经网络来实现。那么我们可以把通俗化的定义用下面这个模型来表示
![GAN网络结构](./img/ch7/7.1-gan_structure.png)
上述模型左边是生成器G其输入是$z$对于原始的GAN$z$是由高斯分布随机采样得到的噪声。噪声$z$通过生成器得到了生成的假样本。
生成的假样本与真实样本放到一起被随机抽取送入到判别器D由判别器去区分输入的样本是生成的假样本还是真实的样本。整个过程简单明了生成对抗网络中的“生成对抗”主要体现在生成器和判别器之间的对抗。
## GAN的目标函数
对于上述神经网络模型如果想要学习其参数首先需要一个目标函数。GAN的目标函数定义如下
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$
这个目标函数可以分为两个部分来理解:
判别器的优化通过$\mathop {\max}\limits_D V(D,G)$实现,$V(D,G)$为判别器的目标函数,其第一项${{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)]$表示对于从真实数据分布 中采用的样本 ,其被判别器判定为真实样本概率的数学期望。对于真实数据分布 中采样的样本其预测为正样本的概率当然是越接近1越好。因此希望最大化这一项。第二项${{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$表示对于从噪声P_z(z)分布当中采样得到的样本经过生成器生成之后得到的生成图片,然后送入判别器,其预测概率的负对数的期望,这个值自然是越大越好,这个值越大, 越接近0也就代表判别器越好。
生成器的优化通过$\mathop {\min }\limits_G({\mathop {\max }\limits_D V(D,G)})$实现。注意,生成器的目标不是$\mathop {\min }\limits_GV(D,G)$,即生成器**不是最小化判别器的目标函数**,生成器最小化的是**判别器目标函数的最大值**判别器目标函数的最大值代表的是真实数据分布与生成数据分布的JS散度(详情可以参阅附录的推导)JS散度可以度量分布的相似性两个分布越接近JS散度越小。
## GAN的目标函数和交叉熵
判别器目标函数写成离散形式即为$$V(D,G)=-\frac{1}{m}\sum_{i=1}^{i=m}logD(x^i)-\frac{1}{m}\sum_{i=1}^{i=m}log(1-D(\tilde{x}^i))$$
可以看出,这个目标函数和交叉熵是一致的,即**判别器的目标是最小化交叉熵损失生成器的目标是最小化生成数据分布和真实数据分布的JS散度**
-------------------
[1]: Goodfellow, Ian, et al. "Generative adversarial nets." Advances in neural information processing systems. 2014.
# 7.2 什么是图像翻译
GAN作为一种强有力的生成模型其应用十分广泛。最为常见的应用就是图像翻译。所谓图像翻译指从一副图像到另一副图像的转换。可以类比机器翻译一种语言转换为另一种语言。常见的图像翻译任务有
- 图像去噪
- 图像超分辨
- 图像补全
- 风格迁移
- ...
本节将介绍一个经典的图像翻译网络及其改进。
# 7.2.1 pix2pix:图像翻译
在这篇paper里面作者提出的框架十分简洁优雅好用的算法总是简洁优雅的。相比以往算法的大量专家知识手工复杂的loss。这篇paper非常粗暴使用CGAN处理了一系列的转换问题。下面是一些转换示例
![pix2pix结果示例](./img/ch7/pix2pix结果示例.png)
上面展示了许多有趣的结果,比如分割图$\longrightarrow$街景图,边缘图$\longrightarrow$真实图。对于第一次看到的时候还是很惊艳的,那么这个是怎么做到的呢?我们可以设想一下,如果是我们,我们自己会如何设计这个网络。
## 如何做图像翻译?
最直接的想法就是设计一个CNN网络直接建立输入-输出的映射,就像图像去噪问题一样。可是对于上面的问题,这样做会带来一个问题。**生成图像质量不清晰。**
拿左上角的分割图$\longrightarrow$街景图为例,语义分割图的每个标签比如“汽车”可能对应不同样式,颜色的汽车。那么模型学习到的会是所有不同汽车的评均,这样会造成模糊。![pix2pix语义地图L1loss结果](./img/ch7/pix2pix语义地图L1loss结果.png)
## 如何解决模糊呢?
这里作者想了一个办法即加入GAN的Loss去惩罚模型。GAN相比于传统生成式模型可以较好的生成高分辨率图片。思路也很简单在上述直观想法的基础上加入一个判别器判断输入图片是否是真实样本。模型示意图如下
![pix2pix模型示意图](./img/ch7/pix2pix模型示意图.png)
上图模型和CGAN有所不同但它是一个CGAN只不过输入只有一个这个输入就是条件信息。原始的CGAN需要输入随机噪声以及条件。这里之所有没有输入噪声信息是因为在实际实验中如果输入噪声和条件噪声往往被淹没在条件C当中所以这里直接省去了。
## 图像翻译的tricks
从上面两点可以得到最终的Loss由两部分构成
- 输出和标签信息的L1 Loss。
- GAN Loss
- 测试也使用Dropout以使输出多样化
![pix2pix Loss](./img/ch7/pix2pix_Loss.png)
采用L1 Loss而不是L2 Loss的理由很简单L1 Loss相比于L2 Loss保边缘L2 Loss基于高斯先验L1 Loss基于拉普拉斯先验
GAN Loss为LSGAN的最小二乘Loss并使用PatchGAN(进一步保证生成图像的清晰度)。PatchGAN将图像换分成很多个Patch并对每一个Patch使用判别器进行判别实际代码实现有更取巧的办法将所有Patch的Loss求平均作为最终的Loss。
# 7.2.2 pix2pixHD高分辨率图像生成
这篇paper作为pix2pix改进版本如其名字一样主要是可以产生高分辨率的图像。具体来说作者的贡献主要在以下两个方面
- 使用多尺度的生成器以及判别器等方式从而生成高分辨率图像。
- 使用了一种非常巧妙的方式,实现了对于同一个输入,产生不同的输出。并且实现了交互式的语义编辑方式
## 如何生成高分辨率图像
为了生成高分辨率图像,作者主要从三个层面做了改进:
- 模型结构
- Loss设计
- 使用Instance-map的图像进行训练。
### 模型结构
![pix2pixHD生成器结构](./img/ch7/pix2pixHD网络结构.png)
生成器由两部分组成G1和G2其中G2又被割裂成两个部分。G1和pix2pix的生成器没有差别就是一个end2end的U-Net结构。G2的左半部分提取特征并和G1的输出层的前一层特征进行相加融合信息把融合后的信息送入G2的后半部分输出高分辨率图像。
判别器使用多尺度判别器在三个不同的尺度上进行判别并对结果取平均。判别的三个尺度为原图原图的1/2降采样原图的1/4降采样。显然越粗糙的尺度感受野越大越关注全局一致性。
生成器和判别器均使用多尺度结构实现高分辨率重建思路和PGGAN类似但实际做法差别比较大。
### Loss设计
这里的Loss由三部分组成
- GAN loss和pix2pix一样使用PatchGAN。
- Feature matching loss将生成的样本和Ground truth分别送入判别器提取特征然后对特征做Element-wise loss
- Content loss将生成的样本和Ground truth分别送入VGG16提取特征然后对特征做Element-wise loss
![pix2pixHD Loss](./img/ch7/pix2pixHD_Loss.png)
使用Feature matching loss和Content loss计算特征的loss而不是计算生成样本和Ground truth的MSE主要在于MSE会造成生成的图像过度平滑缺乏细节。Feature matching loss和Content loss只保证内容一致细节则由GAN去学习。
### 使用Instance-map的图像进行训练
pix2pix采用语义分割的结果进行训练可是语义分割结果没有对同类物体进行区分导致多个同一类物体排列在一起的时候出现模糊这在街景图中尤为常见。在这里作者使用个体分割Instance-level segmention的结果来进行训练因为个体分割的结果提供了同一类物体的边界信息。具体做法如下
- 根据个体分割的结果求出Boundary map
- 将Boundary map与输入的语义标签concatnate到一起作为输入
Boundary map求法很简单直接遍历每一个像素判断其4邻域像素所属语义类别信息如果有不同则置为1。下面是一个示例
![Boundary map](./img/ch7/Boundary_map.png)
### 语义编辑
不同于pix2pix实现生成多样性的方法使用Dropout这里采用了一个非常巧妙的办法即学习一个条件(Condition)作为条件GAN的输入不同的输入条件就得到了不同的输出从而实现了多样化的输出而且还是可编辑的。具体做法如下
![语义编辑](./img/ch7/语义编辑.png)
- 首先训练一个编码器
- 利用编码器提取原始图片的特征然后根据Labels信息进行Average pooling得到特征上图的Features。这个Features的每一类像素的值都代表了这类标签的信息。
- 如果输入图像有足够的多那么Features的每一类像素的值就代表了这类物体的先验分布。
- 对所有输入的训练图像通过编码器提取特征然后进行K-means聚类得到K个聚类中心以K个聚类中心代表不同的颜色纹理等信息。
- 实际生成图像时除了输入语义标签信息还要从K个聚类中心随机选择一个即选择一个颜色/纹理风格
这个方法总的来说非常巧妙,通过学习数据的隐变量达到控制图像颜色纹理风格信息。
### 总结
作者主要的贡献在于:
- 提出了生成高分辨率图像的多尺度网络结构,包括生成器,判别器
- 提出了Feature loss和VGG loss提升图像的分辨率
- 通过学习隐变量达到控制图像颜色,纹理风格信息
- 通过Boundary map提升重叠物体的清晰度
可以看出这篇paper除了第三点都是针对性的解决高分辨率图像生成的问题的。可是本篇工作只是生成了高分辨率的图像那对于视频呢接下来会介绍Vid2Vid这篇paper站在pix2pixHD的基础上继续做了许多拓展特别是针对视频前后帧不一致的问题做了许多优化。
# 7.2.3 vid2vid高分辨率视频生成
待续。。。。
## 7.1 GAN的「生成」的本质是什么
GAN的形式是两个网络GGenerator和DDiscriminator。Generator是一个生成图片的网络它接收一个随机的噪声z记做G(z)。Discriminator是一个判别网络判别一张图片是不是“真实的”。它的输入是xx代表一张图片输出Dx代表x为真实图片的概率如果为1就代表100%是真实的图片而输出为0就代表不可能是真实的图片。 GAN的形式是两个网络GGenerator和DDiscriminator。Generator是一个生成图片的网络它接收一个随机的噪声z记做G(z)。Discriminator是一个判别网络判别一张图片是不是“真实的”。它的输入是xx代表一张图片输出Dx代表x为真实图片的概率如果为1就代表100%是真实的图片而输出为0就代表不可能是真实的图片。
GAN*生成*能力是*学习分布*引入的latent variable的noise使习得的概率分布进行偏移。因此在训练GAN的时候latent variable**不能**引入均匀分布uniform distribution),因为均匀分布的数据的引入并不会改变概率分布。 GAN*生成*能力是*学习分布*引入的latent variable的noise使习得的概率分布进行偏移。因此在训练GAN的时候latent variable**不能**引入均匀分布uniform distribution),因为均匀分布的数据的引入并不会改变概率分布。
## GAN能做数据增广吗 ## 7.2 GAN能做数据增广吗
GAN能够从一个模型引入一个随机数之后「生成」无限的output用GAN来做数据增广似乎很有吸引力并且是一个极清晰的一个insight。然而纵观整个GAN的训练过程Generator习得分布再引入一个Distribution(Gaussian或其他)的噪声以「骗过」Discriminator并且无论是KL Divergence或是Wasserstein Divergence本质还是信息衡量的手段在本章中其余部分介绍能「骗过」Discriminator的Generator一定是能在引入一个Distribution的噪声的情况下最好的结合已有信息。 GAN能够从一个模型引入一个随机数之后「生成」无限的output用GAN来做数据增广似乎很有吸引力并且是一个极清晰的一个insight。然而纵观整个GAN的训练过程Generator习得分布再引入一个Distribution(Gaussian或其他)的噪声以「骗过」Discriminator并且无论是KL Divergence或是Wasserstein Divergence本质还是信息衡量的手段在本章中其余部分介绍能「骗过」Discriminator的Generator一定是能在引入一个Distribution的噪声的情况下最好的结合已有信息。
训练好的GAN应该能够很好的使用已有的数据的信息特征或分布现在问题来了这些信息本来就包含在数据里面有必要把信息丢到Generator学习使得的结果加上噪声作为训练模型的输入吗 训练好的GAN应该能够很好的使用已有的数据的信息特征或分布现在问题来了这些信息本来就包含在数据里面有必要把信息丢到Generator学习使得的结果加上噪声作为训练模型的输入吗
## VAE与GAN有什么不同 ## 7.3 VAE与GAN有什么不同
1. VAE可以直接用在离散型数据。 1. VAE可以直接用在离散型数据。
2. VAE整个训练流程只靠一个假设的loss函数和KL Divergence逼近真实分布。GAN没有假设单个loss函数, 而是让判别器D和生成器G互相博弈以期得到Nash Equilibrium。 2. VAE整个训练流程只靠一个假设的loss函数和KL Divergence逼近真实分布。GAN没有假设单个loss函数, 而是让判别器D和生成器G互相博弈以期得到Nash Equilibrium。
## 有哪些优秀的GAN ## 7.4 有哪些优秀的GAN
### DCGAN ### 7.4.1 DCGAN
### WGAN/WGAN-GP [DCGAN](http://arxiv.org/abs/1511.06434)是GAN较为早期的「生成」效果最好的GAN了很多人用DCGAN的简单、有效的生成能力做了很多很皮的工作比如[GAN生成二次元萌妹](https://blog.csdn.net/liuxiao214/article/details/74502975)之类。
关于DCGAN主要集中讨论以下问题
1. DCGAN的contribution
2. DCGAN实操上有什么问题
效果好个人主要认为是引入了卷积并且给了一个非常优雅的结构DCGAN的Generator和Discriminator几乎是**对称的**而之后很多研究都遵从了这个对称结构如此看来学界对这种对称架构有极大的肯定。完全使用了卷积层代替全链接层没有pooling和upsample。其中upsample是将low resolution到high resolution的方法而DCGAN用卷积的逆运算来完成low resolution到high resolution的操作这简单的替换为什么成为提升GAN稳定性的原因?
![Upsample原理](./img/ch7/upsample.png)
图中是Upsample的原理图十分的直观宛如低分屏换高分屏。然而Upsample和逆卷积最大的不一样是Upsample其实只能放一样的颜色来填充而逆卷积它是个求值的过程也就是它要算出一个具体值来,可能是一样的也可能是不一样的——如此,孰优孰劣高下立判。
DCGAN提出了其生成的特征具有向量的计算特性。
[DCGAN Keras实现](https://github.com/jacobgil/keras-dcgan)
### 7.4.2 WGAN/WGAN-GP
WGAN及其延伸是被讨论的最多的部分原文连发两文第一篇(Towards principled methods for training generative adversarial networks)非常solid的提了一堆的数学一作Arjovsky克朗所的数学能力果然一个打十几个。后来给了第二篇Wasserstein GAN可以说直接给结果了和第一篇相比第二篇更加好接受。 WGAN及其延伸是被讨论的最多的部分原文连发两文第一篇(Towards principled methods for training generative adversarial networks)非常solid的提了一堆的数学一作Arjovsky克朗所的数学能力果然一个打十几个。后来给了第二篇Wasserstein GAN可以说直接给结果了和第一篇相比第二篇更加好接受。
@ -44,7 +190,7 @@ $$JS(P_1||P_2)=\frac{1}{2}KL(P_1||\frac{P_1+P_2}{2})$$
3. 对更新后的权重强制截断到一定范围内,比如[-0.010.01]以满足lipschitz连续性条件。 3. 对更新后的权重强制截断到一定范围内,比如[-0.010.01]以满足lipschitz连续性条件。
4. 论文中也推荐使用SGDRMSprop等优化器不要基于使用动量的优化算法比如adam。 4. 论文中也推荐使用SGDRMSprop等优化器不要基于使用动量的优化算法比如adam。
然而由于D和G其实是各自有一个loss的G和D是可以**用不同的优化器**的。个人认为Best Practice是G用SGD或RMSprop而D用Adam。 然而由于D和G其实是各自有一个loss的G和D是可以**用不同的优化器**的。个人认为Best Practice是G用SGD或RMSprop而D用Adam。
很期待未来有专门针对寻找均衡态的优化方法。 很期待未来有专门针对寻找均衡态的优化方法。
@ -53,49 +199,205 @@ $$JS(P_1||P_2)=\frac{1}{2}KL(P_1||\frac{P_1+P_2}{2})$$
**如何理解Wasserstein距离** **如何理解Wasserstein距离**
Wasserstein距离与optimal transport有一些关系并且从数学上想很好的理解需要一定的测度论的知识。 Wasserstein距离与optimal transport有一些关系并且从数学上想很好的理解需要一定的测度论的知识。
### condition GAN ### 7.4.3 condition GAN
条件生成对抗网络CGAN, Conditional Generative Adversarial Networks作为一个GAN的改进其一定程度上解决了GAN生成结果的不确定性。如果在Mnist数据集上训练原始GANGAN生成的图像是完全不确定的具体生成的是数字1还是2还是几根本不可控。为了让生成的数字可控我们可以把数据集做一个切分把数字0~9的数据集分别拆分开训练9个模型不过这样太麻烦了也不现实。因为数据集拆分不仅仅是分类麻烦更主要在于每一个类别的样本少拿去训练GAN很有可能导致欠拟合。因此CGAN就应运而生了。我们先看一下CGAN的网络结构
### InfoGAN ![CGAN网络结构](./img/ch7/CGAN网络结构.png)
从网络结构图可以看到对于生成器Generator其输入不仅仅是随机噪声的采样z还有欲生成图像的标签信息。比如对于mnist数据生成就是一个one-hot向量某一维度为1则表示生成某个数字的图片。同样地判别器的输入也包括样本的标签。这样就使得判别器和生成器可以学习到样本和标签之间的联系。Loss如下
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x|y)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z|y)))]$$
Loss设计和原始GAN基本一致只不过生成器判别器的输入数据是一个条件分布。在具体编程实现时只需要对随机噪声采样z和输入条件y做一个级联即可。
### 7.4.4 InfoGAN
通过最大化互信息cc来生成同类别的样本。 通过最大化互信息cc来生成同类别的样本。
$$L^{infoGAN}_{D,Q}=L^{GAN}_D-\lambda L_1(c,c')$$ $$L^{infoGAN}_{D,Q}=L^{GAN}_D-\lambda L_1(c,c')$$
$$L^{infoGAN}_{G}=L^{GAN}_G-\lambda L_1(c,c')$$ $$L^{infoGAN}_{G}=L^{GAN}_G-\lambda L_1(c,c')$$
### CycleGAN ### 7.4.5 CycleGAN
**CycleGAN与DualGAN之间的区别** **CycleGAN与DualGAN之间的区别**
### StarGAN ### 7.4.6 StarGAN
目前Image-to-Image Translation做的最好的GAN。 目前Image-to-Image Translation做的最好的GAN。
## Self-Attention GAN ## 7.5 GAN训练有什么难点
由于GAN的收敛要求**两个网络D&G同时达到一个均衡**
## GAN训练有什么难点 ## 7.6 GAN与强化学习中的AC网络有何区别
由于GAN的收敛要求**两个网络D&G同时达到一个均衡**
## GAN与强化学习中的AC网络有何区别
强化学习中的AC网络也是Dual Network似乎从某个角度上理解可以为一个GAN。但是GAN本身 强化学习中的AC网络也是Dual Network似乎从某个角度上理解可以为一个GAN。但是GAN本身
## GAN的可创新的点
GAN是一种半监督学习模型对训练集不需要太多有标签的数据。
## 如何训练GAN ## 7.7 GAN的可创新的点
GAN是一种半监督学习模型对训练集不需要太多有标签的数据。我认为GAN用在Super Resolution、Inpainting、Image-to-Image Translation俗称鬼畜变脸也好无非是以下三点
1. 更高效的无监督的利用卷积结构或者结合网络结构的特点对特征进行**复用**。如Image-to-Image Translation提取特征之后用loss量化特征及其share的信息以完成整个特征复用过程)
2. 一个高效的loss function来**量化变化**。
3. 一个短平快的拟合分布的方法。如WGAN对GAN的贡献等
当然还有一些非主流的方案比如说研究latent space甚至如何优雅的加噪声这类方案虽然很重要但是囿于本人想象力及实力不足,难以想到解决方案。
## 7.8 如何训练GAN
判别器D在GAN训练中是比生成器G更强的网络 判别器D在GAN训练中是比生成器G更强的网络
Instance Norm比Batch Norm的效果要更好。 Instance Norm比Batch Norm的效果要更好。
使用逆卷积来生成图片会比用全连接层效果好,全连接层会有较多的噪点,逆卷积层效果清晰。 使用逆卷积来生成图片会比用全连接层效果好,全连接层会有较多的噪点,逆卷积层效果清晰。
## GAN如何解决NLP问题 ## 7.9 GAN如何解决NLP问题
GAN只适用于连续型数据的生成对于离散型数据效果不佳因此假如NLP方法直接应用的是character-wise的方案Gradient based的GAN是无法将梯度Back propagationBP给生成网络的因此从训练结果上看GAN中G的表现长期被D压着打。 GAN只适用于连续型数据的生成对于离散型数据效果不佳因此假如NLP方法直接应用的是character-wise的方案Gradient based的GAN是无法将梯度Back propagationBP给生成网络的因此从训练结果上看GAN中G的表现长期被D压着打。
## Reference ## 7.10 Reference
### DCGAN部分
### DCGAN部分
* Radford, A., Metz, L., & Chintala, S. (2015). Unsupervised representation learning with deep convolutional generative adversarial networks. arXiv preprint arXiv:1511.06434.
* Long, J., Shelhamer, E., & Darrell, T. (2015). Fully convolutional networks for semantic segmentation. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 3431-3440).
* [可视化卷积操作](https://github.com/vdumoulin/conv_arithmetic)
### WGAN部分 ### WGAN部分
* Arjovsky, M., & Bottou, L. (2017). Towards principled methods for training generative adversarial networks. arXiv preprint arXiv:1701.04862.
* Arjovsky, M., Chintala, S., & Bottou, L. (2017). Wasserstein gan. arXiv preprint arXiv:1701.07875. * Arjovsky, M., Chintala, S., & Bottou, L. (2017). Wasserstein gan. arXiv preprint arXiv:1701.07875.
* Nowozin, S., Cseke, B., & Tomioka, R. (2016). f-gan: Training generative neural samplers using variational divergence minimization. In Advances in Neural Information Processing Systems (pp. 271-279). * Nowozin, S., Cseke, B., & Tomioka, R. (2016). f-gan: Training generative neural samplers using variational divergence minimization. In Advances in Neural Information Processing Systems (pp. 271-279).
* Wu, J., Huang, Z., Thoma, J., Acharya, D., & Van Gool, L. (2018, September). Wasserstein Divergence for GANs. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 653-668). * Wu, J., Huang, Z., Thoma, J., Acharya, D., & Van Gool, L. (2018, September). Wasserstein Divergence for GANs. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 653-668).
### CycleGAN
Zhu, J. Y., Park, T., Isola, P., & Efros, A. A. (2017). Unpaired image-to-image translation using cycle-consistent adversarial networks. arXiv preprint. ### Image2Image Translation
* Isola P, Zhu JY, Zhou T, Efros AA. Image-to-image translation with conditional adversarial networks. arXiv preprint. 2017 Jul 21.
* Zhu, J. Y., Park, T., Isola, P., & Efros, A. A. (2017). Unpaired image-to-image translation using cycle-consistent adversarial networks. arXiv preprint.CycleGAN)
* Choi, Y., Choi, M., Kim, M., Ha, J. W., Kim, S., & Choo, J. (2017). Stargan: Unified generative adversarial networks for multi-domain image-to-image translation. arXiv preprint, 1711.
* Murez, Z., Kolouri, S., Kriegman, D., Ramamoorthi, R., & Kim, K. (2017). Image to image translation for domain adaptation. arXiv preprint arXiv:1712.00479, 13.
### GAN的训练
* Arjovsky, M., & Bottou, L. (2017). Towards principled methods for training generative adversarial networks. arXiv preprint arXiv:1701.04862.
# 生成模型和判别模型
https://blog.csdn.net/u010358304/article/details/79748153
原文https://blog.csdn.net/u010089444/article/details/78946039
# 生成模型和判别模型对比
https://blog.csdn.net/love666666shen/article/details/75522489
# 直观理解GAN的博弈过程
https://blog.csdn.net/u010089444/article/details/78946039
# GAN原理
1.GAN的原理
GAN的主要灵感来源于博弈论中零和博弈的思想应用到深度学习神经网络上来说就是通过生成网络GGenerator和判别网络DDiscriminator不断博弈进而使G学习到数据的分布如果用到图片生成上则训练完成后G可以从一段随机数中生成逼真的图像。G D的主要功能是
● G是一个生成式的网络它接收一个随机的噪声z随机数通过这个噪声生成图像
● D是一个判别网络判别一张图片是不是“真实的”。它的输入参数是xx代表一张图片输出Dx代表x为真实图片的概率如果为1就代表100%是真实的图片而输出为0就代表不可能是真实的图片
训练过程中生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量辨别出G生成的假图像和真实的图像。这样G和D构成了一个动态的“博弈过程”最终的平衡点即纳什均衡点.
---------------------
作者山水之间2018
来源CSDN
原文https://blog.csdn.net/Gavinmiaoc/article/details/79947877
# GAN的特点
2. GAN的特点
● 相比较传统的模型,他存在两个不同的网络,而不是单一的网络,并且训练方式采用的是对抗训练方式
● GAN中G的梯度更新信息来自判别器D而不是来自数据样本
# GAN优缺点?
3. GAN 的优点:
以下部分摘自ian goodfellow 在Quora的问答
● GAN是一种生成式模型相比较其他生成模型玻尔兹曼机和GSNs只用到了反向传播,而不需要复杂的马尔科夫链
● 相比其他所有模型, GAN可以产生更加清晰真实的样本
● GAN采用的是一种无监督的学习方式训练可以被广泛用在无监督学习和半监督学习领域
● 相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊
● 相比VAE, GANs没有变分下界,如果鉴别器训练良好,那么生成器可以完美的学习到训练样本的分布.换句话说,GANs是渐进一致的,但是VAE是有偏差的
● GAN应用到一些场景上比如图片风格迁移超分辨率图像补全去噪避免了损失函数设计的困难不管三七二十一只要有一个的基准直接上判别器剩下的就交给对抗训练了。
4. GAN的缺点
● 训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但我认为在实践中它还是比训练玻尔兹曼机稳定的多
● GAN不适合处理离散形式的数据比如文本
● GAN存在训练不稳定、梯度消失、模式崩溃的问题目前已解决
---------------------
作者山水之间2018
来源CSDN
原文https://blog.csdn.net/Gavinmiaoc/article/details/79947877
版权声明:本文为博主原创文章,转载请附上博文链接!
# 模式崩溃(model collapse)原因
一般出现在GAN训练不稳定的时候具体表现为生成出来的结果非常差但是即使加长训练时间后也无法得到很好的改善。
具体原因可以解释如下GAN采用的是对抗训练的方式G的梯度更新来自D所以G生成的好不好得看D怎么说。具体就是G生成一个样本交给D去评判D会输出生成的假样本是真样本的概率0-1相当于告诉G生成的样本有多大的真实性G就会根据这个反馈不断改善自己提高D输出的概率值。但是如果某一次G生成的样本可能并不是很真实但是D给出了正确的评价或者是G生成的结果中一些特征得到了D的认可这时候G就会认为我输出的正确的那么接下来我就这样输出肯定D还会给出比较高的评价实际上G生成的并不怎么样但是他们两个就这样自我欺骗下去了导致最终生成结果缺失一些信息特征不全。
---------------------
作者山水之间2018
来源CSDN
原文https://blog.csdn.net/Gavinmiaoc/article/details/79947877
版权声明:本文为博主原创文章,转载请附上博文链接!
# 为什么GAN不适合处理文本数据
1. 文本数据相比较图片数据来说是离散的因为对于文本来说通常需要将一个词映射为一个高维的向量最终预测的输出是一个one-hot向量假设softmax的输出是0.2 0.3 0.10.20.150.05那么变为onehot是010000如果softmax输出是0.2 0.25 0.2 0.10.150.1 one-hot仍然是0 1 0 0 0 0所以对于生成器来说G输出了不同的结果但是D给出了同样的判别结果并不能将梯度更新信息很好的传递到G中去所以D最终输出的判别没有意义。
2. 另外就是GAN的损失函数是JS散度JS散度不适合衡量不想交分布之间的距离。
WGAN虽然使用wassertein距离代替了JS散度但是在生成文本上能力还是有限GAN在生成文本上的应用有seq-GAN,和强化学习结合的产物)
---------------------
作者山水之间2018
来源CSDN
原文https://blog.csdn.net/Gavinmiaoc/article/details/79947877
版权声明:本文为博主原创文章,转载请附上博文链接!
# 训练GAN的一些技巧
1. 输入规范化到(-11之间最后一层的激活函数使用tanhBEGAN除外
2. 使用wassertein GAN的损失函数
3. 如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑
4. 使用mini-batch norm 如果不用batch norm 可以使用instance norm 或者weight norm
5. 避免使用RELU和pooling层减少稀疏梯度的可能性可以使用leakrelu激活函数
6. 优化器尽量选择ADAM学习率不要设置太大初始1e-4可以参考另外可以随着训练进行不断缩小学习率
7. 给D的网络层增加高斯噪声相当于是一种正则
---------------------
作者山水之间2018
来源CSDN
原文https://blog.csdn.net/Gavinmiaoc/article/details/79947877
版权声明:本文为博主原创文章,转载请附上博文链接!
# 实例理解GAN实现过程
https://blog.csdn.net/sxf1061926959/article/details/54630462
# DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比
https://blog.csdn.net/qq_25737169/article/details/78857788
## DCGAN
### DCGAN原理理解?
### 优缺点?
# GAN对噪声z的分布有要求吗常用哪些分布
一般没有特别要求常用有高斯分布、均匀分布。噪声的维数至少要达到数据流形的内在维数才能产生足够的diversitymnist大概是6维CelebA大概是20维参考https://zhuanlan.zhihu.com/p/26528060
https://blog.csdn.net/witnessai1/article/details/78507065/
# 现有GAN存在哪些关键属性缺失
http://www.elecfans.com/d/707141.html
# 图解什么是GAN
https://www.cnblogs.com/Darwin2000/p/6984253.html
# GAN有哪些训练难点\原因及解决方案
https://www.sohu.com/a/143961544_741733
# 近年GAN有哪些突破口?
https://baijiahao.baidu.com/s?id=1593092872607620265&wfr=spider&for=pc

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 KiB

After

Width:  |  Height:  |  Size: 756 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 564 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 KiB

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Some files were not shown because too many files have changed in this diff Show More