《R語言數(shù)據(jù)分析與挖掘》課件第6章神經(jīng)網(wǎng)絡(luò)_第1頁
《R語言數(shù)據(jù)分析與挖掘》課件第6章神經(jīng)網(wǎng)絡(luò)_第2頁
《R語言數(shù)據(jù)分析與挖掘》課件第6章神經(jīng)網(wǎng)絡(luò)_第3頁
《R語言數(shù)據(jù)分析與挖掘》課件第6章神經(jīng)網(wǎng)絡(luò)_第4頁
《R語言數(shù)據(jù)分析與挖掘》課件第6章神經(jīng)網(wǎng)絡(luò)_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

神經(jīng)網(wǎng)絡(luò)9.1基本原理人工神經(jīng)網(wǎng)絡(luò)是在生物學(xué)中神經(jīng)網(wǎng)絡(luò)的啟發(fā)下誕生了的。在生命科學(xué)中,神經(jīng)網(wǎng)絡(luò)是指動物大腦中一系列相互連接的神經(jīng)元。信號通過神經(jīng)元的軸突經(jīng)過突觸傳遞到其他神經(jīng)元的樹突上,這就是神經(jīng)元之間的接口。當(dāng)外界總的信號輸入超過了一定的閾值,神經(jīng)元則會沿著軸突傳遞信號。神經(jīng)元就可以通過接口相互影響,共同發(fā)揮作用。神經(jīng)元神經(jīng)元是人工神經(jīng)網(wǎng)絡(luò)中的基本組成單位,在結(jié)構(gòu)上受到了神經(jīng)生物學(xué)中動物大腦神經(jīng)元的啟示。單個神經(jīng)元的功能非常簡單,只是把輸入信號加權(quán)求和,再把結(jié)果傳遞給一個激活函數(shù)。一般地,激活函數(shù)會選擇性地抑制住一部分神經(jīng)元。典型的激活函數(shù)通常是非線性的。多個神經(jīng)元相互連接就組成了一個神經(jīng)網(wǎng)絡(luò)。通過選擇神經(jīng)元的數(shù)量、結(jié)合方式,以及激活函數(shù)的形式,用戶可以構(gòu)造不同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)。ReLU函數(shù)x

<-

seq

(-1,1,0.1)

#設(shè)置xrelu

<-

function

(x)

ifelse

(x

>

0,

x,

0)

#定義ReLU函數(shù)plot

(x,

relu(x),

type

=

"l")

#畫出函數(shù)text

(0.6,

0.4,

"ReLU

(x)")

#添加文字說明多層感知器模型多層感知器一般由至少三層神經(jīng)元組成,除了輸入層與輸出層之外,還至少包括一個被稱為隱層的中間層。一般在多層感知器中使用全連接模式,也就是相鄰層中的神經(jīng)元節(jié)點(diǎn)互相連接。在相鄰層的兩個神經(jīng)元ni和nj之間傳輸信號時,使用權(quán)重wij來定量表示這種連接關(guān)系。因?yàn)闄?quán)重wij的大小是可以調(diào)節(jié)的,如果使用非線性激活函數(shù),多層感知器可以逼近一些極其復(fù)雜的多變量函數(shù)。輸入層隱層輸出層反向傳播算法前向傳播:在神經(jīng)網(wǎng)絡(luò)中,信號從輸入層到輸出層逐層傳播。如果連接每一層的權(quán)重都是已知的,根據(jù)輸入信號就可以計(jì)算出輸出信號。當(dāng)權(quán)重未知時,需要根據(jù)輸入和輸出來估計(jì)權(quán)重,使得神經(jīng)網(wǎng)絡(luò)能刻畫出輸入和輸出之間的映射。反饋機(jī)制:猜測一組權(quán)重作為初始值,前向傳播信號計(jì)算出理論輸出,再根據(jù)理論值與實(shí)際值的偏差,來修正權(quán)重。偏差估計(jì)反向傳播:偏差信號從輸出層到輸入層逐層反向傳遞。把第i層的第j個神經(jīng)元的偏差記作。使用梯度下降法更新對權(quán)重參數(shù)的估計(jì)。因?yàn)橹挥休敵鰧拥钠梢灾苯佑?jì)算出來,在其他層中需要先得到估計(jì)偏差,才能用于修訂參數(shù)。把下一層的偏差傳遞給上一層,用于偏差估計(jì)簡化:梯度估計(jì)使用梯度下降的方法來求權(quán)重,需要首先得出梯度方向,也就是偏差對權(quán)重的偏導(dǎo)。把第i層的第j個神經(jīng)元的偏差記作。

,。鏈?zhǔn)角髮?dǎo):選擇步長,算法說明學(xué)習(xí)因子η對于算法的性能非常重要。因?yàn)樯窠?jīng)網(wǎng)絡(luò)中的優(yōu)化目標(biāo)函數(shù)不一定為凸,梯度下降法只能保證收斂到局部最優(yōu),不能保證全局最優(yōu)。對于一般的應(yīng)用而言,局部最優(yōu)實(shí)際上已經(jīng)能夠具有實(shí)用性。R語言中的神經(jīng)網(wǎng)絡(luò)包包

