神經網絡與深度學習Python入門

一、神經網絡基礎

1. 神經元模型

在神經網絡中,最基本的單元是神經元(Neuron),也稱為節點或單元。它模擬了生物神經系統中的神經元行為。一個典型的神經元模型包含多個輸入(x1,x2,…,xnx_1, x_2, \ldots, x_nx1?,x2?,,xn?),每個輸入都對應一個權重(w1,w2,…,wnw_1, w_2, \ldots, w_nw1?,w2?,,wn?),以及一個偏置(bias)。神經元的輸出(yyy)通過激活函數(Activation Function)計算得出,公式如下:

y=f(∑i=1nwixi+b) y = f\left(\sum_{i=1}^{n} w_i x_i + b\right) y=f(i=1n?wi?xi?+b)

其中,fff 表示激活函數,常見的激活函數有Sigmoid、Tanh和ReLU等。

代碼示例:

import numpy as npdef sigmoid(z):return 1 / (1 + np.exp(-z))def neuron_output(weights, inputs, bias):z = np.dot(weights, inputs) + biasreturn sigmoid(z)weights = np.array([0.5, -0.2, 0.1])
inputs = np.array([1.0, 0.5, -1.5])
bias = 0.3output = neuron_output(weights, inputs, bias)
print("Neuron output:", output)
2. 激活函數

激活函數引入非線性特性,使得神經網絡能夠學習復雜的模式。常用的激活函數包括:

  • Sigmoid: 將輸入映射到(0,1)區間,適用于二分類問題。
  • Tanh: 將輸入映射到(-1,1)區間,輸出均值為0,收斂速度比Sigmoid快。
  • ReLU(Rectified Linear Unit): 當輸入大于0時輸出輸入值,否則輸出0,緩解梯度消失問題,加速訓練。

代碼示例:

def tanh(z):return np.tanh(z)def relu(z):return np.maximum(0, z)# 示例比較不同激活函數
z = np.array([-2.0, -1.0, 0.0, 1.0, 2.0])
print("Sigmoid:", sigmoid(z))
print("Tanh:", tanh(z))
print("ReLU:", relu(z))

二、前饋神經網絡結構

1. 多層感知機(MLP)

前饋神經網絡由輸入層、一個或多個隱藏層及輸出層組成。每一層由多個神經元構成,層與層之間全連接。信息從輸入層流向輸出層,無反饋連接。

架構示意:

輸入層 -> 隱藏層1 -> 隱藏層2 -> ... -> 輸出層

代碼示例:

from keras.models import Sequential
from keras.layers import Dense# 構建一個簡單的三層MLP
model = Sequential()
model.add(Dense(units=32, activation='relu', input_dim=784))  # 輸入層(假設輸入為28x28圖像)
model.add(Dense(units=64, activation='relu'))                 # 隱藏層1
model.add(Dense(units=10, activation='softmax'))              # 輸出層(10類分類)
2. 前向傳播過程

在前向傳播中,輸入數據通過網絡層層傳遞,每層的輸出作為下一層的輸入。最終,輸出層的輸出即為模型的預測結果。

代碼示例:

# 使用Keras進行前向傳播
import tensorflow as tf
from tensorflow.keras.datasets import mnist# 加載數據
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 784).astype('float32') / 255
x_test = x_test.reshape(-1, 784).astype('float32') / 255
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)# 編譯模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 訓練模型
model.fit(x_train, y_train, epochs=5, batch_size=32)# 評估模型
loss, accuracy = model.evaluate(x_test, y_test)
print(f"Test Accuracy: {accuracy*100:.2f}%")

三、損失函數與優化器

1. 損失函數

損失函數衡量模型預測與真實標簽之間的差異,指導模型參數的調整。常見的損失函數包括:

  • 均方誤差(MSE): 常用于回歸問題。
  • 交叉熵損失(Cross-Entropy Loss): 常用于分類問題,特別是多類別分類。
  • 二元交叉熵(Binary Cross-Entropy): 適用于二分類問題。

代碼示例:

