新手请点击公众号里的“历史文章”从之前的文章看起,否则你可能看不懂本篇文章
在编写深度神经网络程序时,出现的很多问题都是由于矩阵的维度不对引起的,而且这个问题非常难查。而且python有时候还会改变矩阵的维度(例如之前我们学到的python广播化),所以我们需要经常核对矩阵的维度,使他们的维度与我们预料中的保持一致。在本小节的实战中,你会看到很多地方我使用assert来核对矩阵的维度。
本篇文章中我带大家总结一下我们在神经网络中各种变量的矩阵维度。
上面是一个五层的神经网络,输入层有2个元素,所以n[0]=2,第一层有三个元素,所以n[1]=3,其他层同理。
下面我先列出单个训练样本时各变量的维度公式
w[l]--> (n[l], n[l-1])
b[l]--> (n[l], 1)
z[l]--> (n[l], 1)
a[l]--> (n[l], 1)
da[l]--> (n[l], 1)
dz[l]--> (n[l], 1)
db[l]--> (n[l], 1)
dw[l]--> (n[l], n[l-1])
根据上面的公式,下面举例列出第一层的相关变量的维度
W[1]--> (3 , 2)
b[1]--> (3 , 1)
z[1]--> (3 , 1)
a[1]--> (3 , 1)
da[1]--> (3 , 1)
dz[1]--> (3 , 1)
db[1]--> (3 , 1)
dW[1]--> (3 , 2)
那么当多个训练样本时维度公式又是怎么样的呢?由前面的文章我们知道,多个样本时,我们会通过向量化来提升效率,例如我们会将每个样本的特征x列向量(也就是a[0])一个一个排起来,组成一个矩阵。
下面给出m个训练样本时的维度公式
W[l]--> (n[l], n[l-1])-->和单个样本时一样,因为多个样本它们都共用一套W
b[l]--> (n[l], 1) -->和单个样本时一样,因为多个样本它们都共用一套b
Z[l]--> (n[l], m)
A[l]--> (n[l], m)
dA[l]--> (n[l], m)
dZ[l]--> (n[l], m)
db[l]--> (n[l], 1) --> db也只有一套,根据公式db = np.sum(dZ) / m可知,db取的是一个平均值
dW[l]--> (n[l], n[l-1])--> dW也只有一套,同理db
领取专属 10元无门槛券
私享最新 技术干货