08_多層感知機

1. 單層感知機

1.1 感知機

在這里插入圖片描述
在這里插入圖片描述

① 線性回歸輸出的是一個實數,感知機輸出的是一個離散的類。

在這里插入圖片描述

1.2 訓練感知機

① 如果分類正確的話y<w,x>為正數,負號后變為一個負數,max后輸出為0,則梯度不進行更新。

② 如果分類錯了,y<w,x>為負數,下圖中的if判斷就成立了,就有梯度進行更新。

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

1.3 收斂半徑

在這里插入圖片描述

1.4 XOR問題

在這里插入圖片描述

1.5 總結

在這里插入圖片描述

2. 多層感知機

在這里插入圖片描述

2.1 學習XOR

① 先用藍色的線分,再用黃色的線分。

② 再對藍色的線和黃色的線分出來的結果做乘法。

在這里插入圖片描述

2.2 單隱藏層

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

① 不用激活函數的話,所以全連接層連接在一起依舊可以用一個最簡單的線性函數來表示。

在這里插入圖片描述

2.3 Sigmoid 函數

在這里插入圖片描述

2.4 Tanh函數

在這里插入圖片描述

2.5 ReLU

① ReLU的好處在于不需要執行指數運算。

② 在CPU上一次指數運算相當于上百次乘法運算。

在這里插入圖片描述

2.6 多類分類

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

2.7 總結

在這里插入圖片描述

1. 多層感知機(使用自定義)

import torch
from torch import nn
from d2l import torch as d2lbatch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)# 實現一個具有單隱藏層的多層感知機,它包含256個隱藏單元
num_inputs, num_outputs, num_hiddens = 784, 10, 256 # 輸入、輸出是數據決定的,256是調參自己決定的
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True))
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True))
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1,b1,W2,b2]# 實現 ReLu 激活函數
def relu(X):a = torch.zeros_like(X) # 數據類型、形狀都一樣,但是值全為 0return torch.max(X,a)# 實現模型
def net(X):#print("X.shape:",X.shape)X = X.reshape((-1, num_inputs)) # -1為自適應的批量大小#print("X.shape:",X.shape)H = relu(X @ W1 + b1)#print("H.shape:",H.shape)#print("W2.shape:",W2.shape)return (H @ W2 + b2)# 損失
loss = nn.CrossEntropyLoss() # 交叉熵損失# 多層感知機的訓練過程與softmax回歸的訓練過程完全一樣
num_epochs ,lr = 30, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

在這里插入圖片描述

2. 多層感知機(使用框架)

① 調用高級API更簡潔地實現多層感知機。

import torch
from torch import nn
from d2l import torch as d2l# 隱藏層包含256個隱藏單元,并使用了ReLU激活函數
net = nn.Sequential(nn.Flatten(),nn.Linear(784,256),nn.ReLU(),nn.Linear(256,10))def init_weights(m):if type(m) == nn.Linear:nn.init.normal_(m.weight,std=0,)net.apply(init_weights)# 訓練過程
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()
trainer = torch.optim.SGD(net.parameters(), lr=lr)train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

在這里插入圖片描述

