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

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

依波手表價(jià)格 官方網(wǎng)站360搜索優(yōu)化

依波手表價(jià)格 官方網(wǎng)站,360搜索優(yōu)化,單頁網(wǎng)站怎么做外鏈,品牌建設(shè)不足的原因文章目錄 1.從數(shù)據(jù)中學(xué)習(xí)1)數(shù)據(jù)驅(qū)動(dòng)2)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù) 2.損失函數(shù)1)均方誤差2)交叉熵誤差3)mini-batch學(xué)習(xí) 3.數(shù)值微分1)概念2)數(shù)值微分實(shí)現(xiàn) 4.梯度1)實(shí)現(xiàn)2)梯度法3)梯度法實(shí)現(xiàn)4)…

文章目錄

      • 1.從數(shù)據(jù)中學(xué)習(xí)
        • 1)數(shù)據(jù)驅(qū)動(dòng)
        • 2)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)
      • 2.損失函數(shù)
        • 1)均方誤差
        • 2)交叉熵誤差
        • 3)mini-batch學(xué)習(xí)
      • 3.數(shù)值微分
        • 1)概念
        • 2)數(shù)值微分實(shí)現(xiàn)
      • 4.梯度
        • 1)實(shí)現(xiàn)
        • 2)梯度法
        • 3)梯度法實(shí)現(xiàn)
        • 4)神經(jīng)網(wǎng)絡(luò)的梯度
        • 5)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的梯度
      • 5.學(xué)習(xí)算法的實(shí)現(xiàn)
        • 1)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)步驟
        • 2)兩層神經(jīng)網(wǎng)絡(luò)的類實(shí)現(xiàn)
        • 3)mini-batch的實(shí)現(xiàn)
        • 4)小結(jié)

這里所說的“學(xué)習(xí)”是指從訓(xùn)練數(shù)據(jù)中自動(dòng)獲取最優(yōu)權(quán)重參數(shù)的過程。為了使神經(jīng)網(wǎng)絡(luò)能進(jìn)行學(xué)習(xí),將導(dǎo)入 損失函數(shù)這一指標(biāo)。而學(xué)習(xí)的目的就是以該損失函數(shù)為基準(zhǔn),找出能使它的值達(dá)到最小的權(quán)重參數(shù)。為了找出盡可能小的損失函數(shù)的值,利用了 函數(shù)斜率的梯度法

本章內(nèi)容:

? 機(jī)器學(xué)習(xí)中使用的數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)。
? 神經(jīng)網(wǎng)絡(luò)用訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),并用測(cè)試數(shù)據(jù)評(píng)價(jià)學(xué)習(xí)到的模型的泛化能力。
? 神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)以損失函數(shù)為指標(biāo),更新權(quán)重參數(shù),以使損失函數(shù)的值減小。
? 利用某個(gè)給定的微小值的差分求導(dǎo)數(shù)的過程,稱為數(shù)值微分。
? 利用數(shù)值微分,可以計(jì)算權(quán)重參數(shù)的梯度。
? 數(shù)值微分雖然費(fèi)時(shí)間,但是實(shí)現(xiàn)起來很簡(jiǎn)單。下一章中要實(shí)現(xiàn)的稍微復(fù)雜一些的誤差反向傳播法可以高速地計(jì)算梯度。

1.從數(shù)據(jù)中學(xué)習(xí)

神經(jīng)網(wǎng)絡(luò)的特征就是可以從數(shù)據(jù)中學(xué)習(xí)。所謂“從數(shù)據(jù)中學(xué)習(xí)”,是指可以由數(shù)據(jù)自動(dòng)決定權(quán)重參數(shù)的值。

1)數(shù)據(jù)驅(qū)動(dòng)

數(shù)據(jù)是機(jī)器學(xué)習(xí)的命根子。

比如識(shí)別5。一種方案是,先從圖像中提取特征量,再用機(jī)器學(xué)習(xí)技術(shù)學(xué)習(xí)這些特征量的模式。這里所說的“特征量”是指可以從輸入數(shù)據(jù)(輸入圖像)中準(zhǔn)確地提取本質(zhì)數(shù)據(jù)(重要的數(shù)據(jù))的轉(zhuǎn)換器。

圖像的特征量通常表示為向量的形式。在計(jì)算機(jī)視覺領(lǐng)域,常用的特征量包括SIFT、SURF 和 HOG 等。使用這些特征量將圖像數(shù)據(jù)轉(zhuǎn)換為向量,然后對(duì)轉(zhuǎn)換后的向量使用機(jī)器學(xué)習(xí)中的SVM、KNN等分類器進(jìn)行學(xué)習(xí)。

機(jī)器學(xué)習(xí)的方法中,由機(jī)器從收集到的數(shù)據(jù)中找出規(guī)律性。與從零開始想出算法相比,這種方法可以更高效地解決問題,也能減輕人的負(fù)擔(dān)。但是需要注意的是,將圖像轉(zhuǎn)換為向量時(shí)使用的特征量仍是由人設(shè)計(jì)的。

神經(jīng)網(wǎng)絡(luò)直接學(xué)習(xí)圖像本身。該方法不存在人為介入。圖像中包含的重要特征量都是由機(jī)器來學(xué)習(xí)的。

三種方案比較

在這里插入圖片描述

神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)是對(duì)所有的問題都可以用同樣的流程來解決。比如,不管要求解的問題是識(shí)別5,還是識(shí)別狗,抑或是識(shí)別人臉,神經(jīng)網(wǎng)絡(luò)都是通過不斷地學(xué)習(xí)所提供的數(shù)據(jù),嘗試發(fā)現(xiàn)待求解的問題的模式。也就是說,與待處理的問題無關(guān),神經(jīng)網(wǎng)絡(luò)可以將數(shù)據(jù)直接作為原始數(shù)據(jù),進(jìn)行“端對(duì)端”的學(xué)習(xí)。

2)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)

機(jī)器學(xué)習(xí)中,一般將數(shù)據(jù)分為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)兩部分來進(jìn)行學(xué)習(xí)和實(shí)驗(yàn)等**。首先,使用訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),尋找最優(yōu)的參數(shù);然后,使用測(cè)試數(shù)據(jù)評(píng)價(jià)訓(xùn)練得到的模型的實(shí)際能力。**另外,訓(xùn)練數(shù)據(jù)也可以稱為監(jiān)督數(shù)據(jù)。

泛化能力是指處理未被觀察過的數(shù)據(jù)(不包含在訓(xùn)練數(shù)據(jù)中的數(shù)據(jù))的能力。獲得泛化能力是機(jī)器學(xué)習(xí)的最終目標(biāo)。

因此,僅僅用一個(gè)數(shù)據(jù)集去學(xué)習(xí)和評(píng)價(jià)參數(shù),是無法進(jìn)行正確評(píng)價(jià)的。這樣會(huì)導(dǎo)致可以順利地處理某個(gè)數(shù)據(jù)集,但無法處理其他數(shù)據(jù)集的情況。順便說一下,只對(duì)某個(gè)數(shù)據(jù)集過度擬合的狀態(tài)稱為過擬合(over fitting)。避免過擬合也是機(jī)器學(xué)習(xí)的一個(gè)重要課題。

2.損失函數(shù)

神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)通過某個(gè)指標(biāo)表示現(xiàn)在的狀 k 3 k^3 k3態(tài)。然后,以這個(gè)指標(biāo)為基準(zhǔn),尋找最優(yōu)權(quán)重參數(shù)。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中所用的指標(biāo)稱為損失函數(shù)(loss function)。這個(gè)損失函數(shù)可以使用任意函數(shù),但一般用均方誤差和交叉熵誤差等。

損失函數(shù)是表示神經(jīng)網(wǎng)絡(luò)性能的“惡劣程度”的指標(biāo),即當(dāng)前的神經(jīng)網(wǎng)絡(luò)對(duì)監(jiān)督數(shù)據(jù)在多大程度上不擬合,在多大程度上不一致。“使性能的惡劣程度達(dá)到最小”和“使性能的優(yōu)良程度達(dá)到最大”是等價(jià)的,y^2

1)均方誤差

可以用作損失函數(shù)的函數(shù)有很多,其中最有名的是均方誤差(mean squared error)。均方誤差如下式所示。

在這里插入圖片描述

這里,y k {_k} k?是表示神經(jīng)網(wǎng)絡(luò)的輸出, t k t_k tk?表示監(jiān)督數(shù)據(jù),k表示數(shù)據(jù)的維數(shù)。

2)交叉熵誤差

除了均方誤差之外,交叉熵誤差(cross entropy error)也經(jīng)常被用作損失函數(shù)。交叉熵誤差如下式所示。

在這里插入圖片描述

這里,log表示以e為底數(shù)的自然對(duì)數(shù)(loge)。 y k y_k yk?是神經(jīng)網(wǎng)絡(luò)的輸出, t k t_k tk?是正確解標(biāo)簽。并且, t k t_k tk?中只有正確解標(biāo)簽的索引為1,其他均為0(one-hot表示)。
因此,實(shí)際上只計(jì)算對(duì)應(yīng)正確解標(biāo)簽的輸出的自然對(duì)數(shù)。

3)mini-batch學(xué)習(xí)

機(jī)器學(xué)習(xí)使用訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí)。使用訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),嚴(yán)格來說,就是針對(duì)訓(xùn)練數(shù)據(jù)計(jì)算損失函數(shù)的值,找出使該值盡可能小的參數(shù)。因此,計(jì)算損失函數(shù)時(shí)必須將所有的訓(xùn)練數(shù)據(jù)作為對(duì)象。也就是說,如果訓(xùn)練數(shù)據(jù)有100個(gè)的話,我們就要把這100個(gè)損失函數(shù)的總和作為學(xué)習(xí)的指標(biāo)。前面介紹的損失函數(shù)的例子中考慮的都是針對(duì)單個(gè)數(shù)據(jù)的損失函數(shù)。如果要求所有訓(xùn)練數(shù)據(jù)的損失函數(shù)的總和,以交叉熵誤差為例,可以寫成下面的式
在這里插入圖片描述

這里,假設(shè)數(shù)據(jù)有N個(gè), t n k t_{nk} tnk?表示第n個(gè)數(shù)據(jù)的第k個(gè)元素的值( y n k y_{nk} ynk?是神經(jīng)網(wǎng)絡(luò)的輸出, t n k t_{nk} tnk?是監(jiān)督數(shù)據(jù))。式子雖然看起來有一些復(fù)雜,其實(shí)只是把求單個(gè)數(shù)據(jù)的損失函數(shù)的式擴(kuò)大到了N份數(shù)據(jù),不過最后還要除以N進(jìn)行正規(guī)化。通過除以N,可以求單個(gè)數(shù)據(jù)的“平均損失函數(shù)”。通過這樣的平均化,可以獲得和訓(xùn)練數(shù)據(jù)的數(shù)量無關(guān)的統(tǒng)一指標(biāo)。比如,即便訓(xùn)練數(shù)據(jù)有1000個(gè)或10000個(gè),也可以求得單個(gè)數(shù)據(jù)的平均損失函數(shù)。

3.數(shù)值微分

所謂數(shù)值微分就是用數(shù)值方法近似求解函數(shù)的導(dǎo)數(shù)的過程。

1)概念

計(jì)算函數(shù)f在(x + h)和(x?h) 之間的差分。因?yàn)檫@種計(jì)算方法以 x 為中心,計(jì)算它左右兩邊的差分,所以也稱為中心差分(而(x + h)和x之間的差分稱為前向差分)。

利用微小的差分求導(dǎo)數(shù)的過程稱為數(shù)值微分。基于數(shù)學(xué)式的推導(dǎo)求導(dǎo)數(shù)的過程,則用“解析性”(analytic)一詞,稱為“解析性求解”或者“解析性求導(dǎo)”。

2)數(shù)值微分實(shí)現(xiàn)
# coding: utf-8
import numpy as np
import matplotlib.pylab as pltdef numerical_diff(f, x):#差分h = 1e-4 # 0.0001return (f(x+h) - f(x-h)) / (2*h)def function_1(x):return 0.01*x**2 + 0.1*x def tangent_line(f, x):d = numerical_diff(f, x)print(d)y = f(x) - d*xreturn lambda t: d*t + yx = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")
#求function_1函數(shù)在x=5的表達(dá)式,即為切線
tf = tangent_line(function_1, 5)
y2 = tf(x)plt.plot(x, y)
plt.plot(x, y2)
plt.show()

4.梯度

由全部變量的偏導(dǎo)數(shù)匯總而成的向量稱為梯度(gradient)。梯度指示的方向是各點(diǎn)處的函數(shù)值減小最多的方向

1)實(shí)現(xiàn)
# coding: utf-8
# cf.http://d.hatena.ne.jp/white_wheels/20100327/p3
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3Ddef _numerical_gradient_no_batch(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - h fxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 還原值return graddef numerical_gradient(f, X):if X.ndim == 1:return _numerical_gradient_no_batch(f, X)else:grad = np.zeros_like(X)for idx, x in enumerate(X):grad[idx] = _numerical_gradient_no_batch(f, x)return graddef function_2(x):if x.ndim == 1:return np.sum(x**2)else:return np.sum(x**2, axis=1)def tangent_line(f, x):d = numerical_gradient(f, x)print(d)y = f(x) - d*xreturn lambda t: d*t + yif __name__ == '__main__':x0 = np.arange(-2, 2.5, 0.25)x1 = np.arange(-2, 2.5, 0.25)X, Y = np.meshgrid(x0, x1)X = X.flatten()Y = Y.flatten()grad = numerical_gradient(function_2, np.array([X, Y]) )plt.figure()plt.quiver(X, Y, -grad[0], -grad[1],  angles="xy",color="#666666")#,headwidth=10,scale=40,color="#444444")plt.xlim([-2, 2])plt.ylim([-2, 2])plt.xlabel('x0')plt.ylabel('x1')# plt.grid()# plt.legend()plt.draw()plt.show()

運(yùn)行結(jié)果:
在這里插入圖片描述

結(jié)果表明梯度指向函數(shù)f(x0,x1) 的“最低處”(最小值),離“最低處”越遠(yuǎn),箭頭越大。

實(shí)際上,梯度會(huì)指向各點(diǎn)處的函數(shù)值降低的方向。更嚴(yán)格地講,梯度指示的方向是各點(diǎn)處的函數(shù)值減小最多的方向。

quiver方法說明

作用:繪制向量場(chǎng)

quiver([X, Y], U, V, [C], **kw)
其中 X, Y 定義了箭頭的位置, U, V 定義了箭頭的方向, C 作為可選參數(shù)用來設(shè)置顏色。
下面是幾個(gè)常見的參數(shù):

units: 此參數(shù)指示了除箭頭長度外,其他尺寸的變化趨勢(shì),以該單位的倍數(shù)測(cè)量。可取值為 {‘width’, ‘height’, ‘dots’, ‘inches’, ‘x’, ‘y’ ‘xy’}, 默認(rèn)是 ‘width’。需要配合 scale 參數(shù)使用。

scale: float, optional。此參數(shù)是每個(gè)箭頭長度單位的數(shù)據(jù)單位數(shù),通常該值越小,意味著箭頭越長,默認(rèn)為 None ,此時(shí)系統(tǒng)會(huì)采用自動(dòng)縮放算法。箭頭長度單位由 scale_units 參數(shù)指定。

scale_units: 此參數(shù)是可選參數(shù),其中包含以下值:{‘width’, ‘height’, ‘dots’, ‘inches’, ‘x’, ‘y’, ‘xy’}, 一般當(dāng) scale=None 時(shí)該選項(xiàng)指示長度單位,默認(rèn)為 None。

angles: 此參數(shù)指定了確定箭頭角度的方法,可以取 {‘uv’, ‘xy’} 或者 array-like, 默認(rèn)是 ‘uv’ 。 設(shè)計(jì)原因是 因?yàn)閳D的寬和高可能不同,所以 x 方向的單位長度和 y 方向的單位長度可能不同,這時(shí)我們需要做出選擇,一是不管長度對(duì)不對(duì),角度一定要對(duì),此時(shí) angles=‘uv’,二是不管角度了,只要長度對(duì)就可以了,此時(shí) angles=‘xy’。當(dāng)該值為一個(gè) array 的時(shí)候,該數(shù)組應(yīng)該是以度數(shù)為單位的數(shù)組,表示了每一個(gè)箭頭的方向,如下所示:

2)梯度法

機(jī)器學(xué)習(xí)的主要任務(wù)是在學(xué)習(xí)時(shí)尋找最優(yōu)參數(shù)。

同樣地,神經(jīng)網(wǎng)絡(luò)也必須在學(xué)習(xí)時(shí)找到最優(yōu)參數(shù)(權(quán)重和偏置)。這里所說的最優(yōu)參數(shù)是指損失函數(shù)取最小值時(shí)的參數(shù)。但是,一般而言,損失函數(shù)很復(fù)雜,參數(shù)空間龐大,我們不知道它在何處能取得最小值。而通過巧妙地使用梯度來尋找函數(shù)最小值(或者盡可能小的值)的方法就是梯度法。

函數(shù)的極小值、最小值以及被稱為鞍點(diǎn)(saddle point)的地方,梯度為0。極小值是局部最小值,也就是限定在某個(gè)范圍內(nèi)的最小值。鞍點(diǎn)是從某個(gè)方向上看是極大值,從另一個(gè)方向上看則是極小值的點(diǎn)。雖然梯度法是要尋找梯度為0的地方,但是那個(gè)地方不一定就是最小值(也有可能是極小值或者鞍點(diǎn))。此外,當(dāng)函數(shù)很復(fù)雜且呈扁平狀時(shí),學(xué)習(xí)可能會(huì)進(jìn)入一個(gè)(幾乎)平坦的地區(qū),陷入被稱為“學(xué)習(xí)高原”的無法前進(jìn)的停滯期。

在梯度法中,函數(shù)的取值從當(dāng)前位置沿著梯度方向前進(jìn)一定距離,然后在新的地方重新求梯度,再沿著新梯度方向前進(jìn),如此反復(fù),不斷地沿梯度方向前進(jìn)。像這樣,通過不斷地沿梯度方向前進(jìn),逐漸減小函數(shù)值的過程就是梯度法(gradient method)。梯度法是解決機(jī)器學(xué)習(xí)中最優(yōu)化問題的常用方法,特別是在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中經(jīng)常被使用。

η表示更新量,在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,稱為學(xué)習(xí)率。學(xué)習(xí)率決定在一次學(xué)習(xí)中,應(yīng)該學(xué)習(xí)多少,以及在多大程度上更新參數(shù)。
在這里插入圖片描述

上述式子是表示更新一次的式子,這個(gè)步驟會(huì)反復(fù)執(zhí)行。

學(xué)習(xí)率需要事先確定為某個(gè)值,比如0.01或0.001。一般而言,這個(gè)值過大或過小,都無法抵達(dá)一個(gè)“好的位置”。在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,一般會(huì)一邊改變學(xué)習(xí)率的值,一邊確認(rèn)學(xué)習(xí)是否正確進(jìn)行了。

3)梯度法實(shí)現(xiàn)
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
from gradient_2d import numerical_gradient#參數(shù)f是要進(jìn)行最優(yōu)化的函數(shù),init_x是初始值,lr是學(xué)習(xí)率learning rate,step_num 是梯度法的重復(fù)次數(shù)。
#使用這個(gè)函數(shù)可以求函數(shù)的極小值,順利的話,還可以求函數(shù)的最小值。
def gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xx_history = []for i in range(step_num):x_history.append( x.copy() )#numerical_gradient(f,x) 會(huì)求函數(shù)的梯度,用該梯度乘以學(xué)習(xí)率得到的值進(jìn)行更新操作,由step_num指定重復(fù)的次數(shù)。grad = numerical_gradient(f, x)x -= lr * gradreturn x, np.array(x_history)def function_2(x):return x[0]**2 + x[1]**2init_x = np.array([-3.0, 4.0])    lr = 0.1
step_num = 20
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)plt.plot( [-5, 5], [0,0], '--b')
plt.plot( [0,0], [-5, 5], '--b')
plt.plot(x_history[:,0], x_history[:,1], 'o')plt.xlim(-3.5, 3.5)
plt.ylim(-4.5, 4.5)
plt.xlabel("X0")
plt.ylabel("X1")
plt.show()

實(shí)驗(yàn)結(jié)果表明,學(xué)習(xí)率過大的話,會(huì)發(fā)散成一個(gè)很大的值;反過來,學(xué)習(xí)率過小的話,基本上沒怎么更新就結(jié)束了。也就是說,設(shè)定合適的學(xué)習(xí)率是一個(gè)很重要的問題。

像學(xué)習(xí)率這樣的參數(shù)稱為超參數(shù)。這是一種和神經(jīng)網(wǎng)絡(luò)的參數(shù)(權(quán)重和偏置)性質(zhì)不同的參數(shù)。相對(duì)于神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)是通過訓(xùn)練數(shù)據(jù)和學(xué)習(xí)算法自動(dòng)獲得的,學(xué)習(xí)率這樣的超參數(shù)則是人工設(shè)定的。一般來說,超參數(shù)需要嘗試多個(gè)值,以便找到一種可以使學(xué)習(xí)順利進(jìn)行的設(shè)定

4)神經(jīng)網(wǎng)絡(luò)的梯度

這里所說的梯度是指損失函數(shù)關(guān)于權(quán)重參數(shù)的梯度。比如,有一個(gè)只有一個(gè)形狀為2×3 的權(quán)重 W 的神經(jīng)網(wǎng)絡(luò),損失函數(shù)用L表示。此時(shí),梯度可以用 表示。用數(shù)學(xué)式表示的話,如下所示。

在這里插入圖片描述

5)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的梯度

根據(jù)梯度法,更新權(quán)重參數(shù)

# coding: utf-8
# 導(dǎo)入sys和os模塊,sys模塊提供了一些變量和函數(shù),os模塊提供了一些與操作系統(tǒng)交互的功能  
import sys, os
#為了導(dǎo)入父目錄中的文件而進(jìn)行的設(shè)定  
sys.path.append(os.pardir)  # 為了導(dǎo)入父目錄中的文件而進(jìn)行的設(shè)定
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient"""
simple Net類只有一個(gè)實(shí)例變量,即形狀為2×3的權(quán)重參數(shù)。它有兩個(gè)方法,一個(gè)是用于預(yù)測(cè)的predict(x),另一個(gè)是用于求損失函數(shù)值的loss(x,t)。這里參數(shù)x接收輸入數(shù)據(jù),t接收正確解標(biāo)簽。
"""
class simpleNet:def __init__(self):# 用高斯分布進(jìn)行初始化self.W = np.random.randn(2,3)
#用于預(yù)測(cè)def predict(self, x):return np.dot(x, self.W)def loss(self, x, t):# 計(jì)算預(yù)測(cè)結(jié)果z  z = self.predict(x)y = softmax(z)# 計(jì)算交叉熵誤差作為損失函數(shù)值  loss = cross_entropy_error(y, t)# 返回?fù)p失函數(shù)值return loss
x = np.array([0.6, 0.9])
t = np.array([0, 0, 1])net = simpleNet()
f = lambda w: net.loss(x, t)
dW = numerical_gradient(f, net.W)
#打印梯度dW
print(dW)

5.學(xué)習(xí)算法的實(shí)現(xiàn)

求出神經(jīng)網(wǎng)絡(luò)的梯度后,接下來只需根據(jù)梯度法,更新權(quán)重參數(shù)即可。

1)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)步驟

前提
神經(jīng)網(wǎng)絡(luò)存在合適的權(quán)重和偏置,調(diào)整權(quán)重和偏置以便擬合訓(xùn)練數(shù)據(jù)的過程稱為“學(xué)習(xí)”。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)分成下面4個(gè)步驟。
步驟1(mini-batch)
從訓(xùn)練數(shù)據(jù)中隨機(jī)選出一部分?jǐn)?shù)據(jù),這部分?jǐn)?shù)據(jù)稱為mini-batch。我們的目標(biāo)是減小mini-batch的損失函數(shù)的值。
步驟2(計(jì)算梯度)
為了減小mini-batch的損失函數(shù)的值,需要求出各個(gè)權(quán)重參數(shù)的梯度。梯度表示損失函數(shù)的值減小最多的方向。
步驟3(更新參數(shù))

將權(quán)重參數(shù)沿梯度方向進(jìn)行微小更新。

步驟4(重復(fù))
重復(fù)步驟1、步驟2、步驟3。

這個(gè)方法通過梯度下降法更新參數(shù),不過因?yàn)檫@里使用的數(shù)據(jù)是隨機(jī)選擇的mini batch數(shù)據(jù),所以又稱為隨機(jī)梯度下降法(stochastic gradient descent)。“隨機(jī)”指的是“隨機(jī)選擇的”的意思,因此,隨機(jī)梯度下降法是“對(duì)隨機(jī)選擇的數(shù)據(jù)進(jìn)行的梯度下降法”。深度學(xué)習(xí)的很多框架中,隨機(jī)梯度下降法一般由一個(gè)名為SGD的函數(shù)來實(shí)現(xiàn)。SGD 來源于隨機(jī)梯度下降法的英文名稱的首字母。

2)兩層神經(jīng)網(wǎng)絡(luò)的類實(shí)現(xiàn)
# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 為了導(dǎo)入父目錄的文件而進(jìn)行的設(shè)定
from common.functions import *
from common.gradient import numerical_gradientclass TwoLayerNet:#進(jìn)行初始化。參數(shù)從頭開始依次表示輸入層的神經(jīng)元數(shù)、隱藏層的神經(jīng)元數(shù)、輸出層的神經(jīng)元數(shù)def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):# 初始化權(quán)重#保存神經(jīng)網(wǎng)絡(luò)的參數(shù)的字典型變量(實(shí)例變量)。#params['W1'] 是第 1 層的權(quán)重,params['b1'] 是第 1 層的偏置。#params['W2'] 是第 2 層的權(quán)重,params['b2'] 是第 2 層的偏置self.params = {}self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)#進(jìn)行識(shí)別(推理)。參數(shù)x是圖像數(shù)據(jù)def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:輸入數(shù)據(jù), t:監(jiān)督數(shù)據(jù)#計(jì)算損失函數(shù)的值。參數(shù)x是圖像數(shù)據(jù),t是正確解標(biāo)簽(后面3個(gè)方法的參數(shù)也一樣)def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)#計(jì)算識(shí)別精度def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy#計(jì)算權(quán)重參數(shù)的梯度# x:輸入數(shù)據(jù), t:監(jiān)督數(shù)據(jù)def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return grads#計(jì)算權(quán)重參數(shù)的梯度。def gradient(self, x, t):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']#保存梯度的字典型變量(numerical_gradient() 方法的返回值)。#grads['W1'] 是第 1 層權(quán)重的梯度,grads['b1'] 是第 1 層偏置的梯度。#grads['W2'] 是第 2 層權(quán)重的梯度,grads['b2'] 是第 2 層偏置的梯度grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads

初始化方法會(huì)對(duì)權(quán)重參數(shù)進(jìn)行初始化。如何設(shè)置權(quán)重參數(shù)的初始值這個(gè)問題是關(guān)系到神經(jīng)網(wǎng)絡(luò)能否成功學(xué)習(xí)的重要問題。這里權(quán)重使用符合高斯分布的隨機(jī)數(shù)進(jìn)行初始化,偏置使用 0 進(jìn)行初始化。

3)mini-batch的實(shí)現(xiàn)

mini-batch 學(xué)習(xí),就是從訓(xùn)練數(shù)據(jù)中隨機(jī)選擇一部分?jǐn)?shù)據(jù)(稱為 mini-batch),再以這些mini-batch為對(duì)象,使用梯度法更新參數(shù)的過程

完整代碼實(shí)現(xiàn)如下:

train_neuralnet.py文件,訓(xùn)練并測(cè)試二層神經(jīng)網(wǎng)絡(luò)TwoLayerNet

# coding: utf-8
import sys, ossys.path.append(os.pardir)  # 為了導(dǎo)入父目錄的文件而進(jìn)行的設(shè)定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet# 讀入數(shù)據(jù)
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
iters_num = 10000  # 適當(dāng)設(shè)定循環(huán)的次數(shù)
# 獲取訓(xùn)練集的大小
train_size = x_train.shape[0]
# mini-batch的大小為100,需要每次從60000個(gè)訓(xùn)練數(shù)據(jù)中隨機(jī)取出100個(gè)數(shù)據(jù)(圖像數(shù)據(jù)和正確解標(biāo)簽數(shù)據(jù))。
batch_size = 100
# 設(shè)定學(xué)習(xí)率為0.1。
learning_rate = 0.1
train_loss_list = []
train_acc_list = []
test_acc_list = []
# 計(jì)算每個(gè)epoch的迭代次數(shù),至少為1。
iter_per_epoch = max(train_size / batch_size, 1)
# 對(duì)循環(huán)迭代次數(shù)進(jìn)行計(jì)數(shù)。
for i in range(iters_num):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]# 計(jì)算梯度# 使用網(wǎng)絡(luò)計(jì)算梯度。# 對(duì)這個(gè)包含100筆數(shù)據(jù)的mini-batch求梯度,使用隨機(jī)梯度下降法(SGD)更新參數(shù)。# grad = network.numerical_gradient(x_batch, t_batch)grad = network.gradient(x_batch, t_batch)  # 快速版# 對(duì)網(wǎng)絡(luò)中的參數(shù)進(jìn)行更新。for key in ('W1', 'b1', 'W2', 'b2'):network.params[key] -= learning_rate * grad[key]# 計(jì)算當(dāng)前批次的損失。loss = network.loss(x_batch, t_batch)# 將損失添加到列表中。train_loss_list.append(loss)if i % iter_per_epoch == 0:# 計(jì)算訓(xùn)練集上的準(zhǔn)確度。train_acc = network.accuracy(x_train, t_train)# 計(jì)算測(cè)試集上的準(zhǔn)確度。test_acc = network.accuracy(x_test, t_test)# 將訓(xùn)練準(zhǔn)確度添加到列表中。train_acc_list.append(train_acc)#將測(cè)試準(zhǔn)確度添加到列表中。test_acc_list.append(test_acc)# 打印訓(xùn)練和測(cè)試準(zhǔn)確度。print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))# 繪制圖形
# 定義用于繪圖的標(biāo)記類型。
markers = {'train': 'o', 'test': 's'}
# 創(chuàng)建x軸的坐標(biāo)值,從0到列表的
x = np.arange(len(train_acc_list))
plt.subplot(2,1,1)
# 繪制訓(xùn)練準(zhǔn)確度曲線
plt.plot(x, train_acc_list, label='train acc')
# 繪制測(cè)試準(zhǔn)確度曲線
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
# 繪制訓(xùn)練損失曲線
plt.subplot(2,1,2)
xx=np.arange(len(train_loss_list))
plt.plot(xx, train_loss_list, label='train loss')
plt.ylabel("loss")
plt.legend(loc='upper right')
# 顯示圖像
plt.show()