from keras.losses import binary_crossentropy, categorical_crossentropy, mean_squared_error# 示例計算損失
y_true = np.array([1, 0, 0])
y_pred = np.array([0.8, 0.1, 0.1])# 多類別交叉熵
loss_ce = categorical_crossentropy(y_true, y_pred)
print("Categorical Cross-Entropy Loss:", loss_ce)# 二類別交叉熵
loss_bce = binary_crossentropy(y_true[0], y_pred[0])
print("Binary Cross-Entropy Loss:", loss_bce)
2. 優化器

優化器通過調整模型參數以最小化損失函數。常用的優化算法包括:

  • 梯度下降(Gradient Descent): 最基本的優化方法,但收斂速度慢。
  • 隨機梯度下降(SGD): 每次使用一個樣本更新參數,速度快但波動大。
  • 動量(Momentum): 引入動量項,加速收斂并減少震蕩。
  • 自適應學習率方法:
    • Adagrad: 根據參數梯度的歷史累積調整學習率。
    • RMSprop: 結合動量和Adagrad的優點,適應性更強。
    • Adam: 結合了動量和RMSprop,廣泛使用的優化器。

代碼示例:

from keras.optimizers import SGD, Adam# 使用SGD優化器
sgd_optimizer = SGD(learning_rate=0.01, momentum=0.9)
model.compile(optimizer=sgd_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])# 使用Adam優化器
adam_optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=adam_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

四、反向傳播算法

1. 反向傳播原理

反向傳播(Backpropagation)是通過計算損失函數相對于每個參數的梯度,來更新網絡參數的過程。具體步驟包括:

  1. 前向傳播: 計算每一層的激活值和最終輸出。
  2. 計算損失: 比較輸出與真實標簽,計算損失。
  3. 反向傳播: 從輸出層開始,逐層向后計算梯度。
  4. 參數更新: 根據梯度和優化器規則更新權重和偏置。
2. 梯度計算與鏈式法則

反向傳播依賴于鏈式法則(Chain Rule),即復合函數的導數等于各函數導數的乘積。對于每一層,梯度通過激活函數的導數和權重矩陣傳遞回前一層。

代碼示例:

# 簡化的反向傳播示例(手動實現單層)
import numpy as np# 定義簡單的兩層網絡
input_data = np.array([[0.1, 0.2]])
weights = np.array([[0.5, -0.3], [0.2, 0.4]])
bias = np.array([0.1, -0.1])# 前向傳播
hidden_layer = sigmoid(np.dot(input_data, weights) + bias)
print("Hidden Layer Output:", hidden_layer)# 假設真實標簽為[0,1]
true_labels = np.array([[0, 1]])# 計算損失(使用MSE)
loss = np.mean((hidden_layer - true_labels) ** 2)
print("Loss:", loss)# 反向傳播:計算梯度
delta = hidden_layer - true_labels
dW = np.dot(input_data.T, delta)
db = np.sum(delta, axis=0)
print("Gradient dW:", dW)
print("Gradient db:", db)

五、訓練與驗證

1. 數據集劃分

為了評估模型的泛化能力,通常將數據集劃分為訓練集、驗證集和測試集。訓練集用于模型學習,驗證集用于調參和監控訓練過程,測試集用于最終評估。

代碼示例:

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris# 加載數據
data = load_iris()
X = data.data
y = data.target# 將多類別標簽轉換為one-hot編碼
y = tf.keras.utils.to_categorical(y, num_classes=3)# 劃分訓練集和測試集(80%訓練,20%測試)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 過擬合與正則化

過擬合指模型在訓練集上表現良好,但在驗證集或測試集上表現較差。常見防止過擬合的方法包括:

  • L1和L2正則化: 在損失函數中添加權重絕對值或平方和的懲罰項,限制權重大小。
  • Dropout: 在訓練過程中隨機“丟棄”一部分神經元,減少神經元間的依賴。
  • 早停(Early Stopping): 當驗證性能不再提升時停止訓練,防止過擬合。

代碼示例:

from keras.layers import Dropout
from keras.regularizers import l2
from keras.callbacks import EarlyStopping# 添加L2正則化和Dropout層
model = Sequential()
model.add(Dense(units=64, activation='relu', kernel_regularizer=l2(0.01), input_dim=4))
model.add(Dropout(0.5))  # Dropout比例為50%
model.add(Dense(units=3, activation='softmax'))# 編譯模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 添加早停回調
early_stop = EarlyStopping(monitor='val_loss', patience=5)

六、實戰案例:手寫數字識別

1. MNIST數據集介紹

MNIST是一個廣泛用于手寫數字識別的數據集,包含6萬張訓練圖像和1萬張測試圖像,每張圖像為28x28像素的灰度圖,對應數字0-9。該數據集簡單且具有代表性,適合初學者實踐神經網絡。

2. 數據預處理與加載

在訓練前,需要對圖像數據進行歸一化處理,將像素值縮放到[0,1]區間,以提高訓練效率和模型性能。此外,將標簽進行One-Hot編碼以適應多分類任務。

代碼示例:

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np
import matplotlib.pyplot as plt# 加載MNIST數據集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(f"Training data shape: {x_train.shape}, Test data shape: {x_test.shape}")# 數據歸一化
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0# 標簽One-Hot編碼
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

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

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

相關文章

Android System WebView:Android生態的核心組件

在Android生態系統中,Android System WebView(簡稱WebView)扮演著至關重要的角色。它是Chrome瀏覽器的內核,為Android設備提供了強大的網頁瀏覽和Web內容展示功能。無論是日常瀏覽網頁、使用基于Web的應用程序,還是進行…

Element Plus和Ant Design Vue深度對比分析與選型指南

在 Vue3生態中,Element Plus和Ant Design Vue(以下簡稱 AntD Vue)是兩款最主流的 UI 組件庫。它們分別脫胎于 Element UI(Vue 2 版本)和 Ant Design(React 生態),經過多年迭代已成為…

AJAX 開發中的注意點

關鍵詞:AJAX、異步請求、前端開發、跨域、錯誤處理、安全、性能優化 ? 引言 在現代 Web 應用中,AJAX 是實現前后端數據交互的重要手段。然而,在實際開發過程中,如果不注意一些常見問題,可能會導致應用出現安全性漏洞…

類之間的縱向關系——繼承

繼承定義:被繼承的類叫做基類(父類),繼承的類叫派生類(子類),在派生類類名后面加: 繼承方式 基類class CFather{}; class CSon:public CFather{};父類(基類)與子類(派生類)之間的關系…

bytetrack漏檢補齊

bytetrack漏檢補齊1.人流慢速運動,跟蹤效果比較好,偶爾有漏檢,跟蹤可以自動補齊。2.快速運動,頻繁遮擋,效果可能不好*如果漏檢,倒著跟蹤,把丟失的檢測框拷貝出來,保留進行跟蹤。有時…

安裝Keycloak并啟動服務(macOS)

前提:電腦已經安裝Java 17 1、下載Keycloak 2、下載完后解壓縮,使用文本編輯器修改配置文件(keycloak/conf/keycloak.conf) # Basic settings for running in production. Change accordingly before deploying the server. # …

汽車動力轉向器落錘沖擊試驗臺

落錘沖擊試驗臺主要用于扣件減振量的測試,采用電動錨鏈提錘結構,控制精度高,定位準確。采用伺服電機減速機驅動,避免提錘加速和到位減速時的沖擊,具有多重安全保護功能,防止二次沖擊裝置。主機框架采用上下…

Linux系統集群部署模塊之Keepalived雙機熱備

