使用numpy实现神经网络模块
生活随笔
收集整理的這篇文章主要介紹了
使用numpy实现神经网络模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class Network(object):def __init__(self, num_of_weights):# 隨機產生w的初始值# 為了保持程序每次運行結果的一致性,此處設置固定的隨機數種子np.random.seed(0)self.w = np.random.randn(num_of_weights, 1)self.b = 0.def forward(self, x):z = np.dot(x, self.w) + self.breturn zdef loss(self, z, y):error = z - ynum_samples = error.shape[0]cost = error * errorcost = np.sum(cost) / num_samplesreturn costdef gradient(self, x, y):z = self.forward(x)gradient_w = (z-y)*xgradient_w = np.mean(gradient_w, axis=0)gradient_w = gradient_w[:, np.newaxis]gradient_b = (z - y)gradient_b = np.mean(gradient_b)return gradient_w, gradient_b
# 調用上面定義的gradient函數,計算梯度
# 初始化網絡
net = Network(13)
# 設置[w5, w9] = [-100., -100.]
net.w[5] = -100.0
net.w[9] = -100.0z = net.forward(x)
loss = net.loss(z, y)
gradient_w, gradient_b = net.gradient(x, y)
gradient_w5 = gradient_w[5][0]
gradient_w9 = gradient_w[9][0]
print('point {}, loss {}'.format([net.w[5][0], net.w[9][0]], loss))
print('gradient {}'.format([gradient_w5, gradient_w9]))
point [-100.0, -100.0], loss 686.3005008179159
gradient [-0.850073323995813, -6.138412364807849]運行上面的代碼,可以發現沿著梯度反方向走一小步,下一個點的損失函數的確減少了。感興趣的話,大家可以嘗試不停的點擊上面的代碼塊,觀察損失函數是否一直在變小。在上述代碼中,每次更新參數使用的語句: net.w[5] = net.w[5] - eta * gradient_w5相減:參數需要向梯度的反方向移動。
eta:控制每次參數值沿著梯度反方向變動的大小,即每次移動的步長,又稱為學習率。
大家可以思考下,為什么之前我們要做輸入特征的歸一化,保持尺度一致?這是為了讓統一的步長更加合適。如 圖8 所示,特征輸入歸一化后,不同參數輸出的Loss是一個比較規整的曲線,學習率可以設置成統一的值 ;特征輸入未歸一化時,不同特征對應的參數所需的步長不一致,尺度較大的參數需要大步長,尺寸較小的參數需要小步長,導致無法設置統一的學習率。
圖8:未歸一化的特征,會導致不同特征維度的理想步長不同
總結
以上是生活随笔為你收集整理的使用numpy实现神经网络模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 | Leveraging Kn
- 下一篇: Docker的基本使用(部署python