上一节之中我们了解了如何在Python之中实现前向传播,但是通过硬编码每个神经元的代码行过于繁琐,我们不妨尝试些更加一般的实现方法。
以下内容有任何不理解可以翻看我之前的博客哦
文章目录
在Numpy之中实现前向传播
直接上代码:
使用上一节中用过的例子:
我们先初始化下各个变量:
W = np.array([
[1, -3, 5],
[2, 4, -6]])
b = np.array([-1, 1, 2])
a_in= np.array([-2, 4])
一般写法是这样的:
def dense(a_in, W, b, g)
在这里我们定义了一个fuction名叫dense,事实上我们是定义了一个密集层,其中,a_in是第0层,也就是特征向量;W,b是激活函数里面的参数,g代表的是sigmoid函数。
def dense(a_in, W, b, g):
units = W.shape[1]# .shape(0)代表行数,.shape(1)代表列数,该段代码通过获取w的列数从而获得了神经元的个数
a_out = np.zeros(units)# np.zeros():可以生成元素个数为units个的向量,该行创建了最终激活值大小的零向量
for j in range units:# 将j从0到(units-1)进行循环
w = W[:,j]# 拉出了W的第j列,其中‘:’表示进行切片操作,冒号左右为空的表示取出所有的行,冒号之后表示取出第j列,因此每次是取出了一列
z = np.dot(w, a_in) + b[j]# 激活函数内的变量
a_out[j] = g(z)# 将z套入sigmoid函数之中
return a_out
注意,以上的步骤看上去其实有点复杂,这里其实是手动进行了矩阵乘法运算,在后面的章节会直接使用矩阵乘法的。
多密集层连接
在学会写一层密集层之后,可以尝试着将多个密集层连接在一起,利用sequential():
def sequential(x):
a1 = dense(x, W1, b1)
a2 = dense(a1, W2, b2)
a3 = dense(a2, W3, b3)
a4 = dense(a3, W4, b4)
f_x = a4
return a4
我相信,如果你看了我之前的博客,这段代码一定很好理解,就是一个前向传播。
今天 的代码实际上是比较偏底层的,这样对以后编写代码出现问题之后会有很大帮助。
为了给读者你造成不必要的麻烦,博主的所有视频都没开仅粉丝可见,如果想要阅读我的其他博客,可以点个小小的关注哦。