目錄 概述 一、keepalived安裝 二、配置文件 三、 其他配置項說明 四、名詞解釋 五、高階使用 1、介紹 2、keepalived主要作用 3、工作在三層、四層和七層原理 4、健康狀態檢測方式 4.1 HTTP服務狀態檢測 4.2 TCP端口狀態檢測(使用TCP端口服務基本上都可…

TDengine 使用最佳實踐(1)

目錄 數據建模 單列模型 多列模型 分庫分表 邊界限制 資源規劃 CPU 主頻 CPU 核數 內存分類 內存計算 CPU 內存比例 磁盤 網絡 下一篇 TDengine 使用最佳實踐(1) 關于 TDengine TDengine 是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺&am…

Java行為型模式---責任鏈模式

責任鏈模式基礎概念責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,其核心思想是將請求的發送者和接收者解耦,使多個對象都有機會處理請求。這些對象連接成一條鏈,請求沿著鏈傳遞,直到有…

嵌入式學習筆記- 結構體名字被賦值時是整體內容賦值

結構體變量名被賦值時,?不是賦值的地址,而是執行對整個結構體內容的復制(值拷貝)?直接賦值是成員級復制? 當使用 s2 s1; 形式的賦值時(其中 s1 和 s2 是同類型結構體變量),系統會?逐成員復…

基于UDP/IP網絡游戲加速高級擁塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP網絡游戲加速高級擁塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目標檢測】06-模型部署(C++)

上一節課,我們學習了模型的預測。那么,如何用C++部署呢? 克隆項目 進入cmd,進入自己的項目文件夾,然后git clone項目: git clone https://github.com/Geekgineer/YOLOs-CPP 進入到YOLOs-CPP文件夾: 配置環境 ONNX Runtime 后續構建項目的時候,會自動下載,因此,我…

【第零章編輯器開發與拓展】

前言&#xff1a;對編輯器拓展與開發可以節省很多時間&#xff0c;提高開發效率&#xff0c;比如技能編輯器&#xff0c;關卡編輯器這種。當然這只是編輯器開發的一些典型應用&#xff0c;它能做不止這些。學習完這個之后&#xff0c;我們可以開發項目需要的工具。我本意在編輯…

使用 mongoimport 導入本地 JSON 文件到 MongoDB 及數據查看指南

在項目中&#xff0c;我們經常需要將本地 JSON 文件批量導入 MongoDB 數據庫。本文以 Ubuntu 22.04 環境為例&#xff0c;詳細記錄了如何安裝 mongoimport 工具、正確導入多個 JSON 文件&#xff0c;以及查看導入后的數據。一、環境介紹操作系統&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python數據處理Excel報表自動化生成與分析

Python實現Excel報表自動化系統全流程指南本文將詳細介紹如何使用Python實現一個完整的Excel報表自動化系統&#xff0c;涵蓋從數據清洗、分析到可視化報表生成的全流程。本教程面向Python初學者&#xff0c;通過實際案例講解pandas和openpyxl庫的核心用法。系統概述Excel報表自…

【第六節】docker可視化工具portainer安裝

該文章參考了這篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一個基于網頁的docker可視化管理工具&#xff0c;試想一下我們怎么登錄路由器管理界面的&#xff0c;異曲同工。那么就需要在服務器的docker內安裝portainer&#xff0c;然后在我們的開發機或者說工作…

使用 Certbot 申請和自動續簽 Let’s Encrypt 的免費 SSL 證書

一. Let’s Encrypt 介紹 Let’s Encrypt 是當前最常用的免費 HTTPS 證書生成工具之一。該服務由非營利組織提供&#xff0c;致力于為全球范圍內的網站提供便捷的自動化證書頒發服務。雖然 Let’s Encrypt 證書的有效期只有90天&#xff0c;但是可以自動續期&#xff0c;這使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器詳解 它確保集群中所有(或部分)節點上都運行一個 Pod 的副本。當有新節點加入集群時&#xff0c;DaemonSet 會自動在新節點上創建 Pod&#xff1b;當節點從集群中移除時&#xff0c;這些 Pod 也會被垃圾回收。 DaemonSet 的核心特性 每個節點一個 P…

內測分發平臺應用的異地容災和負載均衡處理和實現思路

內測分發平臺應用的異地容災和負載均衡處理和實現思路如下&#xff1a;一、異地容災1.風險評估和需求分析&#xff1a;對現有的IT基礎設施進行全面的風險評估和需求分析&#xff0c;評估潛在風險和災害的可能性&#xff0c;以及確定業務和數據的關鍵性。2.設計備份架構&#xf…