Skip to content

Commit

Permalink
fix table and image (microsoft#399)
Browse files Browse the repository at this point in the history
  • Loading branch information
mslichao authored and xiaowuhu committed Nov 7, 2019
1 parent 22145ba commit 4e5620c
Show file tree
Hide file tree
Showing 48 changed files with 129 additions and 133 deletions.
12 changes: 6 additions & 6 deletions B-教学案例与实践/B15-生成对抗网络/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,29 @@

生成对抗网络之所以这么火,离不开该网络及其变种的强大能力。下面就通过该网络相关的论文来看一下,生成对抗网络有多么的酷炫。

首先是生成对抗网络的开篇论文,2014年Ian J. Goodfellow在他提出生成对抗网络的论文[\[3\]](#gan)中展示了该网络生成图片的能力,如图21-3所示
首先是生成对抗网络的开篇论文,2014年Ian J. Goodfellow在他提出生成对抗网络的论文[\[3\]](#gan)中展示了该网络生成图片的能力,如图21-3所示

<img src="./images/gan0.png" width="640" />

图21-3 生成对抗网络生成的图片

图21-3中,左侧五列是模型生成的图片,最右侧一列是在原始数据集中找出的和第五列最接近的图片,可以看到这些图片确实是新生成的,并不包含在原始数据集中。

上面的生成的图片看起来有那么一点意思,但是生成的内容却是不可控的。 Mehdi Mirza等人提出GAN一个变种CGAN(Conditional Generative Adversarial Nets)[\[4\]](#cgan),可以指定一些条件来控制生成的结果,比如在MNIST数据集中可以生成指定的数字。如图21-4所示,每行都是一个指定的数字(0-9)
上面的生成的图片看起来有那么一点意思,但是生成的内容却是不可控的。 Mehdi Mirza等人提出GAN一个变种CGAN(Conditional Generative Adversarial Nets)[\[4\]](#cgan),可以指定一些条件来控制生成的结果,比如在MNIST数据集中可以生成指定的数字。如图21-4所示,每行都是一个指定的数字(0-9)

<img src="./images/cgan.png" width="640" />

图21-4 CGAN的结果

Xi Chen等人也提出了一种变种,叫做InfoGAN[\[5\]](#infogan),它使用无监督的方法来学习特征,也可以产生不同属性的数据,该网络的效果如图21-5所示
Xi Chen等人也提出了一种变种,叫做InfoGAN[\[5\]](#infogan),它使用无监督的方法来学习特征,也可以产生不同属性的数据,该网络的效果如图21-5所示

<img src="./images/infogan.png" width="640" />

图21-5 InfoGAN的结果

在图21-5中,(a)显示变量c1可以控制数字的类型(0-9),(c)显示变量c2可以控制数字的倾斜度,(d)显示变量c3可以控制笔划的粗细。

Scott Reed等人还做了更复杂的试验[\[6\]](#gancls),将文本和图像联系起来,可以跟据文本句子的描述生成对应的图像,如图21-6所示
Scott Reed等人还做了更复杂的试验[\[6\]](#gancls),将文本和图像联系起来,可以跟据文本句子的描述生成对应的图像,如图21-6所示

<img src="./images/texttoimage.png" width="480" />

Expand All @@ -67,7 +67,7 @@ Scott Reed等人还做了更复杂的试验[\[6\]](#gancls),将文本和图像

图21-7 图片风格转换

生成对抗网络还可以用于图像编辑。Yunjey Choi等人提出了StarGAN[\[8\]](#stargan),可以对人脸进行编辑,包括改变头发颜色、性别、年龄、肤色以及表情。如图21-8所示
生成对抗网络还可以用于图像编辑。Yunjey Choi等人提出了StarGAN[\[8\]](#stargan),可以对人脸进行编辑,包括改变头发颜色、性别、年龄、肤色以及表情。如图21-8所示

<img src="./images/stargan.png" width="640" />

Expand Down Expand Up @@ -193,7 +193,7 @@ loss_func = LossFunction_1_2(NetType.BinaryClassifier)

然后更新生成器,此时用更新后的判别器重新输入假样本,得到新的输出后,再次进行反向传播,此时需要传播六层一直到生成器,但是只有生成器的三层需要计算梯度并更新。

如图21-11显示了这个反向传播和更新的过程
如图21-11显示了这个反向传播和更新的过程

<img src="./images/ganbackward.png" width="640" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ $$A=\sigma{(Z)}$$

#### 训练流程

从真正的“零”开始学习神经网络时,我没有看到过任何一个流程图来讲述训练过程,大神们写书或者博客时都忽略了这一点,图1-16是一个简单的流程图
从真正的“零”开始学习神经网络时,我没有看到过任何一个流程图来讲述训练过程,大神们写书或者博客时都忽略了这一点,图1-16是一个简单的流程图

<img src="../Images/1/TrainFlow.png" />

Expand All @@ -104,7 +104,7 @@ $$A=\sigma{(Z)}$$

#### 步骤

假设我们有表1-1所示的训练数据样本
假设我们有表1-1所示的训练数据样本

表1-1 训练样本示例

Expand All @@ -129,7 +129,7 @@ $$A=\sigma{(Z)}$$

### 1.3.3 神经网络中的矩阵运算

图1-17是一个两层的神经网络,包含隐藏层和输出层,输入层不算做一层
图1-17是一个两层的神经网络,包含隐藏层和输出层,输入层不算做一层

<img src="../Images/1/TwoLayerNN.png" ch="500" />

Expand Down Expand Up @@ -217,7 +217,7 @@ $$Z2 = A1 \cdot W2 + B2$$

#### 回归(Regression)或者叫做拟合(Fitting)

单层的神经网络能够模拟一条二维平面上的直线,从而可以完成线性分割任务。而理论证明,两层神经网络可以无限逼近任意连续函数。图1-18所示就是一个两层神经网络拟合复杂曲线的实例
单层的神经网络能够模拟一条二维平面上的直线,从而可以完成线性分割任务。而理论证明,两层神经网络可以无限逼近任意连续函数。图1-18所示就是一个两层神经网络拟合复杂曲线的实例

<img src="..\Images\1\sgd_result.png">

Expand Down Expand Up @@ -256,9 +256,9 @@ $$y=0.4x^2 + 0.3xsin(15x) + 0.01cos(50x)-0.3$$

比如肘关节,可以完成小臂在一个二维平面上的活动。加上肩关节,就可以完成胳膊在三维空间的活动。再加上其它关节,就可以扩展胳膊活动的三维空间的范围。

用表1-2来比喻两者之间的关系:
用表1-2来对比人体运动组织和神经网络组织。

表1-2
表1-2 人体运动组织和神经网络组织的对比

|人体运动组织|神经网络组织|
|---|---|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@

### 2.0.2 例二:黑盒子

假设有一个黑盒子如图2-1
假设有一个黑盒子如图2-1

<img src="../Images/2/blackbox.png" />

Expand All @@ -70,7 +70,7 @@

小明拿了一支步枪,射击100米外的靶子。这支步枪没有准星,或者是准星有问题,或者是小明眼神儿不好看不清靶子,或者是雾很大,或者风很大,或者由于木星的影响而侧向引力场异常......反正就是遇到各种干扰因素。

第一次试枪后,拉回靶子一看,弹着点偏左了,于是在第二次试枪时,小明就会有意识地向右侧偏几毫米,再看靶子上的弹着点,如此反复几次,小明就会掌握这支步枪的脾气了。图2-2显示了小明的5次试枪过程
第一次试枪后,拉回靶子一看,弹着点偏左了,于是在第二次试枪时,小明就会有意识地向右侧偏几毫米,再看靶子上的弹着点,如此反复几次,小明就会掌握这支步枪的脾气了。图2-2显示了小明的5次试枪过程

<img src="../Images/2/target1.png" width="500" ch="500" />

Expand Down Expand Up @@ -125,7 +125,7 @@

以上三个例子比较简单,容易理解,我们把黑盒子再请出来:黑盒子这件事真正的意义并不是猜测当输入是多少时输出会是4。它的实际意义是:我们要破解这个黑盒子!于是,我们会有如下破解流程:

1. 记录下所有输入值和输出值,如表2-1
1. 记录下所有输入值和输出值,如表2-1

表2-1 样本数据表

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ $$x = 2w + 3b \tag{2}$$

$$y = 2b + 1 \tag{3}$$

计算图如图2-4
计算图如图2-4

<img src="../Images/2/flow1.png" ch="500" />

图2-4 简单线性计算的计算图

注意这里x, y, z不是变量,只是计算结果。w, b是才变量。因为在后面要学习的神经网络中,我们要最终求解的是w和b的值,在这里先预热一下。

当w = 3, b = 4时,会得到图2-5的结果
当w = 3, b = 4时,会得到图2-5的结果

<img src="../Images/2/flow2.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ $$
\Delta x = \Delta a / 2x \tag{根据式1}
$$

我们给定初始值$x=2,\Delta x=0$,依次计算结果如表2-2
我们给定初始值$x=2,\Delta x=0$,依次计算结果如表2-2

表2-2 正向与反向的迭代计算

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ $$

### 3.1.2 实际案例

假设有一组数据如图3-3,我们想找到一条拟合的直线
假设有一组数据如图3-3,我们想找到一条拟合的直线

<img src="../Images/3/mse1.png" ch="500" />

Expand Down Expand Up @@ -79,7 +79,7 @@ $$

#### 损失函数值的3D示意图

横坐标为W,纵坐标为b,针对每一个w和一个b的组合计算出一个损失函数值,用三维图的高度来表示这个损失函数值。下图中的底部并非一个平面,而是一个有些下凹的曲面,只不过曲率较小,如图3-7
横坐标为W,纵坐标为b,针对每一个w和一个b的组合计算出一个损失函数值,用三维图的高度来表示这个损失函数值。下图中的底部并非一个平面,而是一个有些下凹的曲面,只不过曲率较小,如图3-7

<img src="../Images/3/lossfunction3d.png" ch="500" />

Expand Down Expand Up @@ -119,7 +119,7 @@ $$
[0.68 0.66 0.64 ... 4.63 4.69 4.75]]
```

然后遍历矩阵中的损失函数值,在具有相同值的位置上绘制相同颜色的点,比如,把所有值为0.72的点绘制成红色,把所有值为0.75的点绘制成蓝色......,这样就可以得到图3-9
然后遍历矩阵中的损失函数值,在具有相同值的位置上绘制相同颜色的点,比如,把所有值为0.72的点绘制成红色,把所有值为0.75的点绘制成蓝色......,这样就可以得到图3-9

<img src="../Images/3/lossfunction2d.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ if __name__ == '__main__':
|epoch|3|10|60|
|结果|w=2.003, b=2.990|w=2.006, b=2.997|w=1.993, b=2.998|

表4-6比较了三种方式的结果,从结果看,都接近于$w=2,b=3$的原始解。最后的可视化结果图如图4-10,可以看到直线已经处于样本点比较中间的位置
表4-6比较了三种方式的结果,从结果看,都接近于$w=2,b=3$的原始解。最后的可视化结果图如图4-10,可以看到直线已经处于样本点比较中间的位置

<img src="../Images/4/mbgd-result.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ B= [[242.15205099]]
z= [[37366.53336103]]
```

虽然损失函数值没有像我们想象的那样趋近于0,但是却稳定在了400左右震荡,这也算是收敛!看一下损失函数图像
虽然损失函数值没有像我们想象的那样趋近于0,但是却稳定在了400左右震荡,这也算是收敛!看一下损失函数图像

<img src="../Images/5/correct_loss.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ if __name__ == '__main__':
```Python
params = HyperParameters(eta=0.1, max_epoch=10000, batch_size=10, eps=1e-3, net_type=NetType.BinaryClassifier)
```
把max_epoch从100改成了10000,再跑一次
把max_epoch从100改成了10000,再跑一次

<img src="../Images/6/binary_loss_10k.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

#### 线性多分类和非线性多分类的区别

下图先示意了线性多分类和非线性多分类的区别:
图7-2显示了线性多分类和非线性多分类的区别。

<img src="../Images/7/linear_vs_nonlinear.png" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ w23 = (net.W[0,2] - net.W[0,1])/(net.W[1,1] - net.W[1,2])

完整代码请看ch07 Level2的python文件。

改一下主函数,增加对以上两个函数ShowData()和ShowResult()的调用,最后可以看到图7-14所示的分类结果图,注意,这个结果图和我们在7.2中分析的一样,只是蓝线斜率不同
改一下主函数,增加对以上两个函数ShowData()和ShowResult()的调用,最后可以看到图7-14所示的分类结果图,注意,这个结果图和我们在7.2中分析的一样,只是蓝线斜率不同

<img src="../Images/7/result.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ $$a = \sigma(z) \tag{2}$$
+ 可导性:做误差反向传播和梯度下降,必须要保证激活函数的可导性;
+ 单调性:单一的输入会得到单一的输出,较大值的输入得到较大值的输出。

在物理试验中使用的继电器,是最初的激活函数的原型:当输入电流大于一个阈值时,会产生足够的磁场,从而打开下一级电源通道,如图8-2所示
在物理试验中使用的继电器,是最初的激活函数的原型:当输入电流大于一个阈值时,会产生足够的磁场,从而打开下一级电源通道,如图8-2所示

<img src="../Images/8/step.png" width="500" />

Expand All @@ -43,7 +43,7 @@ $$a = \sigma(z) \tag{2}$$

激活函数用在神经网络的层与层之间的连接,神经网络的最后一层不用激活函数。

神经网络不管有多少层,最后的输出层决定了这个神经网络能干什么。在单层神经网络中,我们学习到了以下示例:
神经网络不管有多少层,最后的输出层决定了这个神经网络能干什么。在单层神经网络中,我们学习到了表8-1所示的内容。

表8-1 单层的神经网络的参数与功能

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ class DataReaderEx(SimpleDataReader):
num_input = 3
```

再次运行
再次运行,得到表9-5所示的结果。

表9-5 三次多项式训练过程与结果

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ B= [[-0.21280055]]

### 9.2.2 用六次多项式拟合

接下来跳过5次多项式,直接用6次多项式来拟合。这次不需要把max_epoch设置得很大,可以先试试50000个epoch
接下来跳过5次多项式,直接用6次多项式来拟合。这次不需要把max_epoch设置得很大,可以先试试50000个epoch

表9-10 六次多项式5万次迭代的训练结果

Expand Down Expand Up @@ -95,7 +95,7 @@ B= [[-0.21745171]]

### 9.2.3 用八次多项式拟合

再跳过7次多项式,直接使用8次多项式。先把max_epoch设置为50000试验一下
再跳过7次多项式,直接使用8次多项式。先把max_epoch设置为50000试验一下

表9-11 八项式5万次迭代的训练结果

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Test Set,用来评估模最终模型的泛化能力。但不能作为调参、

在咱们前面的学习中,一般使用损失函数值小于门限值做为迭代终止条件,因为通过前期的训练,笔者预先知道了这个门限值可以满足训练精度。但对于实际应用中的问题,没有先验的门限值可以参考,如何设定终止条件?此时,我们可以用验证集来验证一下准确率,假设只有90%的的准确率,可能是局部最优解。这样我们可以继续迭代,寻找全局最优解。

举个例子:一个BP神经网络,我们无法确定隐层的神经元数目,因为没有理论支持。此时可以按图9-6的示意图这样做
举个例子:一个BP神经网络,我们无法确定隐层的神经元数目,因为没有理论支持。此时可以按图9-6的示意图这样做

<img src="../Images/9/CrossValidation.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,6 @@ if __name__ == '__main__':

图9-15 三个神经元的训练过程中损失函数值和准确率的变化

下图为拟合情况的可视化图:

<img src="../Images/9/complex_result_3n.png"/>

图9-16 三个神经元的拟合效果
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

### 10.0.2 提出问题二:双弧形问题

我们给出一个比异或问题要稍微复杂些的问题,如图10-2所示
我们给出一个比异或问题要稍微复杂些的问题,如图10-2所示

<img src="../Images/10/sin_data_source.png" ch="500" />

Expand Down Expand Up @@ -48,13 +48,13 @@ $$(521+435)/1000=0.956$$
- 负例中被判断为负类的样本数(TN-True Negative):435
- 负例中被判断为正类的样本数(FP-False Positive):450-435=15

可以用图10-3来帮助理解
可以用图10-3来帮助理解

<img src="../Images/10/TPFP.png" ch="925" />

图10-3 二分类中四种类别的示意图

在圆圈中的样本是被模型判断为正类的,圆圈之外的样本是被判断为负类的。用表格的方式描述矩阵的话是表10-1的样子
在圆圈中的样本是被模型判断为正类的,圆圈之外的样本是被判断为负类的。用表格的方式描述矩阵的话是表10-1的样子

表10-1 四类样本的矩阵关系

Expand Down Expand Up @@ -122,7 +122,7 @@ $$

ROC曲线的横坐标是FPR,纵坐标是TPR。

在二分类器中,如果使用Logistic函数作为分类函数,可以设置一系列不同的阈值,比如[0.1,0.2,0.3...0.9],把测试样本输入,从而得到一系列的TP、FP、TN、FN,然后就可以绘制如下曲线,如图10-4
在二分类器中,如果使用Logistic函数作为分类函数,可以设置一系列不同的阈值,比如[0.1,0.2,0.3...0.9],把测试样本输入,从而得到一系列的TP、FP、TN、FN,然后就可以绘制如下曲线,如图10-4

<img src="../Images/10/ROC.png" ch="500" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
- 从复杂程度上分,有线性/非线性之分;
- 从样本类别上分,有二分类/多分类之分。

从直观上理解,这几个概念应该符合表10-2中的示例
从直观上理解,这几个概念应该符合表10-2中的示例

表10-2 各种分类的组合关系

Expand All @@ -19,7 +19,7 @@
|线性|<img src="../Images/6/linear_binary.png"/>|<img src="../Images/6/linear_multiple.png"/>|
|非线性|<img src="../Images/10/non_linear_binary.png"/>|<img src="../Images/10/non_linear_multiple.png"/>|

在第三步中我们学习过线性分类,如果用于此处的话,我们可能会得到表10-3所示的绿色分割线
在第三步中我们学习过线性分类,如果用于此处的话,我们可能会得到表10-3所示的绿色分割线

表10-3 线性分类结果

Expand All @@ -30,7 +30,7 @@

### 10.1.2 简单证明异或问题的不可能性

用单个感知机或者单层神经网络,是否能完成异或任务呢?我们自己做个简单的证明。先看样本数据,如表10-4
用单个感知机或者单层神经网络,是否能完成异或任务呢?我们自己做个简单的证明。先看样本数据,如表10-4

表10-4 异或的样本数据

Expand All @@ -41,7 +41,7 @@
|3|1|0|1|
|4|1|1|0|

用单个神经元(感知机)的话,就是表10-5中两种技术的组合
用单个神经元(感知机)的话,就是表10-5中两种技术的组合

表10-5 神经元结构与二分类函数

Expand Down Expand Up @@ -90,7 +90,7 @@ $$(w_1 + b) + (w_2 + b) < b < 0 \tag{7}$$

### 10.1.3 非线性的可能性

我们前边学习过如何实现与、与非、或、或非,我们看看如何用已有的逻辑搭建异或门,如图10-5所示
我们前边学习过如何实现与、与非、或、或非,我们看看如何用已有的逻辑搭建异或门,如图10-5所示

<img src="../Images/10/xor_gate.png" />

Expand Down
Loading

0 comments on commit 4e5620c

Please sign in to comment.