中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

鄭州網(wǎng)站設(shè)計培訓(xùn)百度推廣管理平臺登錄

鄭州網(wǎng)站設(shè)計培訓(xùn),百度推廣管理平臺登錄,外鏈 推網(wǎng)站怎么做,海南七星彩網(wǎng)站開發(fā)參考引用 動手學(xué)深度學(xué)習(xí) 1. 線性神經(jīng)網(wǎng)絡(luò) 神經(jīng)網(wǎng)絡(luò)的整個訓(xùn)練過程,包括: 定義簡單的神經(jīng)網(wǎng)絡(luò)架構(gòu)、數(shù)據(jù)處理、指定損失函數(shù)和如何訓(xùn)練模型。經(jīng)典統(tǒng)計學(xué)習(xí)技術(shù)中的線性回歸和 softmax 回歸可以視為線性神經(jīng)網(wǎng)絡(luò) 1.1 線性回歸 回歸 (regression) 是能為一個或多個…

參考引用

  • 動手學(xué)深度學(xué)習(xí)

1. 線性神經(jīng)網(wǎng)絡(luò)

  • 神經(jīng)網(wǎng)絡(luò)的整個訓(xùn)練過程,包括: 定義簡單的神經(jīng)網(wǎng)絡(luò)架構(gòu)、數(shù)據(jù)處理、指定損失函數(shù)和如何訓(xùn)練模型。經(jīng)典統(tǒng)計學(xué)習(xí)技術(shù)中的線性回歸softmax 回歸可以視為線性神經(jīng)網(wǎng)絡(luò)

1.1 線性回歸

  • 回歸 (regression) 是能為一個或多個自變量與因變量之間關(guān)系建模的一類方法。在自然科學(xué)和社會科學(xué)領(lǐng)域,回歸經(jīng)常用來表示輸入和輸出之間的關(guān)系
  • 在機器學(xué)習(xí)領(lǐng)域中的大多數(shù)任務(wù)通常都與預(yù)測 (prediction) 有關(guān)。當(dāng)想預(yù)測一個數(shù)值時,就會涉及到回歸問題。常見的例子包括:預(yù)測價格 (房屋、股票等)、預(yù)測住院時間 (針對住院病人等)、預(yù)測需求 (零售銷量等)

1.1.1 線性回歸的基本元素

  • 線性回歸基于幾個簡單的假設(shè)

    • 首先,假設(shè)自變量 x x x 和因變量 y y y 之間的關(guān)系是線性的,即 y y y 可以表示為 x x x 中元素的加權(quán)和
    • 其次,通常允許包含觀測值的一些噪聲,并假設(shè)任何噪聲都比較正常,如噪聲遵循正態(tài)分布
  • 舉一個實際的例子:希望根據(jù)房屋的面積 (平方英尺) 和房齡 (年) 來估算房屋價格 (美元)

    • 為了開發(fā)一個能預(yù)測房價的模型,需要收集一個真實的數(shù)據(jù)集
      • 這個數(shù)據(jù)集包括了房屋的銷售價格、面積和房齡
      • 在機器學(xué)習(xí)的術(shù)語中,該數(shù)據(jù)集稱為訓(xùn)練集 (training set)
    • 每行數(shù)據(jù) (比如一次房屋交易相對應(yīng)的數(shù)據(jù)) 稱為樣本 (sample),也可以稱為數(shù)據(jù)點 (data point) 或數(shù)據(jù)樣本 (data instance)
    • 把試圖預(yù)測的目標(biāo) (比如預(yù)測房屋價格) 稱為標(biāo)簽 (label) 或目標(biāo) (target)
    • 預(yù)測所依據(jù)的自變量 (面積和房齡) 稱為特征 (feature) 或協(xié)變量 (covariate)
線性模型
  • 線性假設(shè)是指:目標(biāo) (房屋價格) 可以表示為特征 (面積和房齡) 的加權(quán)和
    p r i c e = w a r e a ? a r e a + w a g e ? a g e + b \mathrm{price}=w_{\mathrm{area}}\cdot\mathrm{area}+w_{\mathrm{age}}\cdot\mathrm{age}+b price=warea??area+wage??age+b

    • w a r e a w_{area} warea? w a g e w_{age} wage? 稱為權(quán)重 (weight),權(quán)重決定了每個特征對預(yù)測值的影響
    • b b b 稱為偏置 (bias)、偏移量 (offset) 或截距 (intercept)。偏置是指當(dāng)所有特征都取 0 時,預(yù)測值應(yīng)該為多少。如果沒有偏置項,模型的表達(dá)能力將受到限制
    • 上式是輸入特征的一個仿射變換 (affine transformation)。仿射變換是通過加權(quán)和對特征進(jìn)行線性變換,并通過偏置項來平移
  • 給定一個數(shù)據(jù)集,目標(biāo)是尋找模型的權(quán)重 w w w 和偏置 b b b,使得根據(jù)模型做出的預(yù)測大體符合數(shù)據(jù)里的真實價格。輸出的預(yù)測值由輸入特征通過線性模型的仿射變換決定,仿射變換由所選權(quán)重和偏置確定

  • 而在機器學(xué)習(xí)領(lǐng)域,通常使用高維數(shù)據(jù)集,當(dāng)輸入包含 d d d 個特征時,預(yù)測結(jié)果 y ^ \hat{y} y^? (使用 “尖角” 符號表示 y y y估計值) 表示為
    y ^ = w 1 x 1 + . . . + w d x d + b \hat{y}=w_1x_1+...+w_dx_d+b y^?=w1?x1?+...+wd?xd?+b

  • 將所有特征放到向量 x ∈ R d {\mathbf{x}}\in\mathbb{R}^vxwlu0yf4 xRd 中,并將所有權(quán)重放到向量 w ∈ R d {\mathbf{w}}\in\mathbb{R}^vxwlu0yf4 wRd 中,可以用點積形式來簡潔地表達(dá)模型
    y ^ = w ? x + b \hat{y}=\mathbf{w}^\top\mathbf{x}+b y^?=w?x+b

  • 上式中,向量 x {\mathbf{x}} x 對應(yīng)于單個數(shù)據(jù)樣本的特征。用符號表示的矩陣 X ∈ R n × d \mathbf{X}\in\mathbb{R}^{n\times d} XRn×d 可以很方便地引用整個數(shù)據(jù)集的 n n n 個樣本。其中, X \mathbf{X} X每一行是一個樣本,每一列是一種特征。對于特征集合 X \mathbf{X} X,預(yù)測值 y ^ ∈ R n \hat{\mathbf{y}}\in\mathbb{R}^{n} y^?Rn 可以通過矩陣-向量乘法表示為
    y ^ = X w + b \hat{\mathbf{y}}=\mathbf{X}\mathbf{w}+b y^?=Xw+b

  • 給定訓(xùn)練數(shù)據(jù)特征 X \mathbf{X} X對應(yīng)的已知標(biāo)簽 y y y,線性回歸的目標(biāo)是找到一組權(quán)重向量 w w w 和偏置 b b b

    • 當(dāng)給定從 X \mathbf{X} X 的同分布中取樣的新樣本特征時,這組權(quán)重向量和偏置能夠使得新樣本預(yù)測標(biāo)簽的誤差盡可能小
    • 即使確信特征與標(biāo)簽的潛在關(guān)系是線性的,也會加入一個噪聲項來考慮觀測誤差帶來的影響