# 單層感知機函數
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l# 數據集
batch_size = 256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)# 初始化模型參數
num_inputs = 784
num_outputs = 10
num_hiddens = 256W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))params = [W1, b1]def relu(X):a = torch.zeros_like(X)return torch.max(X, a)# 定義網絡
def net(X):X = X.reshape((-1, num_inputs))H = relu(X @ W1 + b1)return H# loss = nn.CrossEntropyLoss(reduction='none')
loss = nn.CrossEntropyLoss()num_epochs, lr = 10, 0.1
# updater = torch.optim.SGD(params, lr=lr)
updater = torch.optim.Adam(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
# 3層感知機函數
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l# 數據集
batch_size = 256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)# 初始化模型參數
num_inputs = 784
num_outputs = 10
num_hiddens1 = 256
num_hiddens2 = 128W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens1, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens1, num_hiddens2, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_hiddens2, requires_grad=True))
W3 = nn.Parameter(torch.randn(num_hiddens2, num_outputs, requires_grad=True) * 0.01)
b3 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))params = [W1, b1,W2,b2,W3,b3]def relu(X):a = torch.zeros_like(X)return torch.max(X, a)# 定義網絡
def net(X):X = X.reshape((-1, num_inputs))H1 = relu(X @ W1 + b1)H2 = relu(H1 @ W2 + b2)return (H2 @ W3 + b3)# loss = nn.CrossEntropyLoss(reduction='none')
loss = nn.CrossEntropyLoss()
# 三層 學習率修改為0.01 效果會好一些
num_epochs, lr = 10, 0.01
# updater = torch.optim.SGD(params, lr=lr)
updater = torch.optim.Adam(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

在這里插入圖片描述

d2l.predict_ch3(net, test_iter)

在這里插入圖片描述

感知機(Perceptron)簡介

感知機(Perceptron)是最簡單的神經網絡模型之一,最早由 Frank Rosenblatt 在 1958 年提出。它是一個二分類模型,能夠根據輸入的特征,判斷一個樣本屬于哪一類。盡管感知機本身非常簡單,但它為后來的深度學習模型奠定了基礎,尤其是多層感知機(MLP)和其他神經網絡。

感知機是 線性分類器,意味著它只能對線性可分的任務進行有效的分類。對于無法用直線(或超平面)劃分的任務,單層感知機是無法處理的,但通過將其擴展到多層神經網絡,問題得到了很好的解決。

感知機的結構

感知機由以下幾個部分組成:

  1. 輸入層:感知機接受一個輸入向量 x=[x1,x2,...,xn]\mathbf{x} = [x_1, x_2, ..., x_n]x=[x1?,x2?,...,xn?],表示樣本的特征。
  2. 權重(Weights):每個輸入特征 xix_ixi? 都有一個對應的權重 wiw_iwi?
  3. 偏置項(Bias):為了使模型更具有表達能力,感知機還有一個偏置項 bbb
  4. 激活函數:感知機通常使用一個階躍函數(step function)作為激活函數,根據加權和與閾值的比較來決定輸出。
感知機的數學表示

感知機的輸出 yyy 是通過以下步驟計算的:

  1. 加權和

    z=∑i=1nwixi+b z = \sum_{i=1}^{n} w_i x_i + b z=i=1n?wi?xi?+b

    其中,xix_ixi? 是輸入特征,wiw_iwi? 是與 xix_ixi? 對應的權重,bbb 是偏置項。

  2. 激活函數(階躍函數):

    y={1if?z≥00if?z<0 y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{if } z < 0 \end{cases} y={10?if?z0if?z<0?

    這里,階躍函數(step function)會將加權和 zzz 映射為一個二值輸出 yyy

感知機的推理過程

推理過程是指給定輸入特征,感知機如何輸出分類結果。其推理過程可以通過以下幾個步驟來描述:

  1. 輸入:將樣本的特征 x=[x1,x2,...,xn]\mathbf{x} = [x_1, x_2, ..., x_n]x=[x1?,x2?,...,xn?] 輸入到感知機中。

  2. 加權和計算:感知機首先計算輸入特征和權重的加權和(即 z=∑i=1nwixi+bz = \sum_{i=1}^{n} w_i x_i + bz=i=1n?wi?xi?+b)。

  3. 激活函數應用:然后,感知機將加權和 zzz 傳遞給階躍激活函數,決定輸出是 1 還是 0。

    • 如果 z≥0z \geq 0z0,則輸出 1,表示樣本屬于一類。
    • 如果 z<0z < 0z<0,則輸出 0,表示樣本屬于另一類。
  4. 輸出:感知機的最終輸出 yyy 是二值化的分類結果(0 或 1)。

感知機的推理示例

假設我們有以下輸入特征 x=[x1,x2]\mathbf{x} = [x_1, x_2]x=[x1?,x2?],并且給定權重 w=[w1,w2]\mathbf{w} = [w_1, w_2]w=[w1?,w2?] 和偏置 bbb,感知機的輸出通過以下步驟計算:

  1. 輸入向量:x=[x1,x2]=[1.0,2.0]\mathbf{x} = [x_1, x_2] = [1.0, 2.0]x=[x1?,x2?]=[1.0,2.0]
  2. 權重:w=[w1,w2]=[0.5,0.5]\mathbf{w} = [w_1, w_2] = [0.5, 0.5]w=[w1?,w2?]=[0.5,0.5]
  3. 偏置項:b=?1.0b = -1.0b=?1.0

首先,計算加權和 zzz

z=w1?x1+w2?x2+b=0.5?1.0+0.5?2.0?1.0=0.5+1.0?1.0=0.5 z = w_1 \cdot x_1 + w_2 \cdot x_2 + b = 0.5 \cdot 1.0 + 0.5 \cdot 2.0 - 1.0 = 0.5 + 1.0 - 1.0 = 0.5 z=w1??x1?+w2??x2?+b=0.5?1.0+0.5?2.0?1.0=0.5+1.0?1.0=0.5

然后,使用階躍激活函數對 zzz 進行處理:

y={1if?z≥00if?z<0 y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{if } z < 0 \end{cases} y={10?if?z0if?z<0?

由于 z=0.5≥0z = 0.5 \geq 0z=0.50,所以 y=1y = 1y=1

感知機的訓練過程

感知機的訓練過程采用 感知機算法,該算法通過調整權重和偏置,使感知機的輸出盡量接近實際目標。

  1. 初始化權重和偏置:權重和偏置通常被初始化為小的隨機值。

  2. 預測輸出:對于每個訓練樣本,計算感知機的預測輸出。

  3. 計算誤差:根據實際標簽和預測輸出之間的差異計算誤差:

    誤差=ytrue?ypredicted \text{誤差} = y_{\text{true}} - y_{\text{predicted}} 誤差=ytrue??ypredicted?

  4. 權重更新:使用感知機學習規則來調整權重和偏置。如果預測錯誤,權重會根據誤差進行調整。更新公式如下:

    wi=wi+η?誤差?xi w_i = w_i + \eta \cdot \text{誤差} \cdot x_i wi?=wi?+η?誤差?xi?

    b=b+η?誤差 b = b + \eta \cdot \text{誤差} b=b+η?誤差

    其中 η\etaη 是學習率,控制更新的步長。

  5. 重復:通過迭代多個訓練樣本,直到誤差為零或達到最大迭代次數。

感知機的局限性

感知機有以下幾個限制:

  1. 線性可分性:感知機只能解決線性可分的問題。如果數據集是非線性可分的,感知機就無法準確分類。例如,無法分類像 XOR 問題那樣的非線性數據。

  2. 單層感知機:單層感知機是一個線性分類器,如果要處理更復雜的問題,我們需要將感知機擴展為多層感知機(MLP),即深度神經網絡。

總結

  • 感知機 是一種簡單的二分類模型,基于加權和和階躍激活函數進行推理。
  • 推理過程:通過計算輸入特征的加權和,然后使用階躍函數決定輸出類別(0 或 1)。
  • 訓練過程:通過感知機算法迭代調整權重和偏置,使得模型能夠正確分類訓練數據。
  • 局限性:感知機只能處理線性可分問題,無法解決復雜的非線性問題。

感知機的工作原理為后續的深度學習模型,如多層感知機(MLP)和卷積神經網絡(CNN),提供了基本的啟示。

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

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

相關文章

安卓實現miniLzo壓縮算法

LZO官方源碼 http://www.oberhumer.com/opensource/lzo 找到miniLZO點擊Dowload miniLZO下載源碼 http://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz demo源碼(包含安卓) https://github.com/xzw421771880/MiniLzo_Mobile.git 1.代碼部分 1.1.測試…

如何在ubuntu下用pip安裝aider,解決各種報錯問題

aider中文文檔網站上給出的安裝說明比較簡單&#xff1a; https://aider.doczh.com/docs/install.html 但是在一個干凈的ubuntu環境中按文檔中的命令安裝時&#xff0c;會報錯&#xff0c;經過一番嘗試之后&#xff0c;解決了報錯問題&#xff0c;成功完成了安裝。 成功安裝執…

Kotlin flow詳解

流式數據處理基礎 Kotlin Flow 是基于協程的流式數據處理 API&#xff0c;要深入理解 Flow&#xff0c;首先需要明確流的概念及其處理方式。 流(Stream)如同水流&#xff0c;是一種連續不斷的數據序列&#xff0c;在編程中具有以下核心特征&#xff1a; 數據按順序產生和消費支…

DeepSeek V3 深度解析:MoE、MLA 與 GRPO 的架構革新

簡介 DeepSeek&#xff08;深度求索&#xff09;是一家源自中國的人工智能公司&#xff0c;成立于2023年&#xff0c;總部位于中國杭州。前身是國內量化投資巨頭幻方量化的子公司。公司專注于開發低成本、高性能的AI模型&#xff0c;致力于通過技術創新推動人工智能技術的普惠…

Flask學習筆記(三)--URL構建與模板的使用

一、URL構建url_for()函數對于動態構建特定函數的URL非常有用。 該函數接受函數的名稱作為第一個參數&#xff0c;并接受一個或多個關鍵字參數&#xff0c;每個參數對應于URL的變量部分。from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/admin)def …

Pyside6 + QML - 從官方的例程開始

導言如上所示&#xff0c;登上Qt Pyside6的官方網址&#xff1a;https://doc.qt.io/qtforpython-6/index.html&#xff0c;點擊“Write your first Qt application”的"Start here!"按鈕。 效果&#xff1a;工程代碼&#xff1a; github:https://github.com/q1641293…

Python爬蟲實戰:研究Pandas,構建物聯網數據采集和分析系統

1. 引言 1.1 研究背景 物聯網(Internet of Things, IoT)作為新一代信息技術的重要組成部分,已廣泛應用于智能交通、環境監測、智慧家居等多個領域。據 Gartner 預測,到 2025 年全球物聯網設備數量將達到 750 億臺,產生的數據量將突破 zettabyte 級別。物聯網平臺作為數據…

深度學習入門基石:線性回歸與 Softmax 回歸精講

一、線性回歸&#xff1a;從房價預測看懂 “連續值預測” 邏輯 線性回歸是深度學習的 “敲門磚”&#xff0c;它的核心思想是用線性關系擬合數據規律&#xff0c;解決連續值預測問題—— 比如根據房屋特征估算房價、根據溫度濕度預測降雨量等。 1. 從生活案例到數學模型 拿房價…

GPT-5-Codex CLI保姆級教程:獲取API Key配置與openai codex安裝詳解

朋友們&#xff0c;就在 2025 年 9 月中旬&#xff0c;OpenAI 悄悄扔下了一顆重磅炸彈&#xff1a;GPT-5-Codex。 如果你以為這只是又一次平平無奇的模型升級&#xff0c;那可就大錯特錯了。 我可以這么說&#xff1a;軟件開發的游戲規則&#xff0c;從這一刻起&#xff0c;可能…

基于Spark的用戶實時分析

Spark的最簡安裝 1. 下載并解壓 Spark 首先,我們需要下載 Spark 安裝包。您可以選擇以下方式之一: 方式一:從官網下載(推薦) # 在 hadoop01 節點上執行 cd /home/hadoop/app wget https://archive.apache.org/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz方…

OpenCV 風格遷移、DNN模塊 案例解析及實現

圖像風格遷移是計算機視覺領域極具趣味性的技術之一 —— 它能將普通照片&#xff08;內容圖像&#xff09;與藝術畫作&#xff08;風格圖像&#xff09;的特征融合&#xff0c;生成兼具 “內容輪廓” 與 “藝術風格” 的新圖像。OpenCV 的 DNN&#xff08;深度神經網絡&#x…

MySQL 日志:undo log、redo log、binlog以及MVCC的介紹

一、MySQL 日志&#xff1a;undo log、redo log、binlogundo log&#xff08;回滾日志&#xff09;&#xff1a;是 Innodb 存儲引擎層生成的日志&#xff0c;實現了事務中的原子性&#xff0c;主要用于事務回滾和 MVCC&#xff08;隔離性&#xff09;。 redo log&#xff08;重…

【面板數據】省及地級市農業新質生產力數據集(2002-2025年)

農業新質生產力是以科技創新為核心驅動力&#xff0c;以科技化、數字化、網絡化和智能化為主線&#xff0c;通過技術革命性突破、生產要素創新性配置、產業深度轉型升級&#xff0c;實現農業全要素生產率顯著躍升的先進生產力形態 本數據基于2002-2025年各省政府工作報告中關于…

20250917在榮品RD-RK3588-MID開發板的Android13系統下使用tinyplay播放wav格式的音頻

input keyevent 24 1|console:/sdcard # cat /proc/asound/cards console:/sdcard # ls -l /dev/snd/【需要打開Android13內置的音樂應用才會有聲音出來&#xff0c;原因未知&#xff01;】 1|console:/sdcard # tinyplay /sdcard/Music/kiss8.wav -D 1 -d 020250917在榮品RD-R…

總共分為幾種IP

IP&#xff08;Internet Protocol&#xff09;地址根據不同的分類標準可分為多種類型&#xff0c;以下是常見的分類方式&#xff1a;按版本分類IPv4&#xff1a;32位地址&#xff0c;格式為四組十進制數字&#xff08;如192.168.1.1&#xff09;&#xff0c;約43億個地址&#…

【Linux】常用命令(六)

【Linux】常用命令&#xff08;六&#xff09;1. yum命令1.1 基本語法1.2 常用命令2. 從服務器把數據cp到本地3. uname命令3.1 常用命令1. yum命令 全稱&#xff1a;Yellowdog Updater, Modified作用&#xff1a;是 RPM 包管理器的前端工具&#xff0c;用于基于 RPM 的 Linux …

go grpc開發使用

1、安裝proto 下載 Windows 版本 打開官方發布頁面 訪問 Protocol Buffers 的 GitHub Releases 頁面&#xff1a; &#x1f449; https://github.com/protocolbuffers/protobuf/releases 解壓 ZIP 文件 將下載的 ZIP 文件解壓到一個你容易找到的目錄&#xff0c;例如&#xff1…

MyBatis分頁:PageHelper

MyBatis分頁&#xff1a;PageHelper &#x1f4d6; 前言&#xff1a;為什么需要分頁&#xff1f; 在處理大量數據時&#xff0c;一次性從數據庫查詢并返回所有結果是不可行的&#xff0c;這會帶來巨大的性能和內存開銷。分頁是解決這一問題的標準方案。而PageHelper是一個極其流…

Gin框架:構建高性能Go Web應用

Gin框架&#xff1a;構建高性能Go Web應用 Gin是Go語言中最受歡迎的Web框架之一&#xff0c;以其高性能、簡潔API和豐富的中間件支持而聞名。本文將帶你從零開始&#xff0c;逐步掌握Gin框架的核心概念和高級特性&#xff0c;并通過實際代碼示例演示如何構建高效的Web應用程序。…

IO進程——線程、IO模型

一、線程Thread1、引入1.1 概念相當于是一個輕量級的進程&#xff0c;為了提高系統的性能引入線程&#xff0c;在同一進程中可以創建多個線程&#xff0c;共享進程資源1.2 進程和線程比較相同點&#xff1a;都為操作系統提供了并發執行的能力不同點&#xff1a;調度和資源&…