mirror of
https://github.com/microsoft/ai-edu.git
synced 2026-08-30 17:04:17 +08:00
@@ -129,4 +129,4 @@ if __name__ == '__main__':
|
||||
1. 我们用归一化前的数据画的第一张图,所以坐标范围是[0,10][0,10]
|
||||
2. 我们用归一化后的数据画的第二张图,所以坐标范围是[0,1][0,1]
|
||||
|
||||
代码位置:ch06, Level0_BaseClassification.py, Level1_BinaryClassification.py, Level2_ShowBinaryResult.py
|
||||
代码位置:ch06, Level0, Level1, Level2
|
||||
@@ -64,11 +64,11 @@ $$Z = W \cdot X+B$$
|
||||
|
||||
实际上是以下计算的组合:
|
||||
|
||||
$$Z1 = W_1 \cdot X + B_1=w_{11} \cdot x_1 + w_{12} \cdot x_2 + b_1$$
|
||||
$$Z1 = W1 \cdot X + B1=w_{11} \cdot x_1 + w_{12} \cdot x_2 + b_1$$
|
||||
|
||||
$$Z2 = W_2 \cdot X + B_2=w_{21} \cdot x_1 + w_{22} \cdot x_2 + b_2 $$
|
||||
$$Z2 = W2 \cdot X + B2=w_{21} \cdot x_1 + w_{22} \cdot x_2 + b_2 $$
|
||||
|
||||
$$Z3 = W_3 \cdot X + B_3=w_{31} \cdot x_1 + w_{32} \cdot x_2 + b_3$$
|
||||
$$Z3 = W3 \cdot X + B3=w_{31} \cdot x_1 + w_{32} \cdot x_2 + b_3$$
|
||||
|
||||
如何确定(Z1|Z2)之间的边界呢?那只要令Z1=Z2就行了......
|
||||
|
||||
@@ -136,25 +136,46 @@ if __name__ == '__main__':
|
||||
|
||||
<img src=".\Images\6\multiple_result.png">
|
||||
|
||||
【图6.6.2 想象中的一对一方式的分类结果图】
|
||||
|
||||
上图中:
|
||||
- 绿色线是1|2的边界,不考虑第3类
|
||||
- 蓝色线是1|3的边界,不考虑第2类
|
||||
- 红色线是2|3的边界,不考虑第1类
|
||||
|
||||
我们只看红色的第1类,当要区分1|2和1|3时,神经网络实际是用了两条直线作为边界,它并没有画出下面这样的线来:
|
||||
我们只看红色的第1类,当要区分1|2和1|3时,神经网络实际是用了两条直线(绿色和蓝色)作为边界,它并没有画出下面这样的线来:
|
||||
|
||||
<img src=".\Images\6\OneVsOthers.png">
|
||||
|
||||
上面这张图是所谓的一对多的方式,只看红线,它把红点和其它点一次分割成型。而实际的分类结果图中,是把每两个类别都分别分割,所以神经网络的工作方式是一对一方式!
|
||||
【图6.6.3 想象中的一对多方式的分类】
|
||||
|
||||
木头:嗯....那为什么从Softmax函数看,它只是取了一个最大值呢?这不是一对多的行为吗?
|
||||
上面这张图是我们想象的所谓的一对多的方式,只看红线,它把红点和其它点一次分割成型。而神经网络没有画出这样的线来,这意味着神经网络不是一对多方式吗?而且
|
||||
|
||||
铁柱:这就是对Softmax函数的理解不正确了。如果是max函数,对于[3,1,-3]只取[1,0,0],确实是一对多,但是Softmax在计算过程中,是考虑类每个类别的因素的,对于[3,1,-3]取值是[0.88,0.12,0.00],这可以解读为第一类 vs 第二类 = 0.88 vs 0.12,第一类 vs 第三类 = 0.88 vs 0.00,所以它是一对一的关系。
|
||||
事情还没有那么简单!有了图6.6.2,并不意味着它是一对一方式;而没有得到图6.6.3,并不意味着它就不是一对多方式。
|
||||
|
||||
木头:嗯...哦...有点儿绕...
|
||||
|
||||
代码位置:ch06, Level0_BaseClassification.py, level3_MultipleClassification.py, level4_ShowMultipleResult.py
|
||||
铁柱:图6.6.2是我们依靠令Z1=Z2, Z2=Z3, Z3=Z1三个等式得到的,但实际上神经网络的工作方式不是这样的,给定屏幕上任意点,分类器总会给你一个概率,告诉你该点分别属于三个区域的概率,比如:
|
||||
|
||||
注:代码中还有一个小彩蛋,ShowAreaResult()函数,有兴趣的同学可以自己试一下,放开注释即可。
|
||||
$$[0.7,0.2,0.1]$$
|
||||
|
||||
意为属于第一个区域的概率为0.7,属于后两个区域的概率为0.2与0.1。而Z1=Z2等三个等式,是我们人为地画了三条直线,而实际上,它们不应该是直线,而是线段:
|
||||
|
||||
<img src=".\Images\6\multiple_result_true.png">
|
||||
|
||||
【图6.6.4 分段线性分类结果】
|
||||
|
||||
木头:如何证明这一点呢?
|
||||
|
||||
铁柱:代码中还有一个小彩蛋,ShowAreaResult()函数,有兴趣的同学可以自己试一下,放开注释即可以看到下图:
|
||||
|
||||
<img src=".\Images\6\multiple_result_area.png">
|
||||
|
||||
【图6.6.5】
|
||||
|
||||
由于精度较低(我们用了50x50的网格来模拟整个区域),所以看到一些锯齿,不用管它,只看趋势,完全与图6.6.4吻合,所以说明神经网络是用分段线性的方法,来做一对多的分类,而不是像我们想象的图6.6.3那样的单条直线。
|
||||
|
||||
代码位置:ch06, Level0, level3, level4
|
||||
|
||||
**课后作业**
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
@@ -5,6 +5,7 @@ import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from pathlib import Path
|
||||
import math
|
||||
|
||||
from Level0_BaseClassification import *
|
||||
from Level3_MultipleClassification import *
|
||||
|
||||
@@ -25,7 +26,7 @@ def ShowRawData(X,Y):
|
||||
|
||||
def ShowLineResult(X,Y,W,B,xt):
|
||||
|
||||
# ShowAreaResult(X,Y,W,B)
|
||||
ShowAreaResult(X,Y,W,B)
|
||||
|
||||
ShowData(X,Y)
|
||||
|
||||
@@ -60,7 +61,7 @@ def ShowLineResult(X,Y,W,B,xt):
|
||||
|
||||
|
||||
def ShowAreaResult(X,Y,W,B):
|
||||
count = 20
|
||||
count = 50
|
||||
x1 = np.linspace(0,1,count)
|
||||
x2 = np.linspace(0,1,count)
|
||||
for i in range(count):
|
||||
|
||||
Reference in New Issue
Block a user