在開始尋找最好的模型參數(shù) (model parameters) w w w b b b 之前,還需要兩個東西

  • (1) 一種模型質(zhì)量的度量方式
  • (2) 一種能夠更新模型以提高模型預(yù)測質(zhì)量的方法
損失函數(shù)
  • 在考慮如何用模型擬合數(shù)據(jù)之前,需要確定一個擬合程度的度量。損失函數(shù) (loss function) 能夠量化目標(biāo)的實際值與預(yù)測值之間的差距。通常選擇非負(fù)數(shù)作為損失,且數(shù)值越小表示損失越小,完美預(yù)測時的損失為 0。回歸問題中最常用的損失函數(shù)是平方誤差函數(shù)。當(dāng)樣本 i i i 的預(yù)測值為 y ^ ( i ) \hat{y}^{(i)} y^?(i),其相應(yīng)的真實標(biāo)簽為 y ( i ) y^{(i)} y(i) 時,平方誤差可以定義為以下公式
    l ( i ) ( w , b ) = 1 2 ( y ^ ( i ) ? y ( i ) ) 2 l^{(i)}(\mathbf{w},b)=\frac12\left(\hat{y}^{(i)}-y^{(i)}\right)^2 l(i)(w,b)=21?(y^?(i)?y(i))2

  • 由于平方誤差函數(shù)中的二次方項,估計值 y ^ ( i ) \hat{y}^{(i)} y^?(i) 和觀測值 y ( i ) y^{(i)} y(i) 之間較大的差異將導(dǎo)致更大的損失。為了度景模型在整個數(shù)據(jù)集上的質(zhì)量,需計算在訓(xùn)練集 n n n 個樣本上的損失均值 (也等價于求和)
    L ( w , b ) = 1 n ∑ i = 1 n l ( i ) ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w ? x ( i ) + b ? y ( i ) ) 2 L(\mathbf{w},b)=\frac1n\sum_{i=1}^nl^{(i)}(\mathbf{w},b)=\frac1n\sum_{i=1}^n\frac12\left(\mathbf{w}^\top\mathbf{x}^{(i)}+b-y^{(i)}\right)^2 L(w,b)=n1?i=1n?l(i)(w,b)=n1?i=1n?21?(w?x(i)+b?y(i))2

  • 在訓(xùn)練模型時,希望尋找一組參數(shù) ( w ? , b ? ) (\mathbf{w}^*,b^*) (w?,b?),這組參數(shù)能最小化在所有訓(xùn)練樣本上的總損失
    w ? , b ? = argmin ? w , b L ( w , b ) \mathbf{w}^*,b^*=\underset{\mathbf{w},b}{\operatorname*{argmin}}L(\mathbf{w},b) w?,b?=w,bargmin?L(w,b)

