例如:判断图片中是否含有猫
图片为rbg模式,大小为 width×height w i d t h × h e i g h t ,使用矩阵(列向量)存储如下:
x=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢Mat_R1,1Mat_R1,2...Mat_G1,1Mat_G1,2...Mat_B1,1Mat_B1,2...⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥nx×1 x = [ M a t _ R 1 , 1 M a t _ R 1 , 2 . . . M a t _ G 1 , 1 M a t _ G 1 , 2 . . . M a t _ B 1 , 1 M a t _ B 1 , 2 . . . ] n x × 1
其中 nx=3×width×height n x = 3 × w i d t h × h e i g h t ,并将 x x 作为输入。
输出: y={0 图片中有猫1 图片中无猫y={0 图片中有猫1 图片中无猫
任意一个实例可以表示为 (x,y) ( x , y ) , x∈Rnx x ∈ R n x , y∈{0,1} y ∈ { 0 , 1 } ,矩阵化之后为:
给定 x x 的前提下,令y^=P(y=1|x),y^∈(0,1)y^=P(y=1|x),y^∈(0,1)
输出: y^=σ(wTx+b) y ^ = σ ( w T x + b ) , x∈Rnx x ∈ R n x , w∈Rnx w ∈ R n x , b∈R b ∈ R
其中 σ(z)=11+e−z σ ( z ) = 1 1 + e − z ,图像如下:
Loss 函数:
L(y^,y)=−[ylogy^+(1−y)log(1−y^)] L ( y ^ , y ) = − [ y log y ^ + ( 1 − y ) log ( 1 − y ^ ) ]
Cost 函数:
J(w,b)=1m∑i=1mL(y^(i),y(i))=−1m∑i=1m[y(i)logy^(i)+(1−y(i))log(1−y^(i))] J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) log y ^ ( i ) + ( 1 − y ( i ) ) log ( 1 − y ^ ( i ) ) ]
其中的 log log 均以 e e 为底。
计算(w,b)(w,b)来使得 J(w,b) J ( w , b ) 数值最小,以下是一次梯度下降公式:
w=w−α∂J(w,b)∂w w = w − α ∂ J ( w , b ) ∂ w
b=b−α∂J(w,b)∂b b = b − α ∂ J ( w , b ) ∂ b
其中, α α 为学习率。
此后,不再详细区分 d d 和∂∂符号。
例如:
J(a,b,c)=3(a+bc) J ( a , b , c ) = 3 ( a + b c )
正向计算数值和反向计算导数的过程如下:
z=wTx+b z = w T x + b
y^=a=σ(z) y ^ = a = σ ( z )
L(a,y)=−[yloga+(1−y)log(1−a)] L ( a , y ) = − [ y log a + ( 1 − y ) log ( 1 − a ) ]
用于 m m 个样例,并高度向量化:
Python伪代码为:
# 高度向量化的目的是 # 减少for循环 # 以加快代码的运行速度 import numpy as np for i in range(1000): # 梯度下降1000次 # 计算 a (y hat) Z = np.dot(W.T, X) b A = sigmod(Z) dz = A - Y dw = 1/m * np.dot(X, dz.T) db = 1/m * np.sum(dz) w -= alpha * dw b -= alpha * db⎡⎣⎢123⎤⎦⎥ 10=⎡⎣⎢123⎤⎦⎥ ⎡⎣⎢101010⎤⎦⎥[123] 10=[123] [101010]
[142536]+[102030]=[142536]+[101020203030] [ 1 2 3 4 5 6 ] + [ 10 20 30 ] = [ 1 2 3 4 5 6 ] + [ 10 20 30 10 20 30 ]
[142536]+[1020]=[142536]+⎡⎣⎢101010202020⎤⎦⎥ [ 1 2 3 4 5 6 ] + [ 10 20 ] = [ 1 2 3 4 5 6 ] + [ 10 20 10 20 10 20 ]
记得创建行向量np.random.randn( (5,1) )、
列向量np.random.randn( (1,5) ),
而不要使用np.random.randn( 5 )
多使用reshape()函数没有坏处
尽可能多的使用assert( a.shape()==(5,1) )来保证程序的健壮性