用numpy搭建自己的神經網絡

搭建之前的基礎與思考

構建模型的基本思想:
構建深度學習的過程:產生idea,將idea轉化成code,最后進行experiment,之后根據結果修改idea,繼續idea–>code–>experiment的循環,直到最終訓練到表現不錯的深度學習網絡模型。

BP網絡的搭建

BPNN v-0.1

目標:搭建一個有學習能力的BP神經網絡。

目標完成情況:
●局限:只能計算固定大小的數據尺寸
●局限:只有一層,即為感知機或單層神經網絡

有一定了解的可以直接看到代碼,代碼注釋有思路。

idea

●神經元(單層感知機):接收n維列向量x(特征維度為n),輸出y的估計。
在這里插入圖片描述

多組輸入x,可以按列堆疊形成矩陣。

●激活函數:Sigmoid、ReLU等

在這里插入圖片描述

●損失函數:量化模型預測值與真實值的偏差,模型訓練的目的是讓Loss盡可能小。
例如:在這里插入圖片描述

成本函數就是所有訓練樣本損失函數的平均。

●反向傳播時的復合求導
在這里插入圖片描述

反向傳播時只需要計算每一層的導數,最后乘積即可。

整體復盤以及數據流向圖

請添加圖片描述

code

根據面向對象編程思想,有兩種實現思路,以神經元為最小類或以神經網絡為最小類。
這里為了有更清晰的層次選擇以神經元為最小類。

自己早數據,假設數據是學生的身高體重,根據此二者預測學生性別。

# Define dataset,已經經過預處理,保留特征
data = np.array([[-2, -1],  # Alice[25, 6],   # Bob[17, 4],   # Charlie[-15, -6], # Diana
])
all_y_trues = np.array([1, # Alice0, # Bob0, # Charlie1, # Diana
])

代碼:

import numpy as np# 激活函數與激活函數的求導
def sigmoid(x):return 1/(1 + np.exp(-x))
def d_sigomid(x):return sigmoid(x) * (1 - sigmoid(x))# 神經元
class Neuron:'''-神經元基本屬性包括權重和偏置量-神經元方法前向計算和反向傳遞-神經元默認接收二維的輸入'''#初始化,針對特定尺寸的數據集def __init__(self):self.weights = np.random.normal(size=(1, 2))self.bias = np.random.normal()#前向計算過程集成化,用于訓練完成后一步輸出預測值def feedforward(self, inputs):Z = np.dot(self.weights, inputs) + self.biasreturn sigmoid(Z)#訓練函數def train_epoch(self, x_data, true_value):'''-迭代目的是更新權重參數和偏置參數,為了得到梯度需要知道導數為了計算導數需要知道前向計算過程中的一些值。訓練時按照這個思路去計算需要的值,再更新權重就可以。'''#準備工作learn_rate = 0.1epochs = 100for epoch in range(epoch):for x, y_true in zip(x_data, ture_value):#前向計算z = np.dot(self.weight, inputs) + self.biasy = sigmoid(z)#損失函數采用平方差計算,求導較為容易#l = (y - true_value) ** 2  #只有需要查看效果的輪次才計算輸出#一般只需要知道l關于y的導數即可,并不需要計算l的值#反向傳播d_L_d_y = -2 * (y_true - y)d_y_d_z = d_sigmod(z)d_z_d_w1 = x1 d_z_d_w2 = x2 #實際計算可以合并很多步驟,這里分開寫為了使過程更清晰dw1 = d_L_d_y * d_y_d_z * d_z_d_w1dw2 = d_L_d_y * d_y_d_z * d_z_d_w2db = d_L_d_y * d_y_d_z#體現了反向計算的復合過程#更新self.w[0] -= learn_rate * dw1self.w[1] -= learn_rate * dw2self.b -= learn_rate * dbif epoch % 10 == 0:if epoch % 10 == 0:y_preds = np.apply_along_axis(self.feedforward, 1, data)loss = ((y_preds - y_true) ** 2).mean()print("Epoch %d loss %.3f" % (epoch, loss))BPNN = Neuron()
BPNN.train(data, all_y_trues)

experiment

記錄1

請添加圖片描述請添加圖片描述

