Make your own neural network(Python神經網路編程)一

来源:https://www.cnblogs.com/powerzzjcode/archive/2018/11/07/9919797.html
-Advertisement-
Play Games

這本書應該算我第一本深度學習的代碼入門書了吧,之前看阿裡云云棲社和景略集智都有推薦這本書就去看了, 成功建立了自己的第一個神經網路,也瞭解一些關於深度學習的內容,再加上這學期的概率論與數理統計的課, 現在再來看李大大的機器學習課程,終於能看懂LogisticsRegression概率那部分公式!不至 ...


  這本書應該算我第一本深度學習的代碼入門書了吧,之前看阿裡云云棲社和景略集智都有推薦這本書就去看了,

  成功建立了自己的第一個神經網路,也瞭解一些關於深度學習的內容,再加上這學期的概率論與數理統計的課,

  現在再來看李大大的機器學習課程,終於能看懂LogisticsRegression概率那部分公式!不至於像之前暑假看的那麼懵逼了。

  如果有大佬看了我的博客發現錯誤。請一定要告訴我,畢竟我才學了1個月都不到,博客是我強制自己去總結去反思的。有錯誤一定要告訴我啊!!!

  廢話不多說了,我整理了這本書中的內容,再加上一點我自己的收集,直接從第二章的Python實現開始寫,第一章內容穿插在裡面進行講解。我是用的是jupyter,具體安裝過程就不細說了。

  將神經網路寫成一個類,可以適用於各種場景,可以用來創景不同大小的網路,這本書寫的是一個三層神經網路,輸入層,隱藏層,輸出層

  大體框架就是

  ①初始化函數 -- 設定輸入層節點數,隱藏層節點數,輸出層節點數

  ②訓練 --學習給定訓練集的樣本,優化權重

  ③查詢--給定的輸入,輸出結果

  我分幾次博客來寫吧。。。一次太長了。。。。

#神經網路類定義
class neuralNetwork:
    
    #初始化神經網路
    def __init__():
        pass
    
    #訓練神經網路
    def train():
        pass
    
    #查詢神經網路的結果
    def query():
        pass

  首先先是①初始化神經網路

  我們需要設置的是輸入層節點數,隱藏層節點數,輸出層節點數,以及學習率(每一次迭代的步長),然後給到類裡面

  

 #初始化神經網路
    def __init__(self,inputnodes,hiddennodes,outputnodes,
                learningrate):
        #設置的是輸入層節點數,隱藏層節點數,輸出層節點數
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        
        #設置學習率
        self.lr = learningrate
        pass

   然後初始化設置每層三個節點,看看是否運行成功。

#輸入層節點數,隱藏層節點數,輸出層節點數
input_nodes = 3
hidden_nodes = 3
output_nodes = 3

#learning rate is 0.3
learning_rate = 0.3

#實例化神經網路
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,
                 learning_rate)

  雖然沒實現任何功能,但是至少沒報錯。

  之後先來說說S閾值函數

  S閾值函數是什麼?乾什麼?怎麼用?

  神經網路模擬人的大腦的神經元的工作方式,神經元的工作方式是抑制輸入,直到輸入增強到一定的閾值就可以觸發輸出

,因為神經元不希望傳遞微小的雜訊信號。有許多激活函數可以使用,我們這裡使用最常用的S函數用單詞sigmoid表示,也叫邏輯函數。

  具體這個S函數怎麼來的,是從貝葉斯公式發展過來的,這裡就不細說了。

它是用來乾什麼的?是為了讓輸入的值和輸出的值不是線性的,為了後面的權重優化非線性誤差梯度。但是說到底還是為了模仿神經元的工作原理

它怎麼用?就是一個代入x得到y的簡單代數公式罷了。

 

  回到我們的主題。接下來就是神經網路的核心--權重的初始化了。

  神經網路中的權重是什麼?乾什麼?怎麼用?這三個問題先來說明一下。

  我先以一個兩層每層兩個節點的神經網路進行說明。

首先權重是什麼。一個神經網路會若幹個輸入,第一層輸入層,只做輸入(重點)!

  權重就是賦予圖中綠線一定的數值,代表前一個節點的輸出的數值傳到後一個節點的輸入的占比,權重最初是隨機出來的,之後要一點點調節,這個後面再說。

權重乾什麼?

  這張圖應該就能看出來權重的作用了,得到輸入值,各自和權重相乘然後求和,然後代入我們的S函數中得到一個值,就作為我們的輸出y

  假設給兩層神經網路隨機以下權重。是指前一層的第一個節點到下一層第一個節點的權重

   那麼第二層的節點1,的計算過程就是x = (1.0*0.9)+(0.5*0.3) = 1.05

  然後把x的值代入S函數中 y = 1/(1+e^1.05) = 0.7408

  到此,我們經歷了一個節點的全過程,但是很明顯這種枯燥乏味的活不適合人去做,我們需要電腦來幫我們做

  但是,每一個節點都有不同的權重,難道我們對每一個節點都要單獨敲一行代碼嗎?

