使用PyTorch處理多維特征輸入數(shù)據(jù)的完美實(shí)現(xiàn)
引言
在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域,我們經(jīng)常會(huì)面對(duì)具有多維特征輸入的問(wèn)題。這種情況出現(xiàn)在各種應(yīng)用中,包括圖像識(shí)別、自然語(yǔ)言處理、時(shí)間序列分析等。PyTorch是一個(gè)強(qiáng)大的深度學(xué)習(xí)框架,它提供了豐富的工具和庫(kù),可以幫助我們有效地處理這些多維特征輸入數(shù)據(jù)。在本篇博客中,我們將探討如何使用PyTorch來(lái)處理多維特征輸入數(shù)據(jù)。
前期的回顧與準(zhǔn)備
這里我們采用一組預(yù)測(cè)糖尿病的數(shù)據(jù)集,如下圖

這里的每一行代表一個(gè)樣本,同樣的,每一列代表什么呢,代表一個(gè)特征,如下圖。所以糖尿病的預(yù)測(cè)由下面這八個(gè)特征共同進(jìn)行決定

按照過(guò)去的邏輯回歸,應(yīng)該是下圖所示的,因?yàn)檫@是單特征值

但是現(xiàn)在由單特征值已經(jīng)轉(zhuǎn)變?yōu)槎嗵卣髦盗?,所以我們需要?duì)每個(gè)特征值進(jìn)行處理,如下圖

中間的特征值與權(quán)重的點(diǎn)乘可以從矩陣的形式進(jìn)行表現(xiàn)

因?yàn)檫壿嫽貧w所以還有套一個(gè)Sigmoid函數(shù),通常情況下我們將函數(shù)內(nèi)的整體成為z(i)

注意: Sigmoid函數(shù)是一個(gè)按向量方式實(shí)現(xiàn)的
下面我們從矩陣相乘的形式進(jìn)行展示,說(shuō)明可以將一組方程合并為矩陣運(yùn)算,可以想象為拼接哈。這樣的目的是轉(zhuǎn)化為并行運(yùn)算,從而實(shí)現(xiàn)更快的運(yùn)行速度。

所以從代碼的角度去修改,我們只需要改變一下維度就行了
class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.linear = torch.nn.Linear(8, 1) self.sigmoid = torch.nn.Sigmoid() def forward(self, x): x = self.sigmoid(self.linear(x)) return x model = Model()
這里的輸入維度設(shè)置為8,就像上圖中展示的x一樣是N×8形式的矩陣,而 y ^ \hat{y} y^?是一個(gè)N×1的矩陣。
這里我們將矩陣看做是一個(gè)空間變換的函數(shù)
我們可以從下圖很好的展示多層神經(jīng)網(wǎng)絡(luò)的變換

從一開始的屬于8維變?yōu)檩敵?維,再?gòu)妮斎氲?維變?yōu)檩敵龅?維,最后從輸入的4維變?yōu)檩敵龅?維。
如果從代碼的角度去寫,可以從下面的代碼進(jìn)行實(shí)現(xiàn)
class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.linear1 = torch.nn.Linear(8, 6) self.linear2 = torch.nn.Linear(6, 4) self.linear3 = torch.nn.Linear(4, 1) self.sigmoid = torch.nn.Sigmoid() def forward(self, x): x = self.sigmoid(self.linear1(x)) x = self.sigmoid(self.linear2(x)) x = self.sigmoid(self.linear3(x)) return x model = Model()
這里我說(shuō)明一下下面這條語(yǔ)句
- self.sigmoid = torch.nn.Sigmoid():這一行創(chuàng)建了一個(gè) Sigmoid 激活函數(shù)的實(shí)例,用于在神經(jīng)網(wǎng)絡(luò)的正向傳播中引入非線性。
后面的前向計(jì)算就是一層的輸出是另一層輸入進(jìn)行傳,最后將 y ^ \hat{y} y^?返回
同時(shí)我們的損失函數(shù)也沒(méi)有變化,更新函數(shù)也沒(méi)有變化,采用交叉熵和梯度下降

這里沒(méi)有使用Mini-Batch進(jìn)行批量,后續(xù)的學(xué)習(xí)應(yīng)該會(huì)更新

