摘要:初探最近在接觸些深度學(xué)習(xí)的東西,也對一些深度學(xué)習(xí)的框架進行了大致的了解。兩次參數(shù)的更新也有可能互相抵消掉,造成目標(biāo)函數(shù)震蕩的比較劇烈。損失函數(shù)該參數(shù)為模型試圖最小化的目標(biāo)函數(shù),它可為預(yù)定義的損失函數(shù)名,如,也可以為一個損失函數(shù)。
Keras 初探
最近在接觸些深度學(xué)習(xí)的東西,也對一些深度學(xué)習(xí)的框架進行了大致的了解。Python的科學(xué)計算包主要是Theano和TensorFlow,特點就是很強大,但對于初學(xué)者不太友好、有點難用。但Keras可以基于這兩種包之一方便地建立神經(jīng)網(wǎng)絡(luò)。
什么是KerasKeras是一個高層神經(jīng)網(wǎng)絡(luò)API,Keras由純Python編寫而成并基Tensorflow、Theano以及CNTK后端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉(zhuǎn)換為結(jié)果。
Keras可在Python 2.7或3.5運行,無縫調(diào)用后端的CPU或GPU網(wǎng)絡(luò)。Keras由Google的Francois Chollet開發(fā),并遵循以下原則:
模塊化:每個模塊都是多帶帶的流程或圖,深度學(xué)習(xí)的所有問題都可以通過組裝模塊解決
簡單化:提供解決問題的最簡單辦法,不加裝飾,最大化可讀性
擴展性:新模塊的添加特別容易,方便試驗新想法
Python:不使用任何自創(chuàng)格式,只使用原生Python
如下圖所示,在終端調(diào)用keras,后面會輸出下面的提示,說明keras默認(rèn)的后端為tensorflow
Using TensorFlow backend.
如果說默認(rèn)的后端不是tensorflow,而是theano,我們可以配置后端文件進行修改:
~/.keras/keras.json
里面是:
{"epsilon": 1e-07, "floatx": "float32", "backend": "theano"}
我們把backend參數(shù)改為tensorflow即可。
序貫?zāi)P?/b>Keras的目標(biāo)就是搭建模型。最主要的模型是Sequential:不同層的疊加。模型創(chuàng)建后可以編譯,調(diào)用后端進行優(yōu)化,可以指定損失函數(shù)和優(yōu)化算法。
編譯后的模型需要導(dǎo)入數(shù)據(jù):可以一批批加入數(shù)據(jù),也可以一次性全加入。訓(xùn)練后的模型就可以做預(yù)測或分類了。大體上的步驟是:
定義模型:創(chuàng)建Sequential模型,加入每一層
編譯模型:指定損失函數(shù)和優(yōu)化算法,使用模型的compile()方法
擬合數(shù)據(jù):使用模型的fit()方法擬合數(shù)據(jù)
進行預(yù)測:使用模型的evaluate() 或 predict()方法進行預(yù)測
Sequential(序貫?zāi)P?是多個網(wǎng)絡(luò)層的線性堆疊,說人話就是“一條路走到黑”。
我們一般通過.add()方法一個個的將layer加入模型:
from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential() model.add(Dense(32, input_shape=(784,))) model.add(Activation("relu"))輸入數(shù)據(jù)
Sequential的第一層需要接受一個關(guān)于輸入數(shù)據(jù)shape的參數(shù),后面的各個層則可以自動的推導(dǎo)出中間數(shù)據(jù)的shape,因此不需要為每個層都指定這個參數(shù)。
有幾種方法來為第一層指定輸入數(shù)據(jù)的shape
傳遞一個input_shape的關(guān)鍵字參數(shù)給第一層,input_shape是一個tuple類型的數(shù)據(jù),其中也可以填入None,如果填入None則表示此位置可能是任何正整數(shù)。數(shù)據(jù)的batch大小不應(yīng)包含在其中。
有些2D層,如Dense,支持通過指定其輸入維度input_dim來隱含的指定輸入數(shù)據(jù)shape,是一個Int類型的數(shù)據(jù)。一些3D的時域?qū)又С滞ㄟ^參數(shù)input_dim和input_length來指定輸入shape。
如果你需要為輸入指定一個固定大小的batch_size,可以傳遞batch_size參數(shù)到一個層中,例如你想指定輸入張量的batch大小是32,數(shù)據(jù)shape是(6,8),則你需要傳遞batch_size=32和input_shape=(6,8)。
model = Sequential() model.add(Dense(32, input_shape=(784,)))
一些重要概念:
batch:編譯模型和訓(xùn)練我們經(jīng)常用到的優(yōu)化算法——梯度下降,在該算法中參數(shù)更新的方式主要有2種。
第一種,遍歷全部數(shù)據(jù)集算一次損失函數(shù),然后算函數(shù)對各個參數(shù)的梯度,更新梯度。這種方法每更新一次參數(shù)都要把數(shù)據(jù)集里的所有樣本都看一遍,計算量開銷大,計算速度慢,不支持在線學(xué)習(xí),這稱為Batch gradient descent,批梯度下降。
第二種,每看一個數(shù)據(jù)就算一下?lián)p失函數(shù),然后求梯度更新參數(shù),這個稱為隨機梯度下降,stochastic gradient descent。這個方法速度比較快,但是收斂性能不太好,可能在最優(yōu)點附近晃來晃去,hit不到最優(yōu)點。兩次參數(shù)的更新也有可能互相抵消掉,造成目標(biāo)函數(shù)震蕩的比較劇烈。
為了克服兩種方法的缺點,現(xiàn)在一般采用的是一種折中手段,mini-batch gradient decent,小批的梯度下降,這種方法把數(shù)據(jù)分為若干個批,按批來更新參數(shù),這樣,一個批中的一組數(shù)據(jù)共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了隨機性。另一方面因為批的樣本數(shù)與整個數(shù)據(jù)集相比小了很多,計算量也不是很大。
基本上現(xiàn)在的梯度下降都是基于mini-batch的,所以Keras的模塊中經(jīng)常會出現(xiàn)batch_size,指的就是這個。
epochs:
指的就是訓(xùn)練過程中數(shù)據(jù)將被“輪”多少次。
在訓(xùn)練模型之前,我們需要通過compile來對學(xué)習(xí)過程進行配置。compile接收三個參數(shù):
優(yōu)化器optimizer:該參數(shù)可指定為已預(yù)定義的優(yōu)化器名,如rmsprop、adagrad,或一個Optimizer類的對象。
損失函數(shù)loss:該參數(shù)為模型試圖最小化的目標(biāo)函數(shù),它可為預(yù)定義的損失函數(shù)名,如categorical_crossentropy、mse,也可以為一個損失函數(shù)。
指標(biāo)列表metrics:對分類問題,我們一般將該列表設(shè)置為metrics=["accuracy"]。指標(biāo)可以是一個預(yù)定義指標(biāo)的名字,也可以是一個用戶定制的函數(shù).指標(biāo)函數(shù)應(yīng)該返回單個張量,或一個完成metric_name - > metric_value映射的字典。
比如對于多分類問題:
model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"])
訓(xùn)練模型一般使用fit函數(shù)。
model.fit(data, labels, epochs=10, batch_size=32)Keras實戰(zhàn)
本文主要是介紹Keras的基本用法,所以數(shù)據(jù)集采用經(jīng)典數(shù)據(jù)集,中間的數(shù)據(jù)清洗過程便可以省略一些。數(shù)據(jù)集用的是UCI數(shù)據(jù)集中的 皮馬人糖尿病數(shù)據(jù)集(pima-indians-diabetes),在UCI的機器學(xué)習(xí)網(wǎng)站(http://mlearn.ics.uci.edu/dat...)可以免費下載。
數(shù)據(jù)集的內(nèi)容是皮馬人的醫(yī)療記錄,以及過去5年內(nèi)是否有糖尿病。所有的數(shù)據(jù)都是數(shù)字,問題是(是否有糖尿病是1或0),是二分類問題。數(shù)據(jù)的數(shù)量級不同,有8個屬性:
懷孕次數(shù)
2小時口服葡萄糖耐量試驗中的血漿葡萄糖濃度
舒張壓(毫米汞柱)
2小時血清胰島素(mu U/ml)
體重指數(shù)(BMI)
糖尿病血系功能
年齡(年)
類別:過去5年內(nèi)是否有糖尿病
所有的數(shù)據(jù)都是數(shù)字,可以直接導(dǎo)入Keras,數(shù)據(jù)前5行長下面這樣。。
6,148,72,35,0,33.6,0.627,50,1 1,85,66,29,0,26.6,0.351,31,0 8,183,64,0,0,23.3,0.672,32,1 1,89,66,23,94,28.1,0.167,21,0 0,137,40,35,168,43.1,2.288,33,1數(shù)據(jù)導(dǎo)入
因為數(shù)據(jù)全部為數(shù)字,這里我們用NumPy的loadtxt()函數(shù)可以直接導(dǎo)入數(shù)據(jù),其實用pandas的read_csv也可以,隨意啦。并將數(shù)據(jù)集分成特征和標(biāo)簽。
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") X = dataset[:,0:8] Y = dataset[:,8]
delimiter參數(shù)為指定數(shù)據(jù)的界定符模型定義
Keras的模型由層構(gòu)成:我們建立一個Sequential模型,一層層加入神經(jīng)元。第一步是確定輸入層的數(shù)目正確:在創(chuàng)建模型時用input_dim參數(shù)確定。
全連接層用Dense類定義:第一個參數(shù)是本層神經(jīng)元個數(shù),然后是初始化方式和激活函數(shù)。這里的初始化方法是0到0.05的連續(xù)型均勻分布(uniform),Keras的默認(rèn)方法也是這個。也可以用高斯分布進行初始化(normal)。
前兩層的激活函數(shù)是線性整流函數(shù)(relu),最后一層的激活函數(shù)是S型函數(shù)(sigmoid)。之前大家喜歡用S型和正切函數(shù),但現(xiàn)在線性整流函數(shù)效果更好。
為了保證輸出是0到1的概率數(shù)字,最后一層的激活函數(shù)是S型函數(shù),這樣映射到0.5的閾值函數(shù)也容易。前兩個隱層分別有12和8個神經(jīng)元,最后一層是1個神經(jīng)元(是否有糖尿病)。
隱層設(shè)置:不太好設(shè)置吧,我的理解是,一般來說,如果網(wǎng)絡(luò)夠大,即使存在問題也不會有影響。這個例子里我們用3層全連接網(wǎng)絡(luò)。
model = Sequential() model.add(Dense(12, input_dim=8, init="uniform", activation="relu")) model.add(Dense(8, init="uniform", activation="relu")) model.add(Dense(1, init="uniform", activation="sigmoid"))模型的編譯
Keras會調(diào)用Theano或者TensorFlow編譯模型。
我們需要定義損失函數(shù)和優(yōu)化算法,以及需要收集的數(shù)據(jù)。我們使用binary_crossentropy,錯誤的對數(shù)作為損失函數(shù);adam作為優(yōu)化算法。基于本問題是分類問題,so我們收集每輪的準(zhǔn)確率。
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])訓(xùn)練并測試模型
網(wǎng)絡(luò)按輪訓(xùn)練,通過nb_epoch參數(shù)控制。每次送入的數(shù)據(jù)可以用batch_size參數(shù)控制。這里我們只跑150輪,每次10個數(shù)據(jù)。
model.fit(X, Y, nb_epoch=150, batch_size=10)
我們把測試數(shù)據(jù)拿出來檢驗一下模型的效果(注意這樣不能測試在新數(shù)據(jù)的預(yù)測能力)我們應(yīng)該將數(shù)據(jù)分成訓(xùn)練和測試集。調(diào)用模型的evaluation()方法,傳入訓(xùn)練時的數(shù)據(jù)。輸出是平均值,包括平均誤差和其他的數(shù)據(jù),例如準(zhǔn)確度。
scores = model.evaluate(X, Y) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))結(jié)果輸出
... Epoch 143/150 768/768 [==============================] - 0s - loss: 0.4614 - acc: 0.7878 Epoch 144/150 768/768 [==============================] - 0s - loss: 0.4508 - acc: 0.7969 Epoch 145/150 768/768 [==============================] - 0s - loss: 0.4580 - acc: 0.7747 Epoch 146/150 768/768 [==============================] - 0s - loss: 0.4627 - acc: 0.7812 Epoch 147/150 768/768 [==============================] - 0s - loss: 0.4531 - acc: 0.7943 Epoch 148/150 768/768 [==============================] - 0s - loss: 0.4656 - acc: 0.7734 Epoch 149/150 768/768 [==============================] - 0s - loss: 0.4566 - acc: 0.7839 Epoch 150/150 768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7839 768/768 [==============================] - 0s acc: 79.56%
最后模型的準(zhǔn)確率為79.56%,還不是特別高。本文的目的只是為了將keras的特點展示出來。對于該數(shù)據(jù)集,我們還可以進行很多優(yōu)化,比如神經(jīng)網(wǎng)絡(luò)中的隱層的設(shè)計、引入交叉驗證調(diào)參、dropout等??纯湍?,后面會慢慢寫到的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41843.html
摘要:深度學(xué)習(xí)在過去的幾年里取得了許多驚人的成果,均與息息相關(guān)。機器學(xué)習(xí)進階筆記之一安裝與入門是基于進行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),被廣泛用于語音識別或圖像識別等多項機器深度學(xué)習(xí)領(lǐng)域。零基礎(chǔ)入門深度學(xué)習(xí)長短時記憶網(wǎng)絡(luò)。 多圖|入門必看:萬字長文帶你輕松了解LSTM全貌 作者 | Edwin Chen編譯 | AI100第一次接觸長短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)時,我驚呆了。原來,LSTM是神...
小編寫這篇文章的主要目的,就是給大家來介紹關(guān)于pycharm故障報錯的一些相關(guān)問題,涉及到的故障問題有keras導(dǎo)入報錯無法自動補全,另外,還有cannot find reference無法補全,遇到這種問題怎么處理呢?下面就給大家詳細(xì)解答下?! ∫浴 ∧壳盁o論是中文還是國外網(wǎng)站對于如何正確的導(dǎo)入keras,如何從tensorflow中導(dǎo)入keras,如何在pycharm中從tensorfl...
閱讀 3076·2023-04-25 20:43
閱讀 1719·2021-09-30 09:54
閱讀 1590·2021-09-24 09:47
閱讀 2874·2021-09-06 15:02
閱讀 3510·2021-02-22 17:09
閱讀 1233·2019-08-30 15:53
閱讀 1441·2019-08-29 17:04
閱讀 1956·2019-08-28 18:22