日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用numpy实现神经网络模块

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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实现神经网络模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。