Python實現簡單的神經網路

来源:https://www.cnblogs.com/123456feng/archive/2022/04/20/16165889.html
-Advertisement-
Play Games

在說神經網路之前,我們討論一下神經元(Neurons),它是神經網路的基本單元。神經元先獲得輸入,然後執行某些數學運算 後,再產生一個輸出。比如一個2輸入神經元的例子: 在這個神經元里,輸入總共經歷了3步數學運算,先將輸入乘以權重(weight): 最後經過激活函數(activation funct ...


在說神經網路之前,我們討論一下神經元(Neurons),它是神經網路的基本單元。神經元先獲得輸入,然後執行某些數學運算

後,再產生一個輸出。比如一個2輸入神經元的例子:

在這裡插入圖片描述

在這個神經元里,輸入總共經歷了3步數學運算,先將輸入乘以權重(weight):

在這裡插入圖片描述

最後經過激活函數(activation function)處理得到輸出:

在這裡插入圖片描述

激活函數的作用是將無限制的輸入轉換為可預測形式的輸出。一種常用的激活函數是sigmoid函數:

在這裡插入圖片描述

sigmoid函數的輸出介於0和1,我們可以理解為它把 (−∞,+∞) 範圍內的數壓縮到 (0, 1)以內。正值越大輸出越接近1,負向數值越

大輸出越接近0。舉個例子,上面神經元里的權重和偏置取如下數值:

在這裡插入圖片描述

在這裡插入圖片描述

以上步驟的Python代碼是:

Python學習交流Q群:906715085###
import numpy as np

def sigmoid(x):

    # our activation function: f(x) = 1 / (1 * e^(-x))

    return 1 / (1 + np.exp(-x))

class Neuron():

    def __init__(self, weights, bias):

        self.weights = weights

        self.bias = bias

    def feedforward(self, inputs):

        # weight inputs, add bias, then use the activation function

        total = np.dot(self.weights, inputs) + self.bias

        return sigmoid(total)

weights = np.array([0, 1]) # w1 = 0, w2 = 1

bias = 4

n = Neuron(weights, bias)

# inputs

x = np.array([2, 3])   # x1 = 2, x2 = 3

print(n.feedforward(x)) # 0.9990889488055994

 

搭建神經網路

神經網路就是把一堆神經元連接在一起,下麵是一個神經網路的簡單舉例:

在這裡插入圖片描述

這個網路有2個輸入、一個包含2個神經元的隱藏層(h1和h2)、包含1個神經元的輸出層o1。

隱藏層是夾在輸入輸入層和輸出層之間的部分,一個神經網路可以有多個隱藏層。

把神經元的輸入向前傳遞獲得輸出的過程稱為前饋(feedforward)。

我們假設上面的網路里所有神經元都具有相同的權重w = [ 0 , 1 ]]和偏置b = 0 ,激活函數都是 sigmoid,那麼我們會得到什麼輸出呢?

在這裡插入圖片描述

以下是實現代碼:

Python學習交流Q群:906715085###
class OurNeuralNetworks():

    """

    A neural network with:

      - 2 inputs

      - a hidden layer with 2 neurons (h1, h2)

      - an output layer with 1 neuron (o1)

    Each neural has the same weights and bias:

      - w = [0, 1]

      - b = 0

    """

    def __init__(self):

        weights = np.array([0, 1])

        bias = 0

        # The Neuron class here is from the previous section

        self.h1 = Neuron(weights, bias)

        self.h2 = Neuron(weights, bias)

        self.o1 = Neuron(weights, bias)

    def feedforward(self, x):

        out_h1 = self.h1.feedforward(x)

        out_h2 = self.h2.feedforward(x)

        # The inputs for o1 are the outputs from h1 and h2

        out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))

        return out_o1

network = OurNeuralNetworks()

x = np.array([2, 3])

print(network.feedforward(x)) # 0.7216325609518421

 

在這裡插入圖片描述

訓練神經網路

現在我們已經學會瞭如何搭建神經網路,現在再來學習如何訓練它,其實這是一個優化的過程。假設有一個數據集,包含4個人的

身高、體重和性別:

Name     Weight (lb)     Height (in)     Gender


Alice        133               65                      F 
Bob          160               72                      M 
Charlie      152             70                       M 
Diana        120             60                        F 

 

現在我們的目標是訓練一個網路,根據體重和身高來推測某人的性別。

在這裡插入圖片描述

為了簡便起見,我們將每個人的身高、體重減去一個固定數值,把性別男定義為1、性別女定義為0。

Name            Weight (減去135)                 Height (減去66)           Gender


Alice                  -2                                          -1                                0 
Bob                   25                                           6                                1 
Charlie             17                                            4                                1 
Diana             -15                                           -6                                 0 

 

在訓練神經網路之前,我們需要有一個標准定義它到底好不好,以便我們進行改進,這就是損失(loss)。