嘗試調參,沒有效果
嘗試輸出一些中間值,發現預測結果是沒問題的,只是loss的計算有問題

請添加圖片描述

預測值是二維的列,真實值是一維的行,np廣播相減直接出來一個4*4的矩陣。做減法時加一個轉置就OK

記錄2

請添加圖片描述

原因很明顯,問題過于簡單且沒有噪音。
增加了一些數據并加入少量噪音。
在這里插入圖片描述

能明顯看到loss的下降過程,說明實驗成功。
請添加圖片描述

BPNN v-0.2向量化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717535.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matplotlib條形圖

matplotlib條形圖 假設你獲取到了2017年內地電影票房前20的電影(列表a)和電影票房數據(列表b), 那么如何更加直觀的展示該數據? from matplotlib import pyplot as plta ["Wolf Warrior 2", "Fast and Furious 8", "Kung Fu Yoga", "Jo…

【LiveData】LiveData轉換及操作符分析

使用示例 LiveData操作符可以將一個LiveData轉換為另一個LiveData 當源LiveData發生變更時&#xff0c;會自動通知目標LiveData val srcLiveData : LiveData<T>val dstLiveData : LiveData<R>dstLiveData srcLiveData.distinctUntilChanged().switchMap{returnsw…

線性表——單鏈表的增刪查改

本節復習鏈表的增刪查改 首先&#xff0c; 鏈表不是連續的&#xff0c; 而是通過指針聯系起來的。 如圖&#xff1a; 這四個節點不是連續的內存空間&#xff0c; 但是彼此之間使用了一個指針來連接。 這就是鏈表。 現在我們來實現鏈表的增刪查改。 目錄 單鏈表的全部接口…

位運算---求n的二進制表示中第k位是1還是0 (lowbit)

操作&#xff1a; 先把第k位移到最后一位&#xff08;右邊第一位&#xff09; 看個位是1還是0 lowbit(x)&#xff1a;返回x的最右邊的1。 原理&#xff1a; 其中 &#xff0c;意思是 是 的補碼。 就可以求出最右邊的一位1。 應用&#xff1a; 當中 的個數。 int re…

AI-數學-高中-33概率-事件的關系與運算

原作者視頻&#xff1a;【概率】【一數辭典】2事件的關系與運算_嗶哩嗶哩_bilibili 事件&#xff1a; 和/并事件&#xff1b;積/交事件&#xff1b;互訴事件&#xff1b;對立(補集)事件&#xff1b;

【詳識JAVA語言】面向對象程序三大特性之二:繼承

繼承 為什么需要繼承 Java中使用類對現實世界中實體來進行描述&#xff0c;類經過實例化之后的產物對象&#xff0c;則可以用來表示現實中的實體&#xff0c;但是 現實世界錯綜復雜&#xff0c;事物之間可能會存在一些關聯&#xff0c;那在設計程序是就需要考慮。 比如&…

04.其他方案

其他方案 1.事務狀態表調??重試接收?冪等 介紹 調??維護?張事務狀態表&#xff08;或者說事務?志、?志流?&#xff09;&#xff0c;在每次調?之前&#xff0c;落盤?條事務流?&#xff0c;?成?個全局的事務ID 事務開始之前的狀態是Begin&#xff0c;全部結束之…

Go語言進階篇——文件

文件的打開 文件的常見的兩種打開方式是基于os包所提供的兩個函數: func Open(name string) (*File,error) func OpenFile(name string flag int perm FileMode) (*File,error)相對于前者&#xff0c;OpenFile可以提供更加細致的操作&#xff0c;而前者就是對后者的一個簡單封…

碼垛工作站:食品生產企業的轉型助推器

在當今高度自動化的工業生產中&#xff0c;碼垛工作站的應用正逐漸成為一種趨勢。某食品生產企業在面臨市場競爭加劇、人工成本上升等多重壓力下&#xff0c;決定引入碼垛工作站&#xff0c;以期實現生產流程的升級與變革。 一、碼垛工作站引入背景 該企業主要從事休閑食品的…

Android 中的 LinearLayout 布局

在 Android 開發中&#xff0c;布局是至關重要的一部分&#xff0c;它決定了應用程序的界面結構和用戶體驗。LinearLayout 是 Android 中最常用的布局之一&#xff0c;它以線性方式排列子視圖&#xff0c;可以垂直或水平布局。在這篇博客中&#xff0c;我們將深入了解 LinearLa…

數據結構實現-棧和隊列

順序棧 #include <iostream> using namespace std; #define MaxSize 50//順序棧 template<typename ElemType> struct SqStack{ElemType data[MaxSize];int top; };//初始化 template<typename ElemType> void InitStack(SqStack<ElemType>&s){s.…

Postman和Jmeter的區別

1.用例組織方式不同 jmeter組織方式相對比較扁平&#xff0c;沒有工作空間的概念&#xff0c;直接就是測試計劃 postman組織方式會比較輕量級&#xff0c;只要是針對單個的HTTP請求 2.支持的接口類型與測試類型上 jmeter會更強大&#xff0c;可以支持REST、Soap等等&#xf…

Kotlin 協程遇見 Flow:打造更優雅的數據流處理

Kotlin Flow 是 Kotlin 協程庫中的一個組件&#xff0c;它提供了處理異步數據流的能力。Kotlin Flow 類似于 RxJava 中的 Observable&#xff0c;但它完全基于 Kotlin 協程設計&#xff0c;使得異步流的操作變得更加簡單和直觀。 Flow 是冷流&#xff08;cold stream&#xff…

【貪心算法】Leetcode 455.分發餅干 376. 擺動序列 53. 最大子數組和

【貪心算法】Leetcode 455 分發餅干 376. 擺動序列【規律很多】53. 最大子數組和 455 分發餅干局部最優推全局最優&#xff1a;盡量用大餅干去滿足大胃口的小朋友 376. 擺動序列【規律很多】思想&#xff1a;注意考慮一個坡度留首尾兩個點、平坡、首尾 53. 最大子數組和【好思想…

15.網絡游戲逆向分析與漏洞攻防-網絡通信數據包分析工具-發送通信數據包至分析工具

上一個內容&#xff1a;14.數據包分析工具界面與通信設計 碼云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 碼云版本號&#xff1a;2d6491e3c51a1a7ab4da0ee6dc4cf566a80fd6e1 代碼下載地址&#xff0c;在 titan 目錄下&…

模版進階C++

非類型模版 之前我們寫的模版都是在不知道模版&#xff08;類&#xff09;中有的變量的類型是什么的時候&#xff0c;我們先用模版參數定義&#xff0c;當類實例化的時候在傳參確認 非類型模版&#xff1a;模版參數定義的時候也可以定義整型類型&#xff08;c20之后才支持其…

奇點云:SAFe框架下,我們對平臺軟件工程生產線做了4項改造

導讀&#xff1a; 客戶規模擴大&#xff0c;如何保證大數據軟件產品和服務質量始終如一&#xff1f;幾乎所有成長中的軟件廠商&#xff0c;尤其是需要通過私有化部署交付的廠商&#xff0c;都會面臨這個問題。正如《人月神話》中多次表明的&#xff0c;單純地增加人手、擴大團隊…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的植物病害檢測系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發高效的植物病害檢測系統對于提升農業生產效率和作物健康管理意義重大。本篇博客詳細闡述了如何運用深度學習技術構建一個植物病害檢測系統&#xff0c;并提供了完整的實現代碼。該系統基于先進的YOLOv8算法&#xff0c;對YOLOv7、YOLOv6、YOLOv5進行了性能…

考研數學——高數:微分方程

一、一階線性微分方程 兩種形式&#xff1a; 非齊次&#xff1a; 齊次&#xff1a; 推導過程 推導公式的過程一般由特殊到一般&#xff1a;所以先求解齊次方程的解 &#xff08;然后對等式兩邊同時積分&#xff09; 再來求非齊次方程的解&#xff0c;由…

【測開求職】2023秋招快手一面面經

已經過了百度測開三面,快手這個一面比百度的要難很多,可能也是遇到了比較嚴格的面試官,感覺其他面經沒有這么難。30分鐘實習,20分鐘算法題,20分鐘八股,沒有問項目。 實習 diff遇到了哪些痛點diff是全量還是增量一些字段的增加或者枚舉值的增加可以用diff測嗎有哪些自動化…