mnist.py,獲取手寫數(shù)據(jù)

# coding: utf-8
try:import urllib.request
except ImportError:raise ImportError('You should use Python 3.x')
import os.path
import gzip
import pickle
import os
import numpy as npurl_base = 'http://yann.lecun.com/exdb/mnist/'
key_file = {'train_img':'train-images-idx3-ubyte.gz','train_label':'train-labels-idx1-ubyte.gz','test_img':'t10k-images-idx3-ubyte.gz','test_label':'t10k-labels-idx1-ubyte.gz'
}dataset_dir = os.path.dirname(os.path.abspath(__file__))
save_file = dataset_dir + "/mnist.pkl"train_num = 60000
test_num = 10000
img_dim = (1, 28, 28)
img_size = 784def _download(file_name):file_path = dataset_dir + "/" + file_nameif os.path.exists(file_path):returnprint("Downloading " + file_name + " ... ")urllib.request.urlretrieve(url_base + file_name, file_path)print("Done")def download_mnist():for v in key_file.values():_download(v)def _load_label(file_name):file_path = dataset_dir + "/" + file_nameprint("Converting " + file_name + " to NumPy Array ...")with gzip.open(file_path, 'rb') as f:labels = np.frombuffer(f.read(), np.uint8, offset=8)print("Done")return labelsdef _load_img(file_name):file_path = dataset_dir + "/" + file_nameprint("Converting " + file_name + " to NumPy Array ...")    with gzip.open(file_path, 'rb') as f:data = np.frombuffer(f.read(), np.uint8, offset=16)data = data.reshape(-1, img_size)print("Done")return datadef _convert_numpy():dataset = {}dataset['train_img'] =  _load_img(key_file['train_img'])dataset['train_label'] = _load_label(key_file['train_label'])    dataset['test_img'] = _load_img(key_file['test_img'])dataset['test_label'] = _load_label(key_file['test_label'])return datasetdef init_mnist():download_mnist()dataset = _convert_numpy()print("Creating pickle file ...")with open(save_file, 'wb') as f:pickle.dump(dataset, f, -1)print("Done!")def _change_one_hot_label(X):T = np.zeros((X.size, 10))for idx, row in enumerate(T):row[X[idx]] = 1return Tdef load_mnist(normalize=True, flatten=True, one_hot_label=False):"""讀入MNIST數(shù)據(jù)集Parameters----------normalize : 將圖像的像素值正規(guī)化為0.0~1.0one_hot_label : one_hot_label為True的情況下,標(biāo)簽作為one-hot數(shù)組返回one-hot數(shù)組是指[0,0,1,0,0,0,0,0,0,0]這樣的數(shù)組flatten : 是否將圖像展開為一維數(shù)組Returns-------(訓(xùn)練圖像, 訓(xùn)練標(biāo)簽), (測(cè)試圖像, 測(cè)試標(biāo)簽)"""if not os.path.exists(save_file):init_mnist()with open(save_file, 'rb') as f:dataset = pickle.load(f)if normalize:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].astype(np.float32)dataset[key] /= 255.0if one_hot_label:dataset['train_label'] = _change_one_hot_label(dataset['train_label'])dataset['test_label'] = _change_one_hot_label(dataset['test_label'])if not flatten:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].reshape(-1, 1, 28, 28)return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) if __name__ == '__main__':init_mnist()

gradient.py文件,梯度計(jì)算

# coding: utf-8
import numpy as np"""計(jì)算函數(shù)f在給定輸入點(diǎn)x處的數(shù)值梯度
"""
def numerical_gradient(f, x):"""定義一個(gè)函數(shù)numerical_gradient,它接受兩個(gè)參數(shù):函數(shù)f和輸入點(diǎn)x """#設(shè)置步長h,即梯度下降法中的學(xué)習(xí)率,這里取值為0.0001。h = 1e-4 # 0.0001#初始化一個(gè)與輸入點(diǎn)x形狀和大小相同的零向量grad,用于存儲(chǔ)計(jì)算得到的梯度。grad = np.zeros_like(x)#使用np.nditer來遍歷輸入點(diǎn)x的所有元素,flags=['multi_index']表示返回多個(gè)索引,op_flags=['readwrite']表示讀寫操作。it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])#while循環(huán)條件是當(dāng)?shù)鱥t未完成時(shí)繼續(xù)循環(huán)。while not it.finished:idx = it.multi_indextmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - hfxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 還原值it.iternext()   return grad

運(yùn)行結(jié)果:

在這里插入圖片描述

隨著epoch的前進(jìn)(學(xué)習(xí)的進(jìn)行),發(fā)現(xiàn)使用訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)評(píng)價(jià)的識(shí)別精度都提高了,并且,這兩個(gè)識(shí)別精度基本上沒有差異(兩條線基本重疊在一起)。因此,可以說這次的學(xué)習(xí)中沒有發(fā)生過擬合的現(xiàn)象。隨著學(xué)習(xí)的進(jìn)行,損失函數(shù)的值在不斷減小。這是學(xué)習(xí)正常進(jìn)行的信號(hào),表示神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)在逐漸擬合數(shù)據(jù)。也就是說,神經(jīng)網(wǎng)絡(luò)的確在學(xué)習(xí)!通過反復(fù)地向它澆灌(輸入)數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)正在逐漸向最優(yōu)參數(shù)靠近。

epoch 是一個(gè)單位。一個(gè)epoch表示學(xué)習(xí)中所有訓(xùn)練數(shù)據(jù)均被使用過一次時(shí)的更新次數(shù)。比如,對(duì)于10000筆訓(xùn)練數(shù)據(jù),用大小為100筆數(shù)據(jù)的mini-batch進(jìn)行學(xué)習(xí)時(shí),重復(fù)隨機(jī)梯度下降法100次,所有的訓(xùn)練數(shù)據(jù)就都被“看過”了

一般做法是事先將所有訓(xùn)練數(shù)據(jù)隨機(jī)打亂,然后按指定的批次大小,按序生成 mini-batch。這樣每個(gè)mini-batch均有一個(gè)索引號(hào),比如此例可以是0, 1, 2,. . ., 99,然后用索引號(hào)可以遍歷所有的mini-batch。遍歷一次所有數(shù)據(jù),就稱為一個(gè)epoch。

4)小結(jié)

為了能順利進(jìn)行神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),我們導(dǎo)入了損失函數(shù)這個(gè)指標(biāo)。以這個(gè)損失函數(shù)為基準(zhǔn),找出使它的值達(dá)到最小的權(quán)重參數(shù),就是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的目標(biāo)。為了找到盡可能小的損失函數(shù)值,我們介紹了使用函數(shù)斜率的梯度法。

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

相關(guān)文章:

  • 網(wǎng)站建設(shè)客戶告知書長春網(wǎng)站優(yōu)化團(tuán)隊(duì)
  • 鄭州區(qū)塊鏈數(shù)字錢包網(wǎng)站開發(fā)多少錢廣州網(wǎng)頁制作
  • 網(wǎng)站管理建設(shè)的總結(jié)抖音代運(yùn)營
  • 做定制校服的網(wǎng)站煙臺(tái)seo快速排名
  • 網(wǎng)站開發(fā)服務(wù)費(fèi)記賬個(gè)人網(wǎng)站制作源代碼
  • 如何購買域名建網(wǎng)站網(wǎng)絡(luò)營銷推廣技巧
  • 咖啡公司網(wǎng)站建設(shè)策劃書網(wǎng)絡(luò)推廣需要多少錢
  • 做電影網(wǎng)站為什么查封不了沈陽seo整站優(yōu)化
  • 上海城建設(shè)計(jì)院網(wǎng)站網(wǎng)絡(luò)營銷策劃案范本
  • 創(chuàng)業(yè)如何進(jìn)行網(wǎng)站建設(shè)百度推廣云南總代理
  • 網(wǎng)站seo問題診斷工具網(wǎng)絡(luò)營銷的概念及內(nèi)容
  • 企業(yè)網(wǎng)絡(luò)營銷策劃案例seo網(wǎng)站推廣軟件
  • 做美工比較好的網(wǎng)站seo搜索引擎營銷工具
  • 優(yōu)化 導(dǎo)航網(wǎng)站幽默軟文廣告經(jīng)典案例
  • 有趣的網(wǎng)站知乎黑龍江seo關(guān)鍵詞優(yōu)化工具
  • 國外家具設(shè)計(jì)網(wǎng)站大全指數(shù)網(wǎng)站
  • 蘇州手機(jī)app開發(fā)公司seo排名優(yōu)化什么意思
  • 一個(gè)服務(wù)器做一樣的網(wǎng)站嗎精準(zhǔn)引流的網(wǎng)絡(luò)推廣方法
  • 建站上市公司成人技術(shù)培訓(xùn)班有哪些種類
  • 物聯(lián)網(wǎng)出來做什么工作首頁關(guān)鍵詞優(yōu)化價(jià)格
  • 安徽網(wǎng)新科技有限公司怎么樣廊坊seo外包
  • 廣東東莞寮步20號(hào)疫情最新情況朝陽seo排名
  • 做電影網(wǎng)站用什么主機(jī)好寧波關(guān)鍵詞優(yōu)化排名工具
  • 怎樣編輯網(wǎng)頁網(wǎng)站關(guān)鍵詞排名優(yōu)化
  • wordpress建站教程視頻百度指數(shù)需求圖譜
  • 類似于眾人幫的做任務(wù)賺傭金網(wǎng)站seo案例分析及解析
  • 給你一個(gè)網(wǎng)站你怎么做的嗎網(wǎng)盤網(wǎng)頁版
  • 深圳建設(shè)網(wǎng)站制作公司訊展網(wǎng)站優(yōu)化推廣
  • 網(wǎng)站制作的基本步驟診斷網(wǎng)站seo現(xiàn)狀的方法
  • 蕪湖建設(shè)工程質(zhì)量監(jiān)督站網(wǎng)站福建seo快速排名優(yōu)化