内容提要
上2篇博客写的内容:
1,加载数据
2,整理数据
3,数据归一
4,初始化权重w和b
所有的已知量都知道了,接下来就要开始写梯度了,写出来这个logistic模型的算法。现在所有的数学公式都可以用现在已知的量表达出来了。
1.数据集标签y的格式和内容是什么?
先看看数据集标签y的格式和内容是什么?
之前说的都是数据集的变量x,没有写y的格式和内容,为了便于理解,把这个y的内容也补上。
加上一个图片,如上图所示,加载了数据后,返回接收了x和y,这一次我们打印出来y的各个属性看看y的格式和内容。
可以看出y是一个1行50列(测试样本有50个数据)的一个行向量,内容不是0就是1,也就是cat或者no-cat,他的类型也是一个ndarray。
————————————————————————
这样就接到上一篇中的内容了,
上一篇结尾的时候写到:
y
y
y=
W
W
W.
T
T
TX
X
X
X+
b
b
b
这个公式,现在看看就能理解为什么这个测试集的y标签是1行50列了。W的转置乘以X,得到的是一个值,X的每一列是一个图片的信息,有n列,这样这个公式向量化的话就会得到y是一个1行n列的一个行向量。(这样说脑海里面能不能有画面感。
画个图片,如上图这样,这也是线性代数里面的矩阵的运算的知识(我早就说过numpy就是线性代数)
显然这里得出的结果和y不一样,因为还要进行sigmoid()函数的转换转换成0和1.
2.计算成本函数和梯度函数(W,b,x,y)
回到百度这本书《飞桨PaddlePaddle深度学习实战》,这本书中说到典型的深度学习的计算过程包含3个过程,正向传播过程,反向传播过程,梯度下降过程。
现在定义一个函数来计算成本和梯度,这个函数的名称为正向传播和反向传播函数:
J
(
w
,
b
)
=
1
m
∑
L
(
y
ˇ
,
i
y
i
)
J(w,b)= \frac{1} {m} \sum L(\check{y} \overset{i}, y^i )
J(w,b)=m1∑L(yˇ,iyi)
这个公式我们知道L是单个样本的损失函数
把L的公式带入进去
J
(
w
,
b
)
=
1
m
∑
L
(
y
ˇ
,
i
y
i
)
=
−
1
m
∑
[
y
i
l
o
g
y
ˇ
(
i
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
y
ˇ
(
i
)
)
]
J(w,b)= \frac{1} {m} \sum L(\check{y} \overset{i}, y^i )=- \frac{1} {m} \sum [y^ilog\check{y}^{(i)}+(1-y^{(i)})log(1-\check{y}^{(i)})]
J(w,b)=m1∑L(yˇ,iyi)=−m1∑[yilogyˇ(i)+(1−y(i))log(1−yˇ(i))]
这个就是这个损失函数,i是样本数量,一对(w,b,一个样本数据x)可以算出一个损失值,i个样本数据X,就可以算出i个损失值,假设有m个样本数据,就是m个损失值,m个损失值相加求平均就是成本值
总结
下面的步骤就是这个过程:
第一:对J成本函数求偏导得dW,db,
第二:初始化函数得到的w,b通过下面的公式算新的w,b
w
=
w
−
a
d
w
w=w-adw
w=w−adw
b
=
b
−
a
d
b
b=b-adb
b=b−adb
第三:新得的w,b计算出新的成本值cost
第四:通过下面的梯度公式更新w,b值,
w
=
w
−
a
d
w
w=w-adw
w=w−adw
b
=
b
−
a
d
b
b=b-adb
b=b−adb
第五:更新的w,b计算出新的成本值
。
。
。
这个过程就是这样了,按照这个logistic模型来说这个cost值是收敛的,会慢慢的变小,每更新100次,我们输出一下cost的值,看看cost是多大,最后也是用matplotlib画出图看看这个变化。
公式知道了,现在就要求梯度了
d
w
=
1
m
X
d
Z
T
dw= \frac{1} {m} XdZ^T
dw=m1XdZT
d
b
=
1
m
∑
d
z
(
i
)
=
1
m
n
u
m
p
y
.
s
u
m
(
d
Z
)
db= \frac{1} {m} \sum dz^{(i)}=\frac{1}{m} numpy.sum(dZ)
db=m1∑dz(i)=m1numpy.sum(dZ)
解释一下这里的z,z是线性变换后的预测值,之前用y预测表示,现在用z表示,让后以z为变量,做非线性变换
A
=
s
i
g
m
o
i
d
(
Z
)
A=sigmoid(Z)
A=sigmoid(Z)
然后a这个函数对z求导
可以算出dz=A-Y
(具体的数学变换过程不写了)
在下面插入代码看看:
#propagate是传播的意思
def forward_and_backard_propagate(W,b,X,Y):
"""
计算成本cost和梯度grads
args:
W:权重,(num_px*num_px*3,1)维的numpy数组,第一组我们在初始化参数里面给猜出
b:偏置bias,标量,在初始化参数里面给猜出
X:数据,形状为(num_px*num_px*3,number of examples),在加载数据的时候做了转置,X的每一列是一个图片的信息
Y:数据,形状为(1,number of examples)维的numpy数组
return:
cost:逻辑回归的损失函数
dW:cost的对参数W的梯度,形状和参数W一样
db:cost对参数b的梯度,形状和参数b一样
"""
#通过上面的描述,第一个应该是m的大小
#这里应该是shape[1],因为X这个矩阵我们开始时候转置了,一列是一个图片,有m列,shape1是返回的是列的数量
#如果用换一种表示比如W.shape[0],因为W是1列m行,w转置后和x乘
m=X.shape[1]
#正向传播计算成本函数
Z=np.dot(W.T,X)+b#线性变换,得出预测值Z
A=sigmoid(Z)#非线性变换,映射到0-1
#对Z求偏导
dZ=A-Y
cost=np.sum(-(Y*np.log(A)+(1-Y)*np.log(1-A)))/m
#反向传播
dW=np.dot(X,dz.T)/m
db=np.sum(dz)/m
cost=np.squeeze(cost)
grads={
"dW":dW,
"db":db
}
return grads,cost
上面的程序可以看出就是我总结的整个过程
先写到这里,下一篇写w和b梯度后更新:
w
=
w
−
a
d
w
w=w-adw
w=w−adw
b
=
b
−
a
d
b
b=b-adb
b=b−adb