權重怎麼用?我們用矩陣來完成全部計算過程,電腦已經很好的和矩陣一起工作了,矩陣相乘的計算基礎也不多說了

  直接看看結果

  第一個矩陣就是權重矩陣,權重矩陣第一列是前一層第一個節點到下一層所有節點依次的權重。

  第二個矩陣就是輸入矩陣,必須是列向量,否則,你也乘不出來我們要的結果啊。

  右邊就是矩陣相乘的結果,也是一個列向量,從上到下依次代表下一層節點的輸入值

  然後把這個矩陣簡化一下就是,這樣不管矩陣裡面有2個還是200個,都能用這個公式表示

  最後就是把我們的輸入矩陣X,代入我們的S函數中,輸出矩陣O就是sigmoid(X)

 

  回到我們的程式之中,我們現在要處理三層每層三個神經網路的問題,但是精髓是不變的

  我們要隨機一個輸入層和隱藏層的權重矩陣,還要隨機一個隱藏層和輸出層的權重矩陣,取值是-1到+1

  這裡講解一下,為什麼要隨機呢,因為後面訓練要從不同的初始值找極值,來優化權重,所以我們不能在一棵樹上吊死。

  其次為什麼是-1到+1,可以看我們的S函數的圖,在<-1和>1的情況下都是斜率很小的,不適合後面優化權重,為了電腦不會跑宕機,就選-1到1。

  當然權重矩陣有一種經驗上的較好的取值方法,我最後再講,

  隨機數的生成我用numpy來實現

#初始化權重函數
        #初始化輸入層到隱藏層的權重矩陣
        self.wih = np.random.rand(self.hnodes,self.inodes)-0.5  #rand只出現0-1,所以-0.5為了能出現負數
        #初始化隱藏層到輸出層的權重矩陣
        self.who = np.random.rand(self.onodes,self.hnodes)-0.5

  特比說明一下權重矩陣的大小一定是(後一層的節點數X前一層的節點數),一列中每一行對應下一層的每一個節點,所以行數為下一層的節點數,

  可以看看前面那個權重矩陣的解釋自己感受一下那個feel。

  

至此我們的初始化快要完成了。時間不早了,後面的就下一次博客寫了。附上我的代碼

import numpy as np
#神經網路類定義
class neuralNetwork:
    
    #初始化神經網路
    def __init__(self,inputnodes,hiddennodes,outputnodes,
                learningrate):
        #設置的是輸入層節點數,隱藏層節點數,輸出層節點數
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        
        #設置學習率
        self.lr = learningrate
        
        #初始化權重函數
        #初始化輸入層到隱藏層的權重矩陣
        self.wih = np.random.rand(self.hnodes,self.inodes)-0.5  #-0.5為了能出現負數
        #初始化隱藏層到輸出層的權重矩陣
        self.who = np.random.rand(self.onodes,self.hnodes)-0.5
        
        pass
    
    #訓練神經網路
    def train():
        pass
    
    #查詢神經網路的結果
    def query():
        pass

#輸入層節點數,隱藏層節點數,輸出層節點數
input_nodes = 3
hidden_nodes = 3
output_nodes = 3

#learning rate is 0.3
learning_rate = 0.3

#實例化神經網路
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,
                 learning_rate)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單工廠模式又稱為靜態工廠模式是設計模式的基礎模式,本文首先介紹了創建型設計模式的特點,使用場景,然後介紹了簡單工廠模式的概念,特點,示例代碼,以及簡單工廠模式的缺點 ...
  • XWAF提供了上傳文件的HttpFileUploader工具類,具備強大的多文件上傳、文件類型過濾、文件大小限制、存儲目錄設置、文件名稱更改等功能,簡化了Web應用開發的編程工作。 它能同時解析表單參數和文件域,不僅能夠將文件保存到伺服器上,還能同時提取表單參數的值。 ...
  • 本教程基於angular7(2018 11 04) 1. 安裝node.js 下載地址: http://nodejs.cn/download/ 下載對應自己操作系統的版本安裝即可。 2.安裝 angular cli開發套件 安裝命令: 3.創建一個新的項目 ​ 會自動打開瀏覽器並預覽項目,如不能自動 ...
  • 在程式運行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤代碼,這樣,就可以知道是否有錯,以及出錯的原因。在操作系統提供的調用中,返回錯誤碼非常常見。比如打開文件的函數open(),成功時返迴文件描述符(就是一個整數),出錯時返回-1。 用錯誤碼來表示是否出錯十分不便,因為函數本身應該返回的正常結 ...
  • 一個基於Spring boot的一個demo: Java配置中開戶對Scheduled的支持 import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.anno ...
  • python的基本數據類型: 1.基本數據 1.1. 數字類型 1.1.1 整數 int int() #將括弧內內容轉化為整數類型。 1.1.2 浮點數 float 1.1.3 複數 complex 1.2. 字元串類型 1.2.1 文本str (Python3中預設編碼格式為utf-8,pytho ...
  • 從鍵盤輸入並保存 public static void main(String[] args) { Scanner reader = new Scanner(System.in); /使用Scanner庫進行輸入操作 int[] a = new int[10]; /創建併為數組a[ ]分配大小 fo ...
  • web server 快速入門 運行一個簡單的web server 為了實現web server, 首先需要實現request handler 一個 request handler 必須是一個coroutine (協程), 它接受一個Request實例作為其唯一參數,並返回一個Response 實例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...