解析解
  • 與其他大部分模型不同,線性回歸的解可以用一個公式簡單地表達(dá)出來,這類解叫作解析解。首先,將偏置 b b b 合并到參數(shù) w \mathbf{w} w 中,合并方法是在包含所有參數(shù)的矩陣中附加一列。預(yù)測問題是最小化 ∥ y ? X w ∥ 2 \|\mathbf{y}-\mathbf{X}\mathbf{w}\|^2 y?Xw2。這在損失平面上只有一個臨界點,這個臨界點對應(yīng)于整個區(qū)域的損失極小點。將損失關(guān)于 w \mathbf{w} w 的導(dǎo)數(shù)設(shè)為 0,得到解析解
    w ? = ( X ? X ) ? 1 X ? y \mathbf{w}^*=(\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top\mathbf{y} w?=(X?X)?1X?y
隨機梯度下降
  • 梯度下降 (gradient descent) 的方法幾乎可以優(yōu)化所有深度學(xué)習(xí)模型,它通過不斷地在損失函數(shù)遞減的方向上更新參數(shù)來降低誤差

  • 通常在每次需要計算更新的時候隨機抽取一小批樣本,這叫做小批量隨機梯度下降(minibatch stochastic gradient descent)

    • 在每次迭代中,首先隨機抽樣一個小批量 B \mathcal{B} B,它是由固定數(shù)量的訓(xùn)練樣本組成的
    • 然后,計算小批量的平均損失關(guān)于模型參數(shù)的導(dǎo)數(shù) (也可以稱為梯度)
    • 最后,將梯度乘以一個預(yù)先確定的正數(shù) η \eta η,并從當(dāng)前參數(shù)的值中減掉
      w ← w ? η ∣ B ∣ ∑ i ∈ B ? w l ( i ) ( w , b ) = w ? η ∣ B ∣ ∑ i ∈ B x ( i ) ( w ? x ( i ) + b ? y ( i ) ) , b ← b ? η ∣ B ∣ ∑ i ∈ B ? b l ( i ) ( w , b ) = b ? η ∣ B ∣ ∑ i ∈ B ( w ? x ( i ) + b ? y ( i ) ) . \begin{aligned}\mathbf{w}&\leftarrow\mathbf{w}-\frac\eta{|\mathcal{B}|}\sum_{i\in\mathcal{B}}\partial_\mathbf{w}l^{(i)}(\mathbf{w},b)=\mathbf{w}-\frac\eta{|\mathcal{B}|}\sum_{i\in\mathcal{B}}\mathbf{x}^{(i)}\left(\mathbf{w}^\top\mathbf{x}^{(i)}+b-y^{(i)}\right),\\b&\leftarrow b-\frac\eta{|\mathcal{B}|}\sum_{i\in\mathcal{B}}\partial_bl^{(i)}(\mathbf{w},b)=b-\frac\eta{|\mathcal{B}|}\sum_{i\in\mathcal{B}}\left(\mathbf{w}^\top\mathbf{x}^{(i)}+b-y^{(i)}\right).\end{aligned} wb?w?Bη?iB??w?l(i)(w,b)=w?Bη?iB?x(i)(w?x(i)+b?y(i)),b?Bη?iB??b?l(i)(w,b)=b?Bη?iB?(w?x(i)+b?y(i)).?
  • B \mathcal{B} B 表示每個小批量中的樣本數(shù),這也稱為批量大小 (batch size)。 η \eta η 表示學(xué)習(xí)率 (learning rate)。批量大小和學(xué)習(xí)率的值通常是手動預(yù)先指定,而不是通過模型訓(xùn)練得到的

    • 這些可調(diào)整但不在訓(xùn)練過程中更新的參數(shù)稱為超參數(shù) (hyperparameter)。調(diào)參 (hyperparameter tuning) 是選擇超參數(shù)的過程
    • 超參數(shù)通常是根據(jù)訓(xùn)練迭代結(jié)果來調(diào)整的,而訓(xùn)練迭代結(jié)果是在獨立的驗證數(shù)據(jù)集 上評估得到的
用模型進(jìn)行預(yù)測
  • 給定 “已學(xué)習(xí)” 的線性回歸模型 w ^ ? x + b ^ \mathbf{\hat{w}}^{\top}\mathbf{x}+\hat w^?x+b^,現(xiàn)在可以通過房屋面積 x 1 x_1 x1? 和房齡 x 2 x_2 x2? 來估計一個 (末包含在訓(xùn)練數(shù)據(jù)中的) 新房屋價格。給定特征估計目標(biāo)的過程通常稱為預(yù)測 (prediction) 或推斷 (inference)

1.1.2 矢量化加速

  • 在訓(xùn)練模型時,經(jīng)常希望能夠同時處理整個小批量的樣本,為實現(xiàn)這一點,需要對計算進(jìn)行矢量化
  • 為說明矢量化的重要性,考慮對向量相加的兩種方法,實例化兩個全為 1 的 10000 維向量
    • 在一種方法中,使用 Python 的 for 循環(huán)遍歷向量
    • 在另一種方法中,依賴對 + 的調(diào)用
    import math
    import time
    import numpy as np
    import torchn = 10000
    a = torch.ones([n])
    b = torch.ones([n])# 定義一個計時器
    class Timer:def __init__(self):self.times = []self.start()def start(self):self.tik = time.time()def stop(self):self.times.append(time.time() - self.tik)return self.times[-1]def avg(self):return sum(self.times) / len(self.times)def sum(self):return sum(self.times)def cumsum(self):return np.array(self.times).cumsum().tolist()# 使用 for 循環(huán),每次執(zhí)行一位的加法
    c = torch.zeros(n)
    timer = Timer()
    for i in range(n):c[i] = a[i] + b[i]# 使用重載的 + 運算符來計算按元素的和
    # 矢量化代碼通常會帶來數(shù)量級的加速
    timer.start()
    d = a + bprint(f'{timer.stop():.5f} sec')
    
    # 輸出
    '0.20727 sec'
    '0.00020 sec'
    

1.1.3 正態(tài)分布與平方損失

  • 通過對噪聲分布的假設(shè)來解讀平方損失目標(biāo)函數(shù)。正態(tài)分布 (normal distribution),也稱為高斯分布 (Gaussian distribution):若隨機變量 x x x 具有均值 μ \mu μ 和方差 σ 2 \sigma^{2} σ2 (標(biāo)準(zhǔn)差 σ \sigma σ),其正態(tài)分布概率密度函數(shù)如下
    p ( x ) = 1 2 π σ 2 exp ? ( ? 1 2 σ 2 ( x ? μ ) 2 ) \begin{aligned}p(x)&=\frac1{\sqrt{2\pi\sigma^2}}\exp\left(-\frac1{2\sigma^2}(x-\mu)^2\right)\end{aligned} p(x)?=2πσ2 ?1?exp(?2σ21?(x?μ)2)?

  • 均方誤差損失函數(shù) (簡稱均方損失) 可以用于線性回歸的一個原因是:假設(shè)了觀測中包含噪聲,其中噪聲服從正態(tài)分布。噪聲正態(tài)分布如下式,其中 ? ~ N ( 0 , σ 2 ) \epsilon\sim\mathcal{N}(0,\sigma^2) ?N(0,σ2)
    y = w ? x + b + ? y=\mathbf{w}^\top\mathbf{x}+b+\epsilon y=w?x+b+?

  • 因此,現(xiàn)在可以寫出通過給定的 x \mathbf{x} x 觀測到特定 y y y 的似然 (likelihood)
    P ( y ∣ x ) = 1 2 π σ 2 exp ? ( ? 1 2 σ 2 ( y ? w ? x ? b ) 2 ) P(y\mid\mathbf{x})=\frac1{\sqrt{2\pi\sigma^2}}\exp\left(-\frac1{2\sigma^2}(y-\mathbf{w}^\top\mathbf{x}-b)^2\right) P(yx)=2πσ2 ?1?exp(?2σ21?(y?w?x?b)2)

  • 現(xiàn)在,根據(jù)極大似然估計法,參數(shù) w \mathbf{w} w b b b 的最優(yōu)值是使整個數(shù)據(jù)集的似然最大的值
    P ( y ∣ X ) = ∏ i = 1 n p ( y ( i ) ∣ x ( i ) ) P(\mathbf{y}\mid\mathbf{X})=\prod_{i=1}^np(y^{(i)}|\mathbf{x}^{(i)}) P(yX)=i=1n?p(y(i)x(i))

? log ? P ( y ∣ X ) = ∑ i = 1 n 1 2 log ? ( 2 π σ 2 ) + 1 2 σ 2 ( y ( i ) ? w ? x ( i ) ? b ) 2 -\log P(\mathbf{y}\mid\mathbf{X})=\sum_{i=1}^n\frac12\log(2\pi\sigma^2)+\frac1{2\sigma^2}\left(y^{(i)}-\mathbf{w}^\top\mathbf{x}^{(i)}-b\right)^2 ?logP(yX)=i=1n?21?log(2πσ2)+2σ21?(y(i)?w?x(i)?b)2

import math
import numpy as np
import matplotlib.pyplot as pltdef normal(x, mu, sigma):p = 1 / math.sqrt(2 * math.pi * sigma**2)return p * np.exp(-0.5 / sigma ** 2 * (x - mu) ** 2)x = np.arange(-7, 7, 0.01)# 改變均值會產(chǎn)生沿 x 軸的偏移,增加方差將會分散分布、降低峰值
params = [(0, 1), (0, 2), (3, 1)]
plt.figure(figsize=(8, 6))
for mu, sigma in params:plt.plot(x, normal(x, mu, sigma), label=f'mean {mu}, std {sigma}')plt.xlabel('x')
plt.ylabel('p(x)')
plt.legend()
plt.show()

在這里插入圖片描述

1.1.4 從線性回歸到深度網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)圖
  • 下圖所示的神經(jīng)網(wǎng)絡(luò)中

    • 輸入為 x 1 , … , x d x_{1},\ldots,x_vxwlu0yf4 x1?,,xd?,因此輸入層中的輸入數(shù) (或稱為特征維度)為 d d d
    • 網(wǎng)絡(luò)的輸出為 o 1 o_1 o1?,因此輸出層中的輸出數(shù)是 1
  • 輸入值都是已經(jīng)給定的,并且只有一個計算神經(jīng)元。由于模型重點在發(fā)生計算的地方,所以通常在計算層數(shù)時不考慮輸入層。也就是說,下圖中神經(jīng)網(wǎng)絡(luò)的層數(shù)為 1

  • 可以將線性回歸模型視為僅由單個人工神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò),或稱為單層神經(jīng)網(wǎng)絡(luò)。對于線性回歸,每個輸入都與每個輸出(在本例中只有一個輸出)相連,將這種變換 (圖中的輸出層) 稱為全連接層 (fully-connected laver) 或稱為稠密層 (dense laver)

