dl學習筆記:(4)簡單神經網絡

(1)單層正向回歸網絡

bx1x2z
100-0.2
110-0.05
101-0.05
1110.1

接下來我們用代碼實現這組線性回歸數據

import torch
x = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
z = torch.tensor([-0.2, -0.05, -0.05, 0.1])
w = torch.tensor([-0.2,0.15,0.15])
def LinearR(x,w):zhat = torch.mv(x,w)return zhat
zhat = LinearR(x,w)
zhat

下面對這段代碼做一個詳細說明:

(1)tensor的定義

這里我們需要定義成浮點數的原因,是因為torch中有很多函數不接受兩個類型不同的參數傳入,例如這里的mv函數,如果我們省略浮點的定義,就會出現報錯如下:

這種靜態的編程可以說既是pytorch的優點也是缺點,優點在于如果省略了對傳入參數的檢查處理,就會在運行速度上快很多,尤其是傳入數據量大的時候,對每一個數據進行檢查是一個很慢的過程。缺點在于你需要人為記住哪些函數是可以不同類型哪些不可以,pytorch沒有一個統一的標準,唯一的辦法就只有自己多試幾次,所以建議大家在定義tensor的時候就默認定義成為float32

另外由于很多pytorch函數不接受一維張量,所以這里我們在定義的時候也養成兩個[[的二維張量的習慣

(2)精度問題

如果我們想要查看運行結果是否和答案一致的時候,我們運行下面代碼會發現奇怪的現象:

那就是為什么后面三個會是false,這其實就是精度的問題了。

所以當我們人為把精度調高到30位的時候就可以發現問題了:

當數據量大的時候,會因為精度問題產生較大的誤差,如果想要控制誤差大小,可以使用64位浮點數,唯一的缺點就是會比較占用內存。如果我們想要忽略較小的誤差可以使用下面這個函數:

通過shift+tab快捷鍵來查看函數參數使用,我們也可以通過調整rtol和atol控制誤差大小,可以看到這里的默認參數已經挺小的了

(2)torch.nn.Linear

在使用之前,我們先給出pytorch的架構圖,包含了常用的類和庫

我們先給出代碼再進行解釋:

import torch
X = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)
output = torch.nn.Linear(2,1)
zhat = output(X)
zhat

首先nn.Linear是一個類,在這里代表了輸出層,所以使用output作為變量名,output的這一行相當于是類的實例化過程。里面輸入的參數2和1分別指上一層的神經元個數和這一層的神經元個數。

由于nn.Module的子類會在實例化的同時自動生成隨機的w和b,所以這里我們上一層就只有兩個x,又由于這是回歸類模型所以輸出層只有一個。我們也可以調用查看隨機生成的數:

如果我們不想要bias可以設置成false:output = torch.nn.Linear(2,1,bias = False)

如果我們不想都每次都隨機生成不同的權重,可以設置隨機數種子:torch.random.manual_seed(250)

(3)邏輯回歸

我們學習過線性回歸之后,都知道線性回歸能夠擬合直線的線性關系,但是現實生活中的數據關系往往不是線性的,所以為了更好的擬合曲線關系,統計學家就在線性回歸的方程兩邊加上了聯系函數,這種回歸也被叫做廣義線性回歸。而在探索聯系函數的過程中,就發現了sigmoid函數。

\sigma = sigmoid(z) = \frac{1}{1+e^{-z}}

我們可以運行下面代碼來畫出sigmoid圖像:

import numpy as np
import matplotlib.pyplot as plt# 定義Sigmoid函數
def sigmoid(x):return 1 / (1 + np.exp(-x))# 生成x軸數據
x = np.linspace(-10, 10, 400)# 計算y軸數據
y = sigmoid(x)# 繪圖
plt.figure(figsize=(8, 6))
plt.plot(x, y, label="Sigmoid Function", color='b')
plt.title("Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid(True)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.legend()
plt.show()

首先,我們可以觀察函數圖像,這是一個將所有數映射到(0,1)之間的函數,x趨于負無窮時,函數值趨近于0,x趨近于正無窮時,函數值趨近于1。

運行下面代碼,我們可以畫出sigmoid的導數圖像:

import numpy as np
import matplotlib.pyplot as plt# 定義Sigmoid函數
def sigmoid(x):return 1 / (1 + np.exp(-x))# 定義Sigmoid函數的導數
def sigmoid_derivative(x):s = sigmoid(x)return s * (1 - s)# 生成x軸數據
x = np.linspace(-10, 10, 400)# 計算Sigmoid函數的導數
y_derivative = sigmoid_derivative(x)# 繪圖
plt.figure(figsize=(8, 6))
plt.plot(x, y_derivative, label="Sigmoid Derivative", color='r')
plt.title("Derivative of Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid'(x)")
plt.grid(True)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.legend()
plt.show()

可以發現在0處取到的導數值最大,往邊上走迅速減小,所以它可以快速將數據從0的附近排開。這樣的性質,讓sigmoid函數擁有將連續型變量轉化為離散型變量的力量,這也讓它擁有了化回歸類問題為分類問題的能力。

當我們將該函數以對數幾率的形式表達出來的時候,會發現另一個有趣的地方。

\ln \frac{\sigma }{1-\sigma } =\ln \frac{\frac{1}{1+e^{-xw}}}{1-\frac{1}{1+e^{-xw}}} = \ln \frac{\frac{1}{1+e^{-xw}}}{\frac{e^{-xw}}{1+e^{-xw}}} = \ln\frac{1}{e^{-xw}} = \ln e^{xw} = xw

我們神奇地發現,讓取對數幾率后所得到的值就是我們線性回歸的z,因為這個性質,在等號兩邊加sigmoid 的算法被稱為“對數幾率回歸”,在英文中就是Logistic Regression,就是邏輯回歸。

此時 \sigma1-\sigma之和為1,因此它們可以被我們看作是一對正反例發生的概率,即\sigma是某樣本i的標簽被預測為1的概率,而1-\sigma是i的標簽被預測為0的概率,相比的結果就是樣本i的標簽被預測為1的相對概率。基于這種理解,雖然可能不嚴謹,邏輯回歸、即單層二分類神經網絡返回的結果一般被當成是概率來看待和使用。

(1)與門的實現:

x0x1x2andgate
1000
1100
1010
1111
import torch
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
andgate = torch.tensor([[0],[0],[0],[1]], dtype = torch.float32)
w = torch.tensor([-0.2,0.15,0.15], dtype = torch.float32)
def LogisticR(X,w):zhat = torch.mv(X,w)sigma = torch.sigmoid(zhat)#sigma = 1/(1+torch.exp(-zhat))andhat = torch.tensor([int(x) for x in sigma >= 0.5], dtype = torch.float32)return sigma, andhat
sigma, andhat = LogisticR(X,w)
andhat

這里我們求sigma的時候用的是庫里面的函數,注釋的是手動寫的。

唯一需要額外解釋的是andhat的列表推導式:

sigma >= 0.5 會對 sigma 中的每個元素進行比較,返回一個布爾型張量,并且形狀與 sigma 相同舉個例子,假設 sigma = torch.tensor([0.2, 0.7, 0.5, 0.3]),那么 sigma >= 0.5 的結果會是:tensor([False, ?True, ?True, False])
接下來是列表推導式部分,它會遍歷 sigma >= 0.5 中的每個布爾值,并將每個布爾值轉化為整數(True 轉化為 1False 轉化為 0)。也就是說,這個列表推導式的功能是將布爾值轉換為二分類的預測值(0 或 1)。

上面的例子通過列表推導式 [int(x) for x in sigma >= 0.5],會得到:[0, 1, 1, 0]

當然除了sigmoid還有很多經典的函數,例如sign,ReLU,Tanh等函數,這里我們就不再一一列出來了,用到的時候再說。

(2)torch版本實現

import torch
from torch.nn import functional as F
X = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)
torch.random.manual_seed(250) #人為設置隨機數種子
dense = torch.nn.Linear(2,1)
zhat = dense(X)
sigma = F.sigmoid(zhat)
y = [int(x) for x in sigma > 0.5]
y

(4)softmax

當我們遇到多分類問題的時候,往往使用softmax來解決

Softmax 是一種常用于多分類問題的激活函數,特別是在神經網絡的輸出層,它將一組實數轉換為一個概率分布。Softmax 是“歸一化指數函數”的一種形式,其主要功能是將任意實數向量轉換成一個概率分布,使得每個元素的值介于0和1之間,且所有元素的和為1。這對于多分類問題來說非常重要,因為它可以幫助我們得到不同類別的概率,從而進行分類決策。

可是由于指數的緣故,經常會發生溢出的情況,如下:

所以一般我們不手動自己寫softmax,一般會調用pytorch內置的函數

你可能會疑惑為什么這個函數不會出現溢出的問題,這是因為使用了一點小技巧。

為了避免溢出,我們可以將每個輸入值z_{i}減去輸入向量的最大值max(z),這樣可以確保計算中的指數值不會太大,仍然可以保留同樣結果的相對比例。通過以下變換,我們可以得到數值穩定的 Softmax:

另外還需要解釋一點的是這里的0是什么,我們可以通過快捷鍵查看函數的參數發現,第二個參數是維度,也就是說該函數需要你指定沿著哪一個維度進行softmax操作。

這里由于是只有一行,所以就是沿著這一行做softmax,所以維度的索引值為0,下面舉幾個例子:

如果是二維張量dim=1就是對兩個小的張量進行softmax

這意味著 Softmax 沒有對每個樣本獨立處理,而是計算了每個類別在所有樣本中的相對比例。

我們再舉一個大一點的三維張量的例子:

import torch
import torch.nn.functional as F# 輸入一個 3D 張量 (batch_size, channels, height)
z = torch.tensor([[[1.0, 2.0, 3.0, 4.0],   # 第一個樣本的 4 個特征值[1.0, 2.0, 3.0, 4.0],   # 第二個樣本的 4 個特征值[1.0, 2.0, 3.0, 4.0]],  # 第三個樣本的 4 個特征值[[5.0, 6.0, 7.0, 8.0],   # 第一個樣本的 4 個特征值[5.0, 6.0, 7.0, 8.0],   # 第二個樣本的 4 個特征值[5.0, 6.0, 7.0, 8.0]]]  # 第三個樣本的 4 個特征值# 打印輸入張量
print("輸入張量:")
print(z)
print("\n")# 沿著 dim=2 計算 Softmax(計算每個特征維度的概率)
softmax_dim2 = F.softmax(z, dim=2)
print("沿著 dim=2 計算 Softmax:")
print(softmax_dim2)
print("\n")# 沿著 dim=1 計算 Softmax(計算每個類別的概率)
softmax_dim1 = F.softmax(z, dim=1)
print("沿著 dim=1 計算 Softmax:")
print(softmax_dim1)
print("\n")# 沿著 dim=0 計算 Softmax(計算每個樣本的概率)
softmax_dim0 = F.softmax(z, dim=0)
print("沿著 dim=0 計算 Softmax:")
print(softmax_dim0)

由于這是一個shape為(2,3,4)的張量,所以dim=2也就是最后一個維度4的求和,所以是四個元素加起來等于1;dim=1也就是中間維度3,按照列加起來等于1;dim=0第一個維度2,所以是第一個小張量里面的加第二個小張量里面的等于1.

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

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

相關文章

三、華為交換機 Hybrid

一、Hybrid功能 Hybrid口既可以連接普通終端的接入鏈路(類似于Access接口),又可以連接交換機間的干道鏈路(類似于Trunk接口)。它允許多個VLAN的幀通過,并可以在出接口方向將某些VLAN幀的標簽剝掉&#xff0…

Tensor 基本操作1 | PyTorch 深度學習實戰

目錄 創建 Tensor常用操作unsqueezesqueezeSoftmax代碼1代碼2代碼3 argmaxitem 創建 Tensor 使用 Torch 接口創建 Tensor import torch參考:https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 將多維數組解套&#xf…

Grafana系列之面板接入Prometheus Alertmanager

關于Grafana的儀表板Dashboard,以及面板Panel,參考Grafana系列之Dashboard。可以直接在面板上創建Alert,即所謂的Grafana Alert,參考Grafana系列之Grafana Alert。除了Grafana Alert外,面板也可接入Prometheus Alertma…

Windows 上安裝 MongoDB 的 zip 包

博主介紹: 大家好,我是想成為Super的Yuperman,互聯網宇宙廠經驗,17年醫療健康行業的碼拉松奔跑者,曾擔任技術專家、架構師、研發總監負責和主導多個應用架構。 近期專注: RPA應用研究,主流廠商產…

LeetCode 2266.統計打字方案數:排列組合

【LetMeFly】2266.統計打字方案數:排列組合 力扣題目鏈接:https://leetcode.cn/problems/count-number-of-texts/ Alice 在給 Bob 用手機打字。數字到字母的 對應 如下圖所示。 為了 打出 一個字母,Alice 需要 按 對應字母 i 次&#xff0c…

PTA乙級1001~1005【c++】

首先講解一下PTA乙級在哪里。PTA乙級題其實就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不償命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

滲透筆記1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自帶 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服務器上&#xff0c;client分別在各地&#xff0c;與server相連接&#xff1b;連接上后就可以共享上線主機。…

用Python實現SVM搭建金融反詐模型(含調試運行)

1.概述 信用卡盜刷一般發生在持卡人信息被不法分子竊取后&#xff0c;復制卡片進行消費或信用卡被他人冒領后激活并消費等情況下。一旦發生信用卡盜刷&#xff0c;持卡人和銀行都會遭受一定的經濟損失。本節要運用支持向量機分類算法搭建一個金融反欺詐模型。 2.數據集 使用…

HunyuanVideo 文生視頻模型實踐

HunyuanVideo 文生視頻模型實踐 flyfish 運行 HunyuanVideo 模型使用文本生成視頻的推薦配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值顯存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本項目適用于使用 N…

第6章 ThreadGroup詳細講解(Java高并發編程詳解:多線程與系統設計)

1.ThreadGroup 與 Thread 在Java程序中&#xff0c; 默認情況下&#xff0c; 新的線程都會被加入到main線程所在的group中&#xff0c; main線程的group名字同線程名。如同線程存在父子關系一樣&#xff0c; Thread Group同樣也存在父子關系。圖6-1就很好地說明了父子thread、父…

nginx常用配置 (含負載均衡、反向代理、限流、Gzip壓縮、圖片防盜鏈 等示例)

nginx的配置文件通常在 /etc/nginx/nginx.conf , /etc/nginx/conf.d/*.conf 中&#xff0c; 一般直接 改 conf.d目錄下的 default.conf文件&#xff0c; 然后 先檢測配置文件是否有錯誤 nginx -t 再重新加載配置文件 或 重啟nginx&#xff0c;命令如下 nginx -s reload 或…

Python編程與在線醫療平臺數據挖掘與數據應用交互性研究

一、引言 1.1 研究背景與意義 在互聯網技術飛速發展的當下,在線醫療平臺如雨后春筍般涌現,為人們的就醫方式帶來了重大變革。這些平臺打破了傳統醫療服務在時間和空間上的限制,使患者能夠更加便捷地獲取醫療資源。據相關報告顯示,中國基于互聯網的醫療保健行業已進入新的…

Linux網絡_套接字_UDP網絡_TCP網絡

一.UDP網絡 1.socket()創建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET網絡 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;適用于 IPv4 協議。用于網絡通信AF_INET6&#xff1a;IPv6 地址族&a…

1 行命令引發的 Go 應用崩潰

一、前言 不久前&#xff0c;阿里云 ARMS 團隊、編譯器團隊、MSE 團隊攜手合作&#xff0c;共同發布并開源了 Go 語言的編譯時自動插樁技術。該技術以其零侵入的特性&#xff0c;為 Go 應用提供了與 Java 監控能力相媲美的解決方案。開發者只需將 go build 替換為新編譯命令 o…

R語言的并發編程

R語言的并發編程 引言 在現代計算中&#xff0c;如何有效地利用計算資源進行數據處理和分析已成為一個重要的研究方向。尤其在大數據時代&#xff0c;數據量的急劇增加讓單線程處理方式顯得力不從心。為了解決這一問題&#xff0c;各種編程語言都開展了并發編程的研究和應用。…

Flink(十):DataStream API (七) 狀態

1. 狀態的定義 在 Apache Flink 中&#xff0c;狀態&#xff08;State&#xff09; 是指在數據流處理過程中需要持久化和追蹤的中間數據&#xff0c;它允許 Flink 在處理事件時保持上下文信息&#xff0c;從而支持復雜的流式計算任務&#xff0c;如聚合、窗口計算、聯接等。狀…

C#項目生成時提示缺少引用

問題描述 剛從git或svn拉取下來的C#項目&#xff0c;在VS生成時提示缺少引用 解決方案 1、從“管理NuGet程序包”中下載并安裝缺少的引用&#xff0c;如果引用較多逐個下載安裝會比較麻煩&#xff0c;建議采用下面第2種方案處理 2、通過命令對所有缺少引用進行安裝 &#…

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成 1所有的材料都可以在EAMM: One-Shot Emotional Talking Face via Audio-Based Emotion-Aware Motion Model網站上找到。 摘要 盡管音頻驅動的對話人臉生成技術已取得顯著進展&#xff0c;但現有方法要么忽…

BeanFactory 是什么?它與 ApplicationContext 有什么區別?

談到Spring&#xff0c;那勢必要講講容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么&#xff1f; BeanFactory&#xff0c;其實就是 Spring 容器&#xff0c;用于管理和操作 Spring 容器中的 Bean。可能此時又有初學的小伙伴會問&#xff1a;Bean 是什么&#x…

【深度學習】Huber Loss詳解

文章目錄 1. Huber Loss 原理詳解2. Pytorch 代碼詳解3.與 MSELoss、MAELoss 區別及各自優缺點3.1 MSELoss 均方誤差損失3.2 MAELoss 平均絕對誤差損失3.3 Huber Loss 4. 總結4.1 優化平滑4.2 梯度較好4.3 為什么說 MSE 是平滑的 1. Huber Loss 原理詳解 Huber Loss 是一種結合…