Python訓練打卡Day36

復習日:

回顧神經網絡的相關信息

1. 梯度下降的思想

梯度下降的本質是一種迭代優化算法,用于尋找函數的極小值點(比如損失函數的最小值)其關鍵的要素如下

  • 梯度:函數在某點變化率最大方向
  • 學習率:每一步的“步長”,用以控制更新幅度
  • 迭代更新:設參數為\theta,損失函數為L(\theta),則更新公式為:\theta_{t+1}=\theta-\eta \cdot \Delta{L(\theta_{t})},沿著梯度的反方向更新參數,是損失不斷減少

2. 激活函數的作用

? ? ? ? 若神經網絡僅由線性層組成,本質就是線性變換的疊加,只能你和線性關系,無法解決非線性問題(比如圖像識別、自然語言處理),因此使用激活函數為神經網絡引入非線性表達能力,能找你和更為復雜的數據分布。常見的激活函數有:ReLU、Sigmoid、Tanh等等。

3. 損失函數的作用

? ? ? ? 損失函數(Loss Function)是衡量模型預測值與真實值之間差異函數,用于量化模型的“錯誤程度”。常見的損失函數有

回歸任務

  • 均方誤差、平均絕對誤差

分類任務

  • 交叉熵損失
  • 稀疏交叉熵

4. 優化器

? ? ? ? 優化器是控制模型參數更新策略的組件,負責根據損失函數的梯度調整參數,以最小化損失。可以這樣理解:梯度下降是“下山的方向”,優化器則是“調整步長和路線的策略”。

? ? ? ? 常見的優化器有SDG、Adam等等。

5. 神經網絡的概念

? ? ? ? 神經網絡是一種模仿生物神經元結構的計算模型,由多層神經元相互連接,用于自動提取數據特征并完成預測任務。

? ? ? ? 基本組成:

  • 神經元(Neuron):接受輸入信號,進行線性變換和非線性激活,輸出結果
  • 層(Layer):
    • 輸入層:接收原始數據(如圖片像素值),不參與計算。
    • 隱藏層:介于輸入層和輸出層之間,負責特征提取(層數和神經元數量決定模型復雜度)。
    • 輸出層:產生最終結果(如分類概率、回歸值),激活函數根據任務選擇(如分類用 Softmax,回歸用線性激活)
  • 連接權重(Weight)和偏置(Bias):
    • 權重:控制信號傳遞的 “強度”,通過訓練學習得到
    • 偏置:允許激活函數平移,增加模型靈活性

? ? ? ? 神經網絡的工作流程:

  1. 前向傳播(Forward Propagation):輸入數據經各層線性變換 + 激活函數,逐層傳遞至輸出層,得到預測值。
  2. 損失計算:用損失函數衡量預測值與真實值的差異。
  3. 反向傳播(Backpropagation):從輸出層向輸入層反向傳遞梯度,利用鏈式法則計算各層參數的梯度,指導優化器更新參數。

典型的神經網絡類型:全連接神經網絡(Fully Connected NN)、卷積神經網絡(CNN)、循環神經網絡(RNN)、Transformer

針對之前的信貸項目,利用神經網絡訓練下,用到目前的知識點讓代碼更加規范和美觀。