在這里插入圖片描述

1.2 線性回歸的簡潔實現(xiàn)

1.2.1 生成數(shù)據(jù)集

  • 生成一個包含 1000 個樣本的數(shù)據(jù)集,每個樣本包含從標(biāo)準(zhǔn)正態(tài)分布中采樣的 2 個特征。合成數(shù)據(jù)集是一個矩陣 x ∈ R 1000 × 2 \mathbf{x}\in\mathbb{R}^{1000\times2} xR1000×2
  • 使用線性模型參數(shù) w = [ 2 , ? 3.4 ] T , b = 4.2 \mathbf{w}=[2,-3.4]^{\mathsf{T}},b=4.2 w=[2,?3.4]T,b=4.2 和噪聲項 ? \epsilon ? 生成數(shù)據(jù)集及其標(biāo)簽
    • ? \epsilon ? 可視為模型預(yù)測和標(biāo)簽時的潛在觀測誤差,假設(shè) ? \epsilon ? 服從均值為 0 的正態(tài)分布,此處將標(biāo)準(zhǔn)差設(shè)為 0.01
      y = X w + b + ? \mathbf{y}=\mathbf{X}\mathbf{w}+b+\epsilon y=Xw+b+?
    import numpy as np
    import torch
    from torch.utils import datadef synthetic_data(w, b, num_examples):X = torch.normal(0, 1, (num_examples, len(w)))y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))true_w = torch.tensor([2, -3.4])
    true_b = 4.2
    features, labels = synthetic_data(true_w, true_b, 1000)
    

1.2.2 讀取數(shù)據(jù)集

  • 調(diào)用框架中現(xiàn)有的 API 來讀取數(shù)據(jù)。將 features 和 labels 作為 API 的參數(shù)傳遞,并通過數(shù)據(jù)迭代器指定 batch_size。此外,布爾值 is_train 表示是否希望數(shù)據(jù)迭代器對象在每個迭代周期內(nèi)打亂數(shù)據(jù)
    def load_array(data_arrays, batch_size, is_train=True):dataset = data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffle=is_train)batch_size = 10
    data_iter = load_array((features, labels), batch_size)# 為了驗證是否正常工作,讀取并打印第一個小批量樣本
    # 使用 iter 構(gòu)造 Python 迭代器,并使用 next 從迭代器中獲取第一項
    print(next(iter(data_iter)))
    
    # 輸出
    [tensor([[ 1.0829, -0.0883],[ 0.0989,  0.7460],[ 1.0245, -0.1956],[-0.7932,  1.7843],[ 1.2336,  1.0276],[ 2.1166,  0.2072],[-0.1430,  0.4944],[ 0.7086,  0.3950],[-0.0851,  1.4635],[ 0.2977,  1.8625]]), 
    tensor([[ 6.6616],[ 1.8494],[ 6.9229],[-3.4516],[ 3.1747],[ 7.7283],[ 2.2302],[ 4.2612],[-0.9383],[-1.5352]])]
    