代碼實(shí)現(xiàn)
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
# 載入Diabetes數(shù)據(jù)集
diabetes = datasets.load_diabetes()
# 將數(shù)據(jù)集拆分為特征和目標(biāo)
X = diabetes.data # 特征
y = diabetes.target # 目標(biāo)
# 數(shù)據(jù)預(yù)處理
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # 特征標(biāo)準(zhǔn)化
# 拆分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 轉(zhuǎn)換為PyTorch張量
X_train = torch.FloatTensor(X_train)
y_train = torch.FloatTensor(y_train).view(-1, 1) # 將目標(biāo)變量轉(zhuǎn)換為列向量
X_test = torch.FloatTensor(X_test)
y_test = torch.FloatTensor(y_test).view(-1, 1)
# 構(gòu)建包含多個(gè)線性層的神經(jīng)網(wǎng)絡(luò)模型
class DiabetesModel(nn.Module):
def __init__(self, input_size):
super(DiabetesModel, self).__init__()
self.fc1 = nn.Linear(input_size, 64) # 第一個(gè)線性層
self.fc2 = nn.Linear(64, 32) # 第二個(gè)線性層
self.fc3 = nn.Linear(32, 1) # 最終輸出線性層
def forward(self, x):
x = torch.relu(self.fc1(x)) # ReLU激活函數(shù)
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# 初始化模型
input_size = X_train.shape[1]
model = DiabetesModel(input_size)
# 定義損失函數(shù)和優(yōu)化器
criterion = nn.MSELoss() # 均方誤差損失
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 訓(xùn)練模型
num_epochs = 1000
for epoch in range(num_epochs):
# 前向傳播
outputs = model(X_train)
loss = criterion(outputs, y_train)
# 反向傳播和優(yōu)化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
# 在測(cè)試集上進(jìn)行預(yù)測(cè)
model.eval()
with torch.no_grad():
y_pred = model(X_test)
# 計(jì)算性能指標(biāo)
mse = nn.MSELoss()(y_pred, y_test)
print(f"均方誤差 (MSE): {mse.item():.4f}")運(yùn)行結(jié)果如下

感興趣的同學(xué)可以使用不同的激活函數(shù)一一測(cè)試一下
比如我使用tanh函數(shù)測(cè)試后得到的均方誤差就小了許多

此鏈接是GitHub上的大佬做的可視化函數(shù):
https://dashee87.github.io/deep%20learning/visualising-activation-functions-in-neural-networks/
總結(jié)
這就是使用PyTorch處理多維特征輸入的基本流程。當(dāng)然,實(shí)際應(yīng)用中,你可能需要更復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),更大的數(shù)據(jù)集,以及更多的調(diào)優(yōu)和正則化技巧。但這個(gè)指南可以幫助你入門如何處理多維特征輸入的問(wèn)題,并利用PyTorch構(gòu)建強(qiáng)大的深度學(xué)習(xí)模型。希望這篇博客對(duì)你有所幫助!
以上就是使用PyTorch處理多維特征輸入數(shù)據(jù)的完美實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于PyTorch處理多維特征輸入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Pytorch?linear?多維輸入的參數(shù)問(wèn)題
- PyTorch實(shí)現(xiàn)多維度特征輸入邏輯回歸
- Pytorch 多維數(shù)組運(yùn)算過(guò)程的索引處理方式
- pytorch VGG11識(shí)別cifar10數(shù)據(jù)集(訓(xùn)練+預(yù)測(cè)單張輸入圖片操作)
- Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作
- pytorch實(shí)現(xiàn)對(duì)輸入超過(guò)三通道的數(shù)據(jù)進(jìn)行訓(xùn)練
- Pytorch 定義MyDatasets實(shí)現(xiàn)多通道分別輸入不同數(shù)據(jù)方式
相關(guān)文章
pygame實(shí)現(xiàn)鍵盤和鼠標(biāo)事件的處理
這篇文章主要介紹了pygame實(shí)現(xiàn)鍵盤和鼠標(biāo)事件的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
tensorflow實(shí)現(xiàn)softma識(shí)別MNIST
這篇文章主要為大家詳細(xì)介紹了tensorflow實(shí)現(xiàn)softma識(shí)別MNIST,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Python實(shí)現(xiàn)Markdown格式消除工具
這篇文章主要為大家詳細(xì)介紹了如何使用?Python?和?PyQt5?庫(kù)來(lái)創(chuàng)建一個(gè)簡(jiǎn)單易用的?Markdown?格式消除工具,并且支持實(shí)時(shí)預(yù)覽和文件保存功能,需要的可以了解下2025-02-02
學(xué)生如何注冊(cè)Pycharm專業(yè)版以及pycharm的安裝
這篇文章主要介紹了學(xué)生如何注冊(cè)Pycharm專業(yè)版以及pycharm的安裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
淺析Python 抽象工廠模式的優(yōu)缺點(diǎn)
這篇文章主要介紹了Python 抽象工廠模式的優(yōu)缺點(diǎn),文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
有關(guān)wxpython pyqt內(nèi)存占用問(wèn)題分析
一直覺(jué)得wxpython占用內(nèi)存比較多,在工作中寫的一些小程序應(yīng)用,一對(duì)比其它的小程序,發(fā)現(xiàn)內(nèi)存相差確實(shí)有點(diǎn)大2014-06-06
python入門學(xué)習(xí)關(guān)于for else的特殊特性講解
本文將介紹 Python 中的" for-else"特性,并通過(guò)簡(jiǎn)單的示例說(shuō)明如何正確使用它,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載的流程
這篇文章主要介紹了pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載,之前在訓(xùn)練網(wǎng)絡(luò)的時(shí)候加載數(shù)據(jù)都是稀里糊涂的放進(jìn)去的,也沒(méi)有理清楚里面的流程,今天整理一下,加深理解,也方便以后查閱,需要的朋友可以參考下2022-11-11