# 導包
import pandas as pd    #用于數據處理和分析,可處理表格數據。
import numpy as np     #用于數值計算,提供了高效的數組操作。
import matplotlib.pyplot as plt    #用于繪制各種類型的圖表
import seaborn as sns   #基于matplotlib的高級繪圖庫,能繪制更美觀的統計圖形。
import warnings
warnings.filterwarnings("ignore")# 設置中文字體(解決中文顯示問題)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系統常用黑體字體
plt.rcParams['axes.unicode_minus'] = False    # 正常顯示負號data = pd.read_csv('data.csv')    #讀取數據#數據預處理# 先篩選字符串變量 
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 標簽編碼
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 標簽編碼
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 獨熱編碼,記得需要將bool類型轉換為數值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新讀取數據,用來做列名對比
list_final = [] # 新建一個空列表,用于存放獨熱編碼后新增的特征名
for i in data.columns:if i not in data2.columns:list_final.append(i) # 這里打印出來的就是獨熱編碼后的特征名
for i in list_final:data[i] = data[i].astype(int) # 這里的i就是獨熱編碼后的特征名# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()  #把篩選出來的列名轉換成列表# 連續特征用中位數補全
for feature in continuous_features:     mode_value = data[feature].mode()[0]            #獲取該列的眾數。data[feature].fillna(mode_value, inplace=True)          #用眾數填充該列的缺失值,inplace=True表示直接在原數據上修改。data.drop(columns=['Id'], inplace=True) # 刪除 Loan ID 列# 分離特征數據和標簽數據
X = data.drop(['Credit Default'], axis=1)  # 特征數據
y = data['Credit Default']  # 標簽數據X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)  # 確保訓練集和測試集是相同的縮放X_train = torch.FloatTensor(X_train).to(device)
y_train = torch.LongTensor(y_train.values).to(device)
X_test = torch.FloatTensor(X_test).to(device)
y_test = torch.LongTensor(y_test.values).to(device)class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(30, 64)  # 增加第一層神經元數量self.relu = nn.ReLU()self.dropout = nn.Dropout(0.3)  # 添加Dropout防止過擬合self.fc2 = nn.Linear(64, 32)self.relu = nn.ReLU()self.fc3 = nn.Linear(32, 2)  # 減少隱藏層數,保持輸出層不變def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.dropout(out)  # 應用Dropoutout = self.fc2(out)out = self.relu(out)out = self.fc3(out)return out# 實例化模型并移至GPU
model = MLP().to(device)# 分類問題使用交叉熵損失函數
criterion = nn.CrossEntropyLoss()# 使用隨機梯度下降優化器
optimizer = optim.Adam(model.parameters(), lr=0.001)# 訓練模型
num_epochs = 20000  # 訓練的輪數# 用于存儲每200個epoch的損失值和對應的epoch數
losses = []
epochs = []start_time = time.time()  # 記錄開始時間# 創建tqdm進度條
with tqdm(total=num_epochs, desc="訓練進度", unit="epoch") as pbar:# 訓練模型for epoch in range(num_epochs):# 前向傳播outputs = model(X_train)  # 隱式調用forward函數loss = criterion(outputs, y_train)# 反向傳播和優化optimizer.zero_grad()loss.backward()optimizer.step()# 記錄損失值并更新進度條if (epoch + 1) % 200 == 0:losses.append(loss.item())epochs.append(epoch + 1)# 更新進度條的描述信息pbar.set_postfix({'Loss': f'{loss.item():.4f}'})# 每1000個epoch更新一次進度條if (epoch + 1) % 1000 == 0:pbar.update(1000)  # 更新進度條# 確保進度條達到100%if pbar.n < num_epochs:pbar.update(num_epochs - pbar.n)  # 計算剩余的進度并更新time_all = time.time() - start_time  # 計算訓練時間
print(f'Training time: {time_all:.2f} seconds')# 繪制損失曲線
plt.figure(figsize=(10, 6))
plt.plot(epochs, losses, 'r-', linewidth=2)
plt.title('Training Loss over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.grid(True)
plt.show()# # 在測試集上評估模型
# model.eval()  # 設置模型為評估模式
# with torch.no_grad():  # 禁用梯度計算
#     outputs = model(X_test)  # 對測試數據進行前向傳播
#     _, predicted = torch.max(outputs, 1)  # 獲取預測結果#     correct = (predicted == y_test).sum().item()  # 計算預測正確的樣本數
#     accuracy = correct / y_test.size(0)
#     print(f'測試集準確率: {accuracy * 100:.2f}%')

嘗試進入nn.Module中,查看他的方法:

可以查看官方文檔module

或者使用 Python 內置函數:

import torch.nn as nn# 查看nn.Module的所有屬性和方法
print(dir(nn.Module))# 獲取某個方法的詳細幫助信息
# 例如查看forward方法
help(nn.Module.forward)

創建自己的神經網絡模塊時,需要繼承nn.Module類,并且可以重寫或使用其中的方法。

import torch
import torch.nn as nnclass MyNetwork(nn.Module):def __init__(self):super().__init__()# 定義網絡層self.fc1 = nn.Linear(10, 20)self.fc2 = nn.Linear(20, 1)def forward(self, x):# 定義前向傳播過程x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 創建模型實例
model = MyNetwork()# 使用nn.Module的方法
print(model.parameters())  # 返回模型參數的迭代器
print(model.state_dict())  # 返回模型的狀態字典

在這個例子中,MyNetwork類繼承了nn.Module,并且可以使用nn.Module的所有方法,像parameters()state_dict()等。

@浙大疏錦行

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

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

相關文章

【Android】System分區應用自帶庫與原生庫同名問題分析

System分區應用自帶庫與原生庫同名問題分析 問題背景 某系統應用發生必現崩潰問題。崩潰log如下 0*-** **:**:**.** 66666 66666 E ***** aar error:: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_TTT_TTT_TTT" referenced by &quo…

計算機網絡中的單播、組播與廣播

文章目錄 前言一、單播&#xff08;Unicast&#xff09;1.1 定義與工作原理1.2 優點1.3 缺點1.4 典型應用場景 二、廣播&#xff08;Broadcast&#xff09;2.1 定義與工作原理2.2 優點2.3 缺點2.4 典型應用場景 三、組播&#xff08;Multicast&#xff09;3.1 定義與工作原理3.…

ASP.NET MVC添加新控制器示例

ASP.NET MVC高效構建Web應用- 商品搜索 - 京東 控制器&#xff08;Controllers&#xff09;是一個協調視圖和模型直接關系的特殊類。它響應用戶輸入&#xff0c;與模型進行對話&#xff0c;并決定呈現哪個視圖&#xff08;如果有的話&#xff09;。在ASP.NET MVC中&#xff0c…

Escrcpy(安卓手機投屏軟件) v1.29.6 中文綠色版

在數字設備日益普及的今天&#xff0c;用戶對于設備的控制和管理需求也在不斷增加。對于Android設備用戶來說&#xff0c;Escrcpy這款強大的工具無疑是一個福音。它不僅提供了直觀的圖形化界面&#xff0c;讓用戶能夠輕松顯示和控制自己的Android設備&#xff0c;還以完全免費開…

Python爬蟲實戰:研究Goose框架相關技術

一、引言 隨著互聯網的迅速發展,網絡上的信息量呈爆炸式增長。從海量的網頁中提取有價值的信息成為一項重要的技術。網絡爬蟲作為一種自動獲取網頁內容的程序,在信息收集、數據挖掘、搜索引擎等領域有著廣泛的應用。本文將詳細介紹如何使用 Python 的 Goose 框架構建一個完整…

【Linux 學習計劃】-- 馮諾依曼體系 | 操作系統的概念與定位,以及其如何管理軟件

目錄 馮諾依曼體系結構 操作系統是干什么的&#xff1f; 理解操作系統中的管理 對OS&#xff08;操作系統&#xff09;宏觀、整體的分析 總結 結語 馮諾依曼體系結構 首先我們來看這樣一張圖&#xff0c;這就是大名鼎鼎的馮諾依曼體系 在日常生活中&#xff0c;所有的計…

新消息!阿里云ACP大模型認證有變化!

阿里云ACP認證是阿里云認證中的高級工程師&#xff0c;ACP認證方向有云計算、大數據、人工智能、大模型等多個&#xff0c;大家都知道&#xff0c;阿里云ACP考試題量共100題&#xff0c;其中70道單選題30道多選題&#xff0c;每題一分&#xff0c;滿分100分&#xff0c;80分合格…

MySQL 數據遷移Postgresql(openGuass) 之 pg_chameleon

1 pg_chameleon 介紹 pgchameleon 是一款MySQL 到 PostgreSQL/openGuass 的復制工具。 pg_chameleon 使用場景&#xff1a; 1&#xff09;分析 2&#xff09;遷移 3&#xff09;對多個MySQL 數據庫進行數據聚合 操作系統信息 (myenv) rootu24-pg-60:~# cat /etc/issue Ubuntu …

Spark 中,map和foreach的區別

在 Spark 中&#xff0c;map和foreach是兩種不同用途的轉換操作&#xff0c;主要區別在于&#xff1a; 1. 操作類型與返回值 map&#xff1a;是轉換操作&#xff08;Transformation&#xff09;&#xff0c;返回一個新的 RDD。foreach&#xff1a;是行動操作&#xff08;Acti…

More SQL(Focus Subqueries、Join)

目錄 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference&#xff08;交并差&#xff09; Bag Semantics Controlling Dupl…

OpenGL Chan視頻學習-4 Vertex Buffers and Drawing a Triangle in OpenGL

一、視頻鏈接 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 二、相關網站 docs.gl 三、代碼整理 c #include <GL/glew.h> #include <GLFW/glfw3.h>#include<iostream>int…

WSL中ubuntu通過Windows帶代理訪問github

WSL中ubuntu通過Windows帶代理訪問github 前言: WSL是Windows下的ubuntu訪問工具&#xff0c;目前無法訪問外網&#xff0c;因此需要配置一下。 步驟一 代理中進行如下設置: 步驟二 ubuntu22.04中修改配置 使用如下命令獲取IP地址&#xff1a; ip route | grep default | aw…

為(FramePack)的視頻生成添加首尾幀功能

文章目錄 &#xff08;一&#xff09;前言&#xff08;二&#xff09;可選的尾幀&#xff08;三&#xff09;測試&#xff08;四&#xff09;例子 &#xff08;一&#xff09;前言 前提是這個&#xff1a;《筆記本6GB本地可跑的圖生視頻項目&#xff08;FramePack&#xff09;…

C語言中:遞歸問題的深入研究

C語言中&#xff1a;遞歸問題的深入研究 函數的遞歸有兩個限制條件&#xff1a; 1.遞歸存在限制條件&#xff0c;當滿?這個限制條件的時候&#xff0c;遞歸便不再繼續。 2.每次遞歸調?之后越來越接近這個限制條件。 例子&#xff1a; #include <stdio.h> int main…

《C++20新特性全解析:模塊、協程與概念(Concepts)》

引言&#xff1a;C20——現代C的里程碑 C20是繼C11之后最具革命性的版本&#xff0c;它通過模塊&#xff08;Modules&#xff09;、協程&#xff08;Coroutines&#xff09;和概念&#xff08;Concepts&#xff09;三大核心特性&#xff0c;徹底改變了C的代碼組織方式、并發模…

xcode卡死問題,無論打開什么程序xcode總是在轉菊花,重啟電腦,卸載重裝都不行

很可能是因為我們上次沒有正常關閉Xcode&#xff0c;而Xcode保留了上次錯誤的一些記錄&#xff0c;而這次打開Xcode依然去加載錯誤的記錄&#xff0c;所以必須完全刪除這些記錄Xcode才能加載正常的項目。 那么也就是說&#xff0c;我們是不是只需要刪除這部分錯誤記錄文件就可以…

華為云Flexus+DeepSeek征文|華為云Flexus云服務器X實例上部署Dify:打造高效的開源大語言模型應用開發平臺

目錄 前言 1 Dify與華為云部署概述 1.1 什么是 Dify 1.2 華為云與 Flexus 云服務器的優勢 2 云服務器部署 Dify 的步驟詳解 2.1 模板選擇 2.2 參數配置 2.3 資源棧設置 2.4 確認部署信息并執行 3 部署成功后的操作與平臺使用指南 3.1 訪問平臺 3.2 設置管理員賬號 …

物流項目第九期(MongoDB的應用之作業范圍)

本項目專欄&#xff1a; 物流項目_Auc23的博客-CSDN博客 建議先看這期&#xff1a; MongoDB入門之Java的使用-CSDN博客 需求分析 在項目中&#xff0c;會有兩個作業范圍&#xff0c;分別是機構作業范圍和快遞員作業范圍&#xff0c;這兩個作業范圍的邏輯是一致的&#xf…

網絡拓撲如何跨網段訪問

最近領導讓研究下跟甲方合同里的&#xff0c;跨網段訪問怎么實現&#xff0c;之前不都是運維網工干的活么&#xff0c;看來裁員裁到動脈上了碰到用人的時候找不到人了&#xff0c; 只能趕鴨子上架讓我來搞 IP 網絡中&#xff0c;不同網段之間的通信需要通過路由器&#xff0c;…

【前端】PWA

目錄 概述實戰vue項目問題匯總 PWA&#xff08;漸進式 Web 應用&#xff0c;Progressive Web App&#xff09; 2015提出 概述 PWA 是一種提升 Web 應用體驗的技術&#xff0c;使其具備與原生應用相似的功能和性能。PWA不僅能夠在網頁上運行&#xff0c;還能在手機或桌面上像傳…