名說

明nnet支持單隱層的前饋神經(jīng)網(wǎng)絡(luò),可用于多項(xiàng)式對數(shù)線性模型neuralnet使用反向傳播算法訓(xùn)練神經(jīng)網(wǎng)絡(luò)h2o包含支持H2O的R腳本功能RSNNS斯圖加特神經(jīng)網(wǎng)絡(luò)模擬器的接口

tensorflowTensorFlow的接口deepnetR語言深度學(xué)習(xí)包darch支持深度架構(gòu)和受限玻爾茲曼機(jī)的R語言包rnn實(shí)現(xiàn)循環(huán)神經(jīng)網(wǎng)絡(luò)的包MXNetR支持靈活高效GPU計(jì)算和深度學(xué)習(xí)的R語言包kerasKeras的R語言接口內(nèi)容導(dǎo)航CONTENTS感知器模型基本原理深度神經(jīng)網(wǎng)絡(luò)9.19.29.39.2感知器模型人工神經(jīng)網(wǎng)絡(luò)一般都使用有監(jiān)督的學(xué)習(xí)。在神經(jīng)網(wǎng)絡(luò)中,通過學(xué)習(xí)來調(diào)整每個神經(jīng)元節(jié)點(diǎn)對輸入信號與偏移量加權(quán)時使用的權(quán)值。類似于其他有監(jiān)督學(xué)習(xí)的方法,訓(xùn)練神經(jīng)網(wǎng)絡(luò)的目標(biāo)就是通過參數(shù)的選擇使模型成為一個可以正確地把輸入數(shù)據(jù)轉(zhuǎn)化為預(yù)期輸出結(jié)果的映射??梢詰?yīng)用多層感知器模型,應(yīng)用神經(jīng)網(wǎng)絡(luò)解決非線性回歸與分類等有監(jiān)督學(xué)習(xí)中的問題neuralnet包R語言中的neuralnet包支持神經(jīng)網(wǎng)絡(luò)的基本操作。安裝與下載:install.packages

("neuralnet")library

("neuralnet")主要的神經(jīng)網(wǎng)絡(luò)建模函數(shù)為:neuralnet(formula,data,hidden=1,threshold=0.01,stepmax=1e+05,rep=1,startweights=NULL,learningrate.limit=NULL,learningrate.factor=list(minus=0.5,plus=1.2),learningrate=NULL,lifesign="none",lifesign.step=1000,algorithm="rprop+",err.fct="sse",act.fct="logistic",linear.output=TRUE,exclude=NULL,constant.weights=NULL,likelihood=FALSE)

稱說