顧名思義,均方誤差就是所有數據方差的平均值,我們不妨就把它定義為損失函數。預測結果越好,損失就越低,訓練神經網路

就是將損失最小化。

如果上面網路的輸出一直是0,也就是預測所有人都是男性,那麼損失是

在這裡插入圖片描述

在這裡插入圖片描述

Python學習交流Q群:906715085###
def mse_loss(y_true, y_pred):

    # y_true and y_pred are numpy arrays of the same length

    return ((y_true - y_pred) ** 2).mean()

y_true = np.array([1, 0, 0, 1])

y_pred = np.array([0, 0, 0, 0])

print(mse_loss(y_true, y_pred)) # 0.5

 

在這裡插入圖片描述

減少神經網路損失

這個神經網路不夠好,還要不斷優化,儘量減少損失。我們知道,改變網路的權重和偏置可以影響預測值,但我們應該怎麼做

呢?為了簡單起見,我們把數據集縮減到只包含Alice一個人的數據。於是損失函數就剩下Alice一個人的方差:

在這裡插入圖片描述

預測值是由一系列網路權重和偏置計算出來的:

在這裡插入圖片描述

所以損失函數實際上是包含多個權重、偏置的多元函數:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

這個結果告訴我們:如果增大w1,損失函數L會有一個非常小的增長。

在這裡插入圖片描述

隨機梯度下降

下麵將使用一種稱為隨機梯度下降(SGD)的優化演算法,來訓練網路。經過前面的運算,我們已經有了訓練神經網路所有數據。

但是該如何操作?SGD定義了改變權重和偏置的方法:

在這裡插入圖片描述

從數據集中選擇一個樣本;

計算損失函數對所有權重和偏置的偏導數;

使用更新公式更新每個權重和偏置;

回到第1步。

隨著學習過程的進行,損失函數逐漸減小。

在這裡插入圖片描述

現在我們可以用它來推測出每個人的性別了:

# Make some predictions

emily = np.array([-7, -3]) # 128 pounds, 63 inches

frank = np.array([20, 2])  # 155 pounds, 68 inches

print("Emily: %.3f" % network.feedforward(emily)) # 0.951 - F

print("Frank: %.3f" % network.feedforward(frank)) # 0.039 - M

 

最後

今天的案例到這裡就結束了,喜歡的小伙伴可以點贊收藏加關註,有問題的小伙伴可以評論告訴我。然後,下一章見啦!!!

在這裡插入圖片描述


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

-Advertisement-
Play Games
更多相關文章
  • 在上篇“python中的類的創建、使用和繼承”中,創建了Person()和Student()兩個類,最後才是程式執行主體,如下: class Person(): #創建一個person類,父類必須包含在當前文件中,且位於子類前面。 def __init__(self, name, age,homet ...
  • 本文轉載自https://segmentfault.com/a/1190000019155991 初始化項目 使用 koa-generator 腳手架工具 npm install koa-generator -g #全局安裝 koa2 demo #創建demo項目 cd demo && npm in ...
  • 目錄 一.簡介 二.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 OpenGL (ES) 學習路 ...
  • 前言 最近公司有個PHP項目需要開發維護,之前一直都是跟著巨硬混的,現在要接觸PHP項目。學習一門新語言之前,先搭建好環境吧,鑒於公司項目是基於php 7.1.33 版本的,所以以下我使用的都是基於這個版本的。 下載安裝包 Nginx 下載 http://nginx.org/en/download. ...
  • JDK動態代理中:抽象類不可以被代理 沒有介面不可以被代理 在 Java 8之前,介面可以有常量變數和抽象方法。我們不能在介面中提供方法實現。如果我們要提供抽象方法和非抽象方法(方法與實現)的組合,那麼我們就得使用抽象類。 在 Java 8 介面引入了一些新功能——預設方法和靜態方法。 Java 9 ...
  • 前端除了用js++css+html,還有沒有其它辦法?其實python也可以 1. 安裝與基本流程 Python學習交流Q群:906715085### 安裝 PyWebIO 和其他的第三方庫一樣使用pip install PyWebIO就行,沒有任何難度,此處不做多講。 但是在正式講解一些常見的操作 ...
  • 什麼叫裝箱 & 拆箱? 將int基本類型轉換為Integer包裝類型的過程叫做裝箱,反之叫拆箱。 首先看一段代碼 public static void main(String[] args) { Integer a = 127, b = 127; Integer c = 128, d= 128; S ...
  • 總體來說註解這一塊的內容不是很多,歸納下來:1.註解的定義。2.註解的保存性策略(@Retention)和java內置註解3.註解的反射主要是跟前面的反射機制相結合,反射章節聽完基本都是相同的方法從類-方法--屬性來獲取。 4.註解的作用還是存在在java的反序列化漏洞,當然在java開發中也會有很... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...