1.2.3 定義模型

  • 對于標(biāo)準(zhǔn)深度學(xué)習(xí)模型,可使用框架的預(yù)定義好的層,只需關(guān)注使用哪些層來構(gòu)造模型,而不必關(guān)注層的實現(xiàn)細(xì)節(jié)
  • 在 PyTorch 中,全連接層在 Linear 類中定義。值得注意的是,將兩個參數(shù)傳遞到 nn.Linear 中
    • 第一個指定輸入特征形狀,即 2
    • 第二個指定輸出特征形狀(單個標(biāo)量),為 1
    from torch import nnnet = nn.Sequential(nn.Linear(2, 1))
    

1.2.4 初始化模型參數(shù)

  • 使用 net 之前需要初始化模型參數(shù),如:在線性回歸模型中的權(quán)重和偏置。深度學(xué)習(xí)框架通常有預(yù)定義的方法來初始化參數(shù)。在這里,指定每個權(quán)重參數(shù)應(yīng)該從均值為 0、標(biāo)準(zhǔn)差為 0.01 的正態(tài)分布中隨機采樣,偏置參數(shù)將初始化為零
    net[0].weight.data.normal_(0, 0.01)
    net[0].bias.data.fill_(0)
    

1.2.5 定義損失函數(shù)

  • 計算均方誤差使用的是 MSELoss 類,也稱為平方 L 2 L_2 L2? 范數(shù)。默認(rèn)情況下,它返回所有樣本損失的平均值
    loss = nn.MSELoss()
    

1.2.6 定義優(yōu)化算法

  • 小批量隨機梯度下降算法是一種優(yōu)化神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn)工具,PyTorch 在 optim 模塊中實現(xiàn)了該算法的許多變種。當(dāng)實例化一個 SGD 實例時,要指定優(yōu)化的參數(shù)以及優(yōu)化算法所需的超參數(shù)字典。小批量隨機梯度下降只需要設(shè)置 lr 值,這里設(shè)置為 0.03
    trainer = torch.optim.SGD(net.parameters(), lr=0.03)
    

1.2.7 訓(xùn)練

  • 在每個迭代周期,將完整遍歷一次數(shù)據(jù)集,不停從中獲取一個小批量的輸入和相應(yīng)的標(biāo)簽。對每一個小批量,進(jìn)行以下步驟
    • 通過調(diào)用 net(X) 生成預(yù)測并計算損失 l (前向傳播)
    • 通過進(jìn)行反向傳播來計算梯度
    • 通過調(diào)用優(yōu)化器來更新模型參數(shù)
  • 為了更好的衡量訓(xùn)練效果,計算每個迭代周期后的損失,并打印它來監(jiān)控訓(xùn)練過程
    num_epochs = 3
    for epoch in range(num_epochs):for X, y in data_iter:l = loss(net(X) ,y)trainer.zero_grad()l.backward()trainer.step()l = loss(net(features), labels)print(f'epoch {epoch + 1}, loss {l:f}')
    
  • 代碼匯總
    import numpy as np
    import torch
    from torch.utils import data
    from torch import nn# 生成數(shù)據(jù)集
    def synthetic_data(w, b, num_examples):X = torch.normal(0, 1, (num_examples, len(w)))y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))true_w = torch.tensor([2, -3.4])
    true_b = 4.2
    features, labels = synthetic_data(true_w, true_b, 1000)# 讀取數(shù)據(jù)集
    def load_array(data_arrays, batch_size, is_train=True):dataset = data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffle=is_train)batch_size = 10
    data_iter = load_array((features, labels), batch_size)# 定義模型
    net = nn.Sequential(nn.Linear(2, 1))# 初始化模型參數(shù)
    net[0].weight.data.normal_(0, 0.01)
    net[0].bias.data.fill_(0)# 定義損失函數(shù)
    loss = nn.MSELoss()# 定義優(yōu)化算法
    trainer = torch.optim.SGD(net.parameters(), lr=0.03)# 訓(xùn)練
    num_epochs = 3
    for epoch in range(num_epochs):for X, y in data_iter:l = loss(net(X) ,y)trainer.zero_grad()l.backward()trainer.step()l = loss(net(features), labels)print(f'epoch {epoch + 1}, loss {l:f}')w = net[0].weight.data
    print('w的估計誤差:', true_w - w.reshape(true_w.shape))
    b = net[0].bias.data
    print('b的估計誤差:', true_b - b)
    
    # 輸出
    epoch 1, loss 0.000216
    epoch 2, loss 0.000104
    epoch 3, loss 0.000102
    w的估計誤差: tensor([-0.0002,  0.0004])
    b的估計誤差: tensor([0.0002])
    

1.3 softmax 回歸

1.3.1 分類問題

  • 從一個圖像分類問題開始。假設(shè)每次輸入是一個 2 x 2 的灰度圖像??梢杂靡粋€標(biāo)量表示每個像素值,每個圖像對應(yīng)四個特征 x 1 , x 2 , x 3 , x 4 x_{1},x_{2},x_{3},x_{4} x1?,x2?,x3?,x4?。此外,假設(shè)每個圖像屬于類別 “貓” “雞” 和 “狗” 中的一個
  • 一種表示分類數(shù)據(jù)的簡單方法:獨熱編碼 (one-hot encoding)。獨熱編碼是一個向量,它的分量和類別一樣多。類別對應(yīng)的分量設(shè)置為 1,其他所有分量設(shè)置為 0。在本例中,標(biāo)簽 y y y 將是一個三維向量,其中 (1,0,0) 對應(yīng)于 “貓”、(0,1,0) 對應(yīng)于 “雞”、(0,0,1) 對應(yīng)于 “狗”
    y ∈ { ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) } y\in\{(1,0,0),(0,1,0),(0,0,1)\} y{(1,0,0),(0,1,0),(0,0,1)}

1.3.2 網(wǎng)絡(luò)架構(gòu)

  • 為估計所有可能類別的條件概率,需要一個有多個輸出的模型,每個類別對應(yīng)一個輸出。為了解決線性模型的分類問題,需要和輸出一樣多的仿射函數(shù)。每個輸出對應(yīng)于它自己的仿射函數(shù)。本例中有 4 個特征和 3 個可能的輸出類別,因此將需要 12 個標(biāo)量來表示權(quán)重 (帶下標(biāo)的 w w w),3 個標(biāo)量來表示偏置 (帶下標(biāo)的 b b b)。下面為每個輸入計算三個未規(guī)范化的預(yù)測 (logit): o 1 , o 2 和 o 3 o_1,o_2\text{和}o_3 o1?,o2?o3?
    o 1 = x 1 w 11 + x 2 w 12 + x 3 w 13 + x 4 w 14 + b 1 , o 2 = x 1 w 21 + x 2 w 22 + x 3 w 23 + x 4 w 24 + b 2 , o 3 = x 1 w 31 + x 2 w 32 + x 3 w 33 + x 4 w 34 + b 3 . \begin{aligned}o_1&=x_1w_{11}+x_2w_{12}+x_3w_{13}+x_4w_{14}+b_1,\\o_2&=x_1w_{21}+x_2w_{22}+x_3w_{23}+x_4w_{24}+b_2,\\o_3&=x_1w_{31}+x_2w_{32}+x_3w_{33}+x_4w_{34}+b_3.\end{aligned} o1?o2?o3??=x1?w11?+x2?w12?+x3?w13?+x4?w14?+b1?,=x1?w21?+x2?w22?+x3?w23?+x4?w24?+b2?,=x1?w31?+x2?w32?+x3?w33?+x4?w34?+b3?.?

  • 可以用神經(jīng)網(wǎng)絡(luò)圖描述這個計算過程。與線性回歸一樣,softmax 回歸也是一個單層神經(jīng)網(wǎng)絡(luò)由于計算每個輸出 o 1 , o 2 和 o 3 o_1,o_2\text{和}o_3 o1?,o2?o3? 取決于所有輸入 x 1 , x 2 , x 3 和 x 4 x_{1},x_{2},x_{3}\text{和}x_{4} x1?,x2?,x3?x4?,所以 softmax 回歸的輸出層也是全連接層

在這里插入圖片描述

1.3.3 全連接層的參數(shù)開銷

  • 全連接層是 “完全” 連接的,可能有很多可學(xué)習(xí)的參數(shù)。具體來說,對于任何具有 d d d 個輸入和 q q q 個輸出的全連接層,參數(shù)開銷為 O ( d q ) \mathcal{O}(dq) O(dq)。將 d d d 個輸入轉(zhuǎn)換為 q q q 個輸出的成本可以減少到 O ( d q n ) \mathcal{O}({\frac{dq}{n}}) O(ndq?),其中超參數(shù) n n n 可以靈活指定,以在實際應(yīng)用中平衡參數(shù)節(jié)約和模型有效性

1.3.4 softmax 運算

  • softmax 函數(shù)能夠將未規(guī)范化的預(yù)測變換為非負(fù)數(shù)并且總和為 1,同時讓模型保持可導(dǎo)的性質(zhì)。為了完成這一目標(biāo),首先對每個未規(guī)范化的預(yù)測求冪,這樣可以確保輸出非負(fù)。為了確保最終輸出的概率值總和為 1,再讓每個求冪后的結(jié)果除以它們的總和
    y ^ = s o f t m a x ( o ) 其中 y ^ j = exp ? ( o j ) ∑ k exp ? ( o k ) \hat{\mathbf{y}}=\mathrm{softmax}(\mathbf{o})\quad\text{其中}\quad\hat{y}_j=\frac{\exp(o_j)}{\sum_k\exp(o_k)} y^?=softmax(o)其中y^?j?=k?exp(ok?)exp(oj?)?

  • 盡管softmax是一個非線性函數(shù),但 softmax 回歸的輸出仍然由輸入特征的仿射變換決定。因此 softmax 回歸是一個線性模型

1.3.5 小批量樣本的矢量化

  • 為了提高計算效率并且充分利用 GPU,通常會對小批量樣本的數(shù)據(jù)執(zhí)行矢量計算。softmax 回歸的矢量計算表達(dá)式為
    O = X W + b , Y ^ = s o f t m a x ( O ) \begin{aligned}\mathbf{O}&=\mathbf{X}\mathbf{W}+\mathbf,\\\hat{\mathbf{Y}}&=\mathrm{softmax}(\mathbf{O})\end{aligned} OY^?=XW+b,=softmax(O)?

1.3.6 損失函數(shù)

  • 略,基本同線性回歸

1.3.7 信息論基礎(chǔ)

  • 信息論 (information theory) 涉及編碼、解碼、發(fā)送以及盡可能簡潔地處理信息或數(shù)據(jù)

  • 信息論的核心思想是量化數(shù)據(jù)中的信息內(nèi)容,該數(shù)值被稱為分布 P P P熵 (entropy)
    H [ P ] = ∑ j ? P ( j ) log ? P ( j ) H[P]=\sum_j-P(j)\log P(j) H[P]=j??P(j)logP(j)

1.3.8 模型預(yù)測和評估

  • 在訓(xùn)練 softmax 回歸模型后,給出任何樣本特征,可以預(yù)測每個輸出類別的概率。通常使用預(yù)測概率最高的類別作為輸出類別。如果預(yù)測與實際類別 (標(biāo)簽) 一致,則預(yù)測是正確的。使用精度來評估模型的性能,精度等于正確預(yù)測數(shù)與預(yù)測總數(shù)之間的比率

1.4 圖像分類數(shù)據(jù)集

1.4.1 讀取數(shù)據(jù)集

import torch
import torchvision
from torch.utils import data
from torchvision import transforms
import matplotlib.pyplot as plt# 通過 ToTensor 實例將圖像數(shù)據(jù)從 PIL 類型變換成 32 位浮點數(shù)格式
# 并除以 255 使得所有像素的數(shù)值均在 0~1 之間
trans = transforms.ToTensor()
# root:指定數(shù)據(jù)集下載或保存的路徑;train:指定加載的是訓(xùn)練數(shù)據(jù)集還是測試數(shù)據(jù)集
# transform:指定數(shù)據(jù)集的轉(zhuǎn)換操作;download:指定是否下載數(shù)據(jù)集
mnist_train = torchvision.datasets.FashionMNIST(root="./data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(root="./data", train=False, transform=trans, download=True)# 將標(biāo)簽轉(zhuǎn)換成對應(yīng)的類別名稱
def get_fashion_mnist_labels(labels):text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']# 這是一個列表推導(dǎo)式# 1.將 labels 中的每個元素按照索引轉(zhuǎn)換為對應(yīng)的文本標(biāo)簽# 2.然后將這些元素組成一個新的列表并返回return [text_labels[int(i)] for i in labels]def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):figsize = (num_cols * scale, num_rows * scale)# 第一個變量_是一個通用變量名,通常用于表示一個不需要使用的值# 第二個變量 axes 是一個包含所有子圖對象的數(shù)組# 這里使用這種命名約定是為了表示只關(guān)心 axes 而不關(guān)心第一個返回值_, axes = plt.subplots(num_rows, num_cols, figsize=figsize)axes = axes.flatten()  # 將 axes 展平為一維數(shù)組# 遍歷 axes 和 imgs 的元素,其中 i 為索引,ax 為當(dāng)前子圖,img 為當(dāng)前圖像for i, (ax, img) in enumerate(zip(axes, imgs)):if isinstance(img, torch.Tensor):  # img 是一個 torch.Tensor 類型# img 是一個張量,假設(shè)其形狀為 (C, H, W),其中 C 代表通道數(shù),H 代表高度,W 代表寬度# permute(1, 2, 0) 是對 img 進(jìn)行維度重排操作。它將維度從 (C, H, W) 重排為 (H, W, C)ax.imshow(img.permute(1, 2, 0))else:ax.imshow(img) ax.axis('off')  # 關(guān)閉圖像的坐標(biāo)軸if titles:ax.set_title(titles[i])plt.show()X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
show_images(X, 2, 9, titles=get_fashion_mnist_labels(y))

在這里插入圖片描述

1.4.2 讀取小批量

  • 為了在讀取訓(xùn)練集和測試集時更容易,使用內(nèi)置的數(shù)據(jù)迭代器,而不是從零開始創(chuàng)建。在每次迭代中,數(shù)據(jù)加載器每次都會讀取一小批量數(shù)據(jù),大小為 batch_size。通過內(nèi)置數(shù)據(jù)迭代器,可以隨機打亂所有樣本,從而無偏見地讀取小批量
    • 當(dāng)處理較大的數(shù)據(jù)集時,一次向網(wǎng)絡(luò)喂入全部數(shù)據(jù)得不到很好的訓(xùn)練效果。通常將整個樣本的數(shù)量分成多個批次 batch,每個 batch 中樣本的個數(shù)叫做樣本大小 batch_size
    batch_size = 256def get_dataloader_workers():return 4  # 使用 4 個進(jìn)程來讀取數(shù)據(jù)
    train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers())
    

1.4.3 整合所有組件

  • 現(xiàn)在定義 load_data_fashion_mnist 函數(shù),用于獲取和讀取 Fashion-MNIST 數(shù)據(jù)集。這個函數(shù)返回訓(xùn)練集和驗證集的數(shù)據(jù)迭代器。此外,這個函數(shù)還接受一個可選參數(shù) resize,用來將圖像大小調(diào)整為另一種形狀
    def load_data_fashion_mnist(batch_size, resize=None):# 下載 Fashion-MNIST 數(shù)據(jù)集,然后將其加載到內(nèi)存中trans = [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize))trans = transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root="./data", train=True, transform=trans, download=True)mnist_test = torchvision.datasets.FashionMNIST(root="./data", train=False, transform=trans, download=True)return (data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers()),data.DataLoader(mnist_test, batch_size, shuffle=False,num_workers=get_dataloader_workers()))
    

1.5 softmax 回歸的簡潔實現(xiàn)

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt# 設(shè)置隨機種子以確保結(jié)果可重復(fù)
torch.manual_seed(42)# 定義超參數(shù)
batch_size = 128        # 每個批次的樣本數(shù)
learning_rate = 0.1     # 學(xué)習(xí)率,用于控制優(yōu)化過程中參數(shù)更新的步長
num_epochs = 100        # 訓(xùn)練的輪數(shù)# 加載 Fashion-MNIST 數(shù)據(jù)集
transform = transforms.Compose([transforms.ToTensor(),                # 將圖像轉(zhuǎn)換為張量transforms.Normalize((0.5,), (0.5,))  # 將像素值歸一化到 [-1,1] 區(qū)間
])# 加載訓(xùn)練集和測試集,并將數(shù)據(jù)轉(zhuǎn)換為張量
train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)# 創(chuàng)建訓(xùn)練集和測試集的數(shù)據(jù)加載器,用于批量獲取數(shù)據(jù)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)# 定義模型
# 創(chuàng)建了一個名為 SoftmaxRegression 的類,繼承自 nn.Module
class SoftmaxRegression(nn.Module):def __init__(self, input_size, num_classes):  # 構(gòu)造函數(shù) init 初始化super(SoftmaxRegression, self).__init__()# 定義了一個線性層 (nn.Linear) 作為模型的唯一層次結(jié)構(gòu)# 輸入大小為 input_size,輸出大小為 num_classesself.linear = nn.Linear(input_size, num_classes)# 實現(xiàn)了前向傳播操作,將輸入數(shù)據(jù)通過線性層得到輸出def forward(self, x):out = self.linear(x)return outmodel = SoftmaxRegression(input_size=784, num_classes=10)# 定義損失函數(shù)和優(yōu)化器
criterion = nn.CrossEntropyLoss()    # 用于計算多分類問題中的交叉熵?fù)p失
optimizer = optim.SGD(model.parameters(), lr=learning_rate)  # 定義隨機梯度下降優(yōu)化器,用于更新模型的參數(shù)# 訓(xùn)練模型
train_losses = []
test_losses = []
# 在模型訓(xùn)練的過程中,運行模型對全部數(shù)據(jù)完成一次前向傳播和反向傳播的完整過程叫做一個 epoch
# 在梯度下降的模型訓(xùn)練的過程中,神經(jīng)網(wǎng)絡(luò)逐漸從不擬合狀態(tài)到優(yōu)化擬合狀態(tài),達(dá)到最優(yōu)狀態(tài)之后會進(jìn)入過擬合狀態(tài)
# 因此 epoch 并非越大越好。數(shù)據(jù)越多樣,相應(yīng) epoch 就越大
for epoch in range(num_epochs):train_loss = 0.0# 1.將模型設(shè)置為訓(xùn)練模式model.train()  for images, labels in train_loader:# 將輸入數(shù)據(jù)展平images = images.reshape(-1, 784)# 前向傳播、計算損失、反向傳播和優(yōu)化outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()train_loss += loss.item()# 2.將模型設(shè)置為評估模式(在測試集上計算損失)model.eval()  test_loss = 0.0correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images = images.reshape(-1, 784)outputs = model(images)loss = criterion(outputs, labels)test_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()train_loss /= len(train_loader)test_loss /= len(test_loader)accuracy = 100 * correct / totaltrain_losses.append(train_loss)test_losses.append(test_loss)print(f'Epoch [{epoch + 1}/{num_epochs}], Train Loss: {train_loss:.4f}, Test Loss: {test_loss:.4f}, Accuracy: {accuracy:.2f}%')# 可視化損失
plt.plot(train_losses, label='Train Loss')
plt.plot(test_losses, label='Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()
# 輸出
Epoch [1/100], Train Loss: 0.6287, Test Loss: 0.5182, Accuracy: 81.96%
Epoch [2/100], Train Loss: 0.4887, Test Loss: 0.4981, Accuracy: 82.25%
Epoch [3/100], Train Loss: 0.4701, Test Loss: 0.4818, Accuracy: 82.49%
Epoch [4/100], Train Loss: 0.4554, Test Loss: 0.4719, Accuracy: 82.90%
Epoch [5/100], Train Loss: 0.4481, Test Loss: 0.4925, Accuracy: 82.57%
Epoch [6/100], Train Loss: 0.4360, Test Loss: 0.4621, Accuracy: 83.53%
Epoch [7/100], Train Loss: 0.4316, Test Loss: 0.4662, Accuracy: 83.53%
Epoch [8/100], Train Loss: 0.4293, Test Loss: 0.4543, Accuracy: 83.80%
Epoch [9/100], Train Loss: 0.4289, Test Loss: 0.5460, Accuracy: 81.09%
...

在這里插入圖片描述

http://www.risenshineclean.com/news/48652.html

相關(guān)文章:

  • 公裝網(wǎng)站怎么做全球搜是什么公司
  • 做網(wǎng)頁賺錢的網(wǎng)站小程序推廣運營的公司
  • 做百度推廣一定要有自已網(wǎng)站濟(jì)南seo優(yōu)化外包服務(wù)公司
  • 免費瀏覽網(wǎng)站的軟件優(yōu)化關(guān)鍵詞具體要怎么做
  • 做網(wǎng)站屬于什么行業(yè)網(wǎng)絡(luò)營銷的平臺有哪些
  • 軟件工程師需要具備哪些能力關(guān)鍵詞排名seo
  • Wordpress 點擊跟蹤深圳seo顧問
  • 定制程序網(wǎng)站鄭州seo哪家專業(yè)
  • 海爾公司網(wǎng)站建設(shè)現(xiàn)狀廚師培訓(xùn)機構(gòu)
  • 企業(yè)單頁網(wǎng)站模板百度賬號中心官網(wǎng)
  • 幫境外賭場做網(wǎng)站是否有風(fēng)險交換友情鏈接的網(wǎng)站標(biāo)準(zhǔn)是什么
  • 網(wǎng)站建設(shè)哪家好中國新聞
  • 谷歌優(yōu)化 網(wǎng)站建設(shè)百度推廣怎么看關(guān)鍵詞排名
  • 貴州遵義疫情最新消息合肥網(wǎng)站優(yōu)化方案
  • 效果圖制作網(wǎng)站20個排版漂亮的網(wǎng)頁設(shè)計
  • python網(wǎng)頁制作實例指定關(guān)鍵詞seo報價
  • 做軟裝什么網(wǎng)站可以嗎建什么網(wǎng)站可以長期盈利
  • 自己做的電影網(wǎng)站犯法嗎簡述網(wǎng)絡(luò)營銷的特點及功能
  • 網(wǎng)站設(shè)計流程長沙互聯(lián)網(wǎng)推廣公司
  • 社交網(wǎng)站推廣怎么做做一個網(wǎng)站
  • 成都誰做捕魚網(wǎng)站英文外鏈代發(fā)
  • 網(wǎng)絡(luò)營銷的目的seo專業(yè)培訓(xùn)學(xué)費多少錢
  • 張家港做網(wǎng)站多少錢條友網(wǎng)
  • 忠縣網(wǎng)站建設(shè)深圳網(wǎng)站建設(shè)優(yōu)化
  • 秦皇島平臺公司seo外鏈發(fā)布技巧
  • 網(wǎng)站手機端打不開產(chǎn)品銷售方案與營銷策略
  • 帶有響應(yīng)式的網(wǎng)站天津seo優(yōu)化排名
  • 現(xiàn)貨黃金什么網(wǎng)站可以做直播成都sem優(yōu)化
  • dw做網(wǎng)站常用標(biāo)簽傳智播客培訓(xùn)機構(gòu)官網(wǎng)
  • flash 網(wǎng)站制作青島網(wǎng)站建設(shè)方案優(yōu)化