明formula對需要擬合的模型形式的符號性描述data包含formula中所指定變量的數(shù)據(jù)框hidden一個整型數(shù)向量,表示每一個隱層中神經(jīng)元的個數(shù)threshold數(shù)值型停止條件,誤差函數(shù)偏導(dǎo)數(shù)的閾值stepmax訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最大步長,如果到達(dá)了這個最大值,則停止訓(xùn)練rep神經(jīng)網(wǎng)絡(luò)訓(xùn)練的最大迭代次數(shù)startweights包含權(quán)重初始值的向量algorithm包含用于神經(jīng)網(wǎng)絡(luò)計(jì)算的算法名稱的字符串,可選:backprop、rprop+、rprop–、sag或slr。backprop指反向傳播算法act.fct代表可微的激活函數(shù)名稱的字符串,logistic和tanh分別表示Logistic函數(shù)和雙曲正切函數(shù)err.fct字符串,表示用于計(jì)算誤差的可微函數(shù),可選sse和ce,分別代表誤差的平方和,以及交叉熵函數(shù)返回神經(jīng)網(wǎng)絡(luò)對象函數(shù)的返回值是一個nn類的對象,其屬性如右表所示。

稱說

明call與調(diào)用函數(shù)形式相匹配err.fct實(shí)際使用的誤差函數(shù)act.fct實(shí)際使用的激活函數(shù)datadata參數(shù)net.result包含神經(jīng)網(wǎng)絡(luò)每一次迭代的結(jié)果列表weights包含神經(jīng)網(wǎng)絡(luò)每一次迭代所擬合權(quán)重的向量應(yīng)用:非線性回歸#生成1~100之間的50個均勻分布的隨機(jī)數(shù)作為訓(xùn)練輸入traininginput

<-

as.data.frame

(runif

(50,

min=1,

max=100))trainingoutput

<-

log

(traininginput)

#按列綁定輸入輸出構(gòu)成訓(xùn)練集trainingdata

<-

cbind

(traininginput,trainingoutput)#設(shè)定訓(xùn)練數(shù)據(jù)的屬性名colnames

(trainingdata)

<-

c

("Input","Output")先看一個使用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)簡單非線性函數(shù)擬合的例子。首先,用均勻概率分布生成一些整數(shù),并對它們求對數(shù)值。然后,再用神經(jīng)網(wǎng)絡(luò)做出擬合與預(yù)測。設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)#網(wǎng)絡(luò)包含輸入層+隱層+輸出層,隱層帶有10個神經(jīng)元#指定損失函數(shù)閾值threshold=0.01net.log

<-

neuralnet

(Output~Input,

trainingdata,

hidden=10,

threshold=0.01)print

(net.log)多層感知器,由輸入層、輸出層,以及一個隱層構(gòu)成。隱層的節(jié)點(diǎn)數(shù)量設(shè)為10。函數(shù)中并沒有指定激活函數(shù),使用的是默認(rèn)形式Sigmoid??梢允褂胣et.log$act.fct來查看函數(shù)形式。泛型函數(shù)plot調(diào)用plot

(net.log)可以畫出網(wǎng)絡(luò)結(jié)構(gòu)。雖然形式簡陋,圖中標(biāo)出了訓(xùn)練后學(xué)習(xí)到的參數(shù)。測試神經(jīng)網(wǎng)絡(luò)#生成測試數(shù)據(jù)檢驗(yàn)神經(jīng)網(wǎng)絡(luò)的預(yù)測性能testdata

<-

as.data.frame

((1:10)^2)#輸入測試數(shù)據(jù),讓訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)完成運(yùn)算net.results<-compute(net.log,testdata)

#用更好的形式顯示結(jié)果,分別列出測試輸入、實(shí)際值、預(yù)測值niceoutput

<-

cbind

(testdata,

log(testdata),

as.data.frame

(net.results$net.result))colnames(niceoutput)

<-

c

("Input","Expected

Output","Neural

Net

Output")生成一組數(shù)據(jù)用于檢驗(yàn)神經(jīng)網(wǎng)絡(luò)的效果。打印niceoutput,比較實(shí)際值與預(yù)測值,看一看偏差是否可以接受。應(yīng)用:分類class.ind

<-

function(cl)

#輸入cl是一個表示分類結(jié)果的向量

{

n

<-

length

(cl)

cl

<-

as.factor

(cl)

#把cl轉(zhuǎn)換為因子型

x

<-

matrix

(0,

n,

length(levels(cl)))#生成值為0的初始矩陣

x[(1:n)

+

n*(unclass(cl)-1)]

<-

1

#匹配樣本及類別

dimnames(x)

<-

list(names(cl),

levels(cl))

#設(shè)置每一列的名稱

x

#返回處理好的矩陣

}在神經(jīng)元中使用的都是數(shù)值型變量。首先需要把分類結(jié)果表示成數(shù)值作為訓(xùn)練集的期望輸出。編寫函數(shù),把輸入的類別向量轉(zhuǎn)換成值為0或1的矩陣,如果元素值為1則表示那一行樣本對應(yīng)的類別為元素所在的列。輸入數(shù)據(jù)的規(guī)范化處理normalize

<-

function(x)

#設(shè)計(jì)規(guī)范化函數(shù)normalize(){

num

<-

x

-

min(x)

denom

<-

max(x)

-

min(x)

return

(num/denom)}#規(guī)范化數(shù)據(jù)集iris_norm

<-

as.data.frame(lapply(iris[1:4],

normalize))不同的變量可能有不同的取值范圍,這些取值范圍之間存在非常大的差異。在對數(shù)據(jù)進(jìn)行預(yù)處理時,編寫的函數(shù)normalize()完成數(shù)據(jù)規(guī)范化工作。把數(shù)據(jù)統(tǒng)一為0~1之間的實(shí)數(shù)值。劃分訓(xùn)練集與測試集set.seed

(1)index

<-

sample(nrow(iris),

nrow(iris)*0.7)iristrain

<-

iris_norm[index,]iristest

<-

iris_norm[-index,]#把測試集的分類結(jié)果用作class.ind

()的輸入iristrain.label

<-

iris

[index,5]iristest.label

<-

iris

[-index,5]target

<-

class.ind

(iristrain.label)iris.train

<-

cbind

(iristrain,

target)按照70%對30%的比例把數(shù)據(jù)集分為訓(xùn)練集與測試集兩個部分。使用sample()函數(shù)進(jìn)行抽樣。調(diào)用class.ind()函數(shù)把鳶尾花品種轉(zhuǎn)換成二值矩陣。再與花瓣、花萼的長寬數(shù)據(jù)一起組成新的測試數(shù)據(jù)集。設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)net.iris

<-

neuralnet( setosa

+

versicolor

+

virginica

~

Sepal.Length

+

Sepal.Width

+

Petal.Length

+

Petal.Width,

#輸入/輸出關(guān)系公式 data=iris.train,

#訓(xùn)練集 hidden=4

#1個隱層,含有4個神經(jīng)元)plot(net.iris)

#畫出神經(jīng)網(wǎng)絡(luò)

三層感知器模型:輸入層四個長寬測量值,隱層使用四個神經(jīng)元,在輸出層則是三個品種所對應(yīng)的輸出值。輸出(1,0,0)表示setosa品種。期望神經(jīng)網(wǎng)絡(luò)能夠用softmax方法在三個輸出值中選擇最大值來表示樣本所屬的品種。Softmax方法#得到網(wǎng)絡(luò)中訓(xùn)練集的輸出train.outputs

<-

as.data.frame

(net.iris$net.result)#得到每行中最大值所在列cid

<-

apply

(train.outputs,

1,

which.max)#使用品種名稱替換最大值results

<-

c

('setosa',

'versicolor',

'virginica')[cid]選擇最大值作為類別輸出。調(diào)用table

(results,

iristrain.label)生成混淆矩陣檢驗(yàn)分類效果。再使用compute對測試集檢驗(yàn)神經(jīng)網(wǎng)絡(luò)的泛化能力。內(nèi)容導(dǎo)航CONTENTS感知器模型基本原理深度神經(jīng)網(wǎng)絡(luò)9.19.29.39.3深度神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)是近年來受到廣泛關(guān)注的一個研究領(lǐng)域,在自然語言處理、計(jì)算機(jī)視覺、人機(jī)對弈等應(yīng)用中取得了巨大的成功。目前存在很多不同的深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)(多于1個隱層),包括自編碼器、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、長短時記憶網(wǎng)絡(luò)、受限玻爾茲曼網(wǎng)絡(luò)、深度信念網(wǎng)絡(luò)等。R語言迅速地跟蹤了深度學(xué)習(xí)的進(jìn)展,引入了支持深度學(xué)習(xí)的各種包?,F(xiàn)在,用戶能夠使用非常簡潔的形式,在R語言中實(shí)現(xiàn)大多數(shù)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。深度神經(jīng)網(wǎng)絡(luò)的形式名稱及縮寫類型學(xué)習(xí)方式輸入變量特

點(diǎn)自編碼器(AE)生成式無監(jiān)督多種適用于特征提取與降維輸入層與輸出層神經(jīng)元數(shù)量相等用輸出重建輸入信號,無標(biāo)簽數(shù)據(jù)卷積神經(jīng)網(wǎng)絡(luò)(CNN)判別式有監(jiān)督二維數(shù)據(jù)卷積層占用計(jì)算時間最多與一般深度神經(jīng)網(wǎng)絡(luò)相比連接數(shù)量較少對于視覺應(yīng)用需要大量訓(xùn)練數(shù)據(jù)長短時記憶網(wǎng)絡(luò)(LSTM)判別式有監(jiān)督順序、時間序列、長時間依賴數(shù)據(jù)對有較大時間延遲的數(shù)據(jù)性能優(yōu)越通過邏輯門保護(hù)對內(nèi)存的訪問循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)判別式有監(jiān)督順序,時間序列通過內(nèi)存處理數(shù)據(jù)序列適用于在物聯(lián)網(wǎng)等有時間依賴關(guān)系數(shù)據(jù)的情況受限玻爾茲曼機(jī)(RBM)生成式有監(jiān)督無監(jiān)督多種適用于特征提取、降維和分類,訓(xùn)練過程開銷大深度信念網(wǎng)絡(luò)(DBN)生成式無監(jiān)督有監(jiān)督多種適用于層次式的特征發(fā)現(xiàn),逐層貪婪地訓(xùn)練網(wǎng)絡(luò)變分自編碼器(VAE)生成式半監(jiān)督多種一種特殊的自編碼器;適用于稀疏性的標(biāo)簽數(shù)據(jù)對抗神經(jīng)網(wǎng)絡(luò)(GAN)混合式半監(jiān)督多種適用于有噪聲的數(shù)據(jù);由兩個網(wǎng)絡(luò)構(gòu)成:一個為生成式,另一個為判別式MXNetR包c(diǎn)ran

<-

getOption

("repos")cran["dmlc"]

<-

"/apache-mxnet/R/CRAN/"options

(repos

=

cran)install.packages

("mxnet")

深度學(xué)習(xí)使用的包會包含更多的內(nèi)容和更復(fù)雜的依賴關(guān)系,所以一般需要較長的安裝時間。很多深度學(xué)習(xí)包都會帶有支持GPU多線程運(yùn)算的版本,需要更復(fù)雜的安裝過程。前饋神經(jīng)網(wǎng)絡(luò)mx.model.FeedForward.create(symbol,x,y=NULL,ctx=NULL,

begin.round=1,num.round=10,optimizer="sgd",

initializer=mx.init.uniform(0.01),eval.data=NULL,

eval.metric=NULL,epoch.end.callback=NULL,

batch.end.callback=NULL,array.batch.size=128,

array.layout="auto",kvstore="local",verbose=TRUE,

arg.params=NULL,aux.params=NULL,s=NULL,

s=NULL,fixed.param=NULL,allow.extra.params=FALSE,

...)

在MXNetR包中,用戶對神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和訓(xùn)練方式擁有更多的控制。mx.model.FeedForward.create()函數(shù)可用于構(gòu)造前饋神經(jīng)網(wǎng)絡(luò),也就是一般的多層感知器。函數(shù)需要額外參數(shù):輸出激活函數(shù)、迭代次數(shù)、學(xué)習(xí)因子、動量和設(shè)備類型等。前饋神經(jīng)網(wǎng)絡(luò)的參數(shù)參

數(shù)

名說

明symbol神經(jīng)網(wǎng)絡(luò)的符號式配置y標(biāo)簽數(shù)組x訓(xùn)練數(shù)據(jù)num.round訓(xùn)練模型使用的迭代次數(shù)optimizer表示優(yōu)化算法的字符串,默認(rèn)值為sgd,即隨機(jī)梯度下降initializer參數(shù)初始化方案epoch.end.callback迭代結(jié)束時的回調(diào)函數(shù)batch.end.callback小批量迭代結(jié)束時的回調(diào)函數(shù)array.layout批量布局,可選項(xiàng)auto、colmajor、rowmajoreval.metric可選的函數(shù),用于結(jié)果的評價回歸應(yīng)用:波士頓房價library

(mlbench)library

(mxnet)data

(BostonHousing,

package="mlbench")

#使用波士頓房價數(shù)據(jù)集train.ind

<-

seq

(1,

506,

3)

#劃分訓(xùn)練集,使用三分之一的數(shù)據(jù)train.x

<-

data.matrix

(BostonHousing[train.ind,

-14])train.y

<-

BostonHousing[train.ind,

14]

#訓(xùn)練集預(yù)期輸出test.x

<-

data.matrix(BostonHousing[-train.ind,

-14])test.y

<-

BostonHousing[-train.ind,

14]

#測試集預(yù)期輸出值

使用深度神經(jīng)網(wǎng)絡(luò)完成回歸任務(wù),預(yù)測波士頓房價。準(zhǔn)備數(shù)據(jù)集,劃分訓(xùn)練集和測試集。符號定義#定義輸入數(shù)據(jù)data

<-

mx.symbol.Variable("data")#定義一個全連接隱層#data:

輸入數(shù)據(jù)來源#num_hidden:

本隱層的神經(jīng)元個數(shù)fc1

<-

mx.symbol.FullyConnected

(data,

num_hidden=1)#使用線性回歸函數(shù)定義輸出lro

<-

mx.symbol.LinearRegressionOutput

(fc1)

符號在MXNet中扮演重要角色??梢造`活地使用符號體系建立起一個復(fù)雜的前饋神經(jīng)網(wǎng)絡(luò)。在符號設(shè)置時需要考慮到層與層之間節(jié)點(diǎn)的連接、激活函數(shù)的形式、丟棄比例等種種因素。設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)mx.set.seed(0)

#使用MXNetR專用的隨機(jī)種子生成方式model

<-

mx.model.FeedForward.create

(lro,

X=train.x,

y=train.y,ctx=mx.cpu(),

#在CPU上訓(xùn)練num.round=50,

#允許迭代次數(shù)為50次array.batch.size=20,

#批量大小為20learning.rate=2e-6,

#學(xué)習(xí)因子momentum=0.9,

#動量eval.metric=mx.metric.rmse)

#用均方差根作為度量目標(biāo)線性回歸函數(shù)以誤差的平方為優(yōu)化目標(biāo)。把輸入層連接到輸出層。調(diào)用函數(shù)mx.model.FeedForward.create(),設(shè)置參數(shù)把網(wǎng)絡(luò)構(gòu)造出來。訓(xùn)練完成后可以進(jìn)行預(yù)測,preds<-predict(model,test.x)分類應(yīng)用:MNIST手寫體數(shù)字識別require(mxnet)

#加載所需的包train

<-

read.csv('data/train.csv',

header=TRUE)test

<-

read.csv('data/test.csv',

header=TRUE)train

<-

data.matrix(train)

#轉(zhuǎn)換成矩陣test

<-

data.matrix(test)train.x

<-

train[,-1]

#訓(xùn)練集的輸入與輸出train.y

<-

train[,1]

Kaggle維護(hù)的用于各種機(jī)器學(xué)習(xí)算法在圖形識別中的競賽的數(shù)據(jù)集。在數(shù)據(jù)集里,每一個數(shù)字用一個28×28像素的圖像表示。/c/digit-recognizer/data上可以看到有名為train.csv和test.csv的兩個文件。注冊并下載。數(shù)據(jù)預(yù)處理train.x

<-

t(train.x/255)test

<-

t(test/255)

>

table(train.y)

#統(tǒng)計(jì)需識別數(shù)字的頻數(shù)train.y0

1

2

3

4

5

6

7

8

9

4132

4684

4177

4351

4072

3795

4137

4401

4063

4188

因?yàn)閳D像使用灰度值,取值范圍在0~255之間,可以很容易地把數(shù)據(jù)歸一化。MXNet接受以列為主的格式,所以對矩陣進(jìn)行轉(zhuǎn)置操作??梢越y(tǒng)計(jì)出樣本中不同數(shù)字的分布。符號定義data

<-

mx.symbol.Variable("data")#輸入層數(shù)據(jù)data#第一層隱層:全連接,輸入數(shù)據(jù)data,激活函數(shù)ReLUfc1

<-

mx.symbol.FullyConnected(data,

name="fc1",

num_hidden=128)act1

<-

mx.symbol.Activation(fc1,

name="relu1",

act_type="relu")#第二層隱層:全連接,輸入數(shù)據(jù)act1,激活函數(shù)ReLUfc2

<-

mx.symbol.FullyConnected(act1,

name="fc2",

num_hidden=64)act2

<-

mx.symbol.Activation(fc2,

name="relu2",

act_type="relu")#輸出層:全連接,輸入數(shù)據(jù)act2,輸出函數(shù)softmaxfc3

<-

mx.symbol.FullyConnected(act2,

name="fc3",

num_hidden=10)softmax

<-

mx.symbol.SoftmaxOutput(fc3,

name="sm")

神經(jīng)網(wǎng)絡(luò)包含4層:輸入、隱層1、隱層2、輸出。層與層之間采用全連接方式,符號表示了依賴關(guān)系。可以設(shè)置各層的節(jié)點(diǎn)數(shù),還可以使用不同的激活函數(shù)。用softmax實(shí)現(xiàn)分類。訓(xùn)練神經(jīng)網(wǎng)絡(luò)devices

<-

mx.cpu()mx.set.seed(1000)model

<-

mx.model.FeedForward.create(softmax,

X=train.x,

y=train.y,ctx=devices,

num.round=10,

array.batch.size=100,learning.rate=0.07,

momentum=0.9,

eval.metric=mx.metric.accuracy,initializer=mx.init.uniform(0.07),epoch.end.callback=mx.callback.log.train.metric(100))使用CPU實(shí)現(xiàn)訓(xùn)練過程。在MXNet中,使用特殊的隨機(jī)種子生成函數(shù)mx.set.seed()來控制訓(xùn)練中的隨機(jī)過程。預(yù)測>

preds

<-

predict

(model,

test)>

pred.label

<-

max.col(t(preds))

-

1>

table(pred.label)pred.label

0

1

2

3

4

5

6

7

8

9

2826

3162

2802

2825

2713

2488

2736

2801

2807

2840

訓(xùn)練完成時可以達(dá)到非常好的精度。預(yù)測與其他模型類似,直接調(diào)用函數(shù)predict()即可。輸出是一個10列的矩陣,元素值表示了相應(yīng)數(shù)字的分類概率。使用函數(shù)max.col()

找到取值最大的那一列,就是手寫體的數(shù)字值。使用MXNet解決問題的步驟(1)數(shù)據(jù)預(yù)處理階段:設(shè)置訓(xùn)練集和測試集,對數(shù)據(jù)集進(jìn)行預(yù)處理。(2)結(jié)構(gòu)設(shè)計(jì)階段:使用符號體系建立每一層的結(jié)構(gòu)并設(shè)置層與層之間的數(shù)據(jù)依賴關(guān)系。(3)硬件分配:指定訓(xùn)練時所使用的設(shè)備。(4)訓(xùn)練階段:使用輸出符號、訓(xùn)練集、訓(xùn)練設(shè)備和其他訓(xùn)練選項(xiàng)作為參數(shù)創(chuàng)建神經(jīng)網(wǎng)絡(luò),按照選擇的控制參數(shù)完成訓(xùn)練。(5)測試階段:使用測試集預(yù)測,并評價網(wǎng)絡(luò)性能。keras包keras是Keras的R語言接口。允許在CPU或GPU上以無縫切換的方式運(yùn)行同樣的代碼。提供用戶友好的API,易于快速開發(fā)深度學(xué)習(xí)原型。支持卷積神經(jīng)網(wǎng)絡(luò)(針對計(jì)算機(jī)視覺應(yīng)用)、循環(huán)網(wǎng)絡(luò)(針對時間序列處理應(yīng)用)以及兩者的組合。支持任意形式的網(wǎng)絡(luò)架構(gòu),包括多輸入/多輸出模型、層與層共享、模型共享等,這實(shí)際意味著Keras適合于構(gòu)建幾乎任何深度學(xué)習(xí)模型,無論是存儲網(wǎng)絡(luò)還是神經(jīng)圖靈機(jī)。能夠在很多后端技術(shù)上運(yùn)行,包括TensorFlow、CNTK或Theano。下載與安裝install.packages

("keras")library

(keras)install_keras

()

安裝好keras包之后,還需要完成很多相互依賴的其他設(shè)置。數(shù)據(jù)集準(zhǔn)備library

(keras)

#加載keras包mnist

<-

dataset_mnist

()

#加載MNIST數(shù)據(jù)集x_train

<-

mnist$train$x

#訓(xùn)練集輸入y_train

<-

mnist$train$y

#訓(xùn)練集輸出x_test

<-

mnist$test$x

#測試集輸入y_test<-mnist$test$y

#測試集輸出

Keras提供了數(shù)據(jù)集。分布處理好訓(xùn)練集和測試集。x的類型是一個灰度值的三維數(shù)組(像素灰度值、寬度和高度)。y是一個整數(shù)型的向量,由整數(shù)0~9組成。調(diào)整維度與歸一化#調(diào)整形狀dim(x_train)

<-

c(nrow(x_train),

784)dim(x_test)

<-

c(nrow(x_test),

784)#歸一化x_train

<-

x_train

/

255x_test

<-

x_test

/

255

把三維數(shù)組轉(zhuǎn)化為矩陣。按照圖像的寬度和高度把圖像轉(zhuǎn)變?yōu)橐?,?8×28像素的圖像拉平成長度784的向量。然后實(shí)現(xiàn)歸一化。類別矩陣y_train

<-

to_categorical

(y_train,

10)y_test

<-

to_categorical

(y_test,

10)

直接調(diào)用to_categorical()函數(shù)就能把類別數(shù)據(jù)轉(zhuǎn)換成二值的分類矩陣。多層感知器設(shè)計(jì)model

<-

keras_model_sequential()

#初始化順序模型model

%>%

#

稠密層1,神經(jīng)元數(shù)256個,激活函數(shù)ReLU,

#

輸入一維向量,隨機(jī)舍棄40%神經(jīng)元節(jié)點(diǎn)

layer_dense(units

=

256,

activation

=

"relu",

input_shape

=

c(784))

%>%

layer_dropout(rate

=

0.4)

%>%

#稠密層2,神經(jīng)元數(shù)128個,激活函數(shù)ReLU,隨機(jī)舍棄30%神經(jīng)元節(jié)點(diǎn)

layer_dense(units

=

128,

activation

=

"relu")

%>%

layer_dropout(rate

=

0.3)

%>%

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論