日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

深度學(xué)習(xí) .net keras python雙實(shí)現(xiàn)

 幽游it 2020-03-17

資料

代碼 

.net  python雙實(shí)現(xiàn)

書(shū)(對(duì)應(yīng)上述代碼python)

京東讀書(shū)  《Python深度學(xué)習(xí)》

熱門(mén)人工智能分類(lèi)

深度學(xué)習(xí) keras(支持  tensorFlow、   cntk、torch)   比賽主流
CNN卷積  RNN循環(huán)  

強(qiáng)化學(xué)習(xí) openAi

資料優(yōu)點(diǎn):

主流、系統(tǒng)化、入門(mén)容易、環(huán)境簡(jiǎn)單、附帶訓(xùn)練集。

keras環(huán)境準(zhǔn)備 windows

安裝 conda

windows推薦地址:https://mirrors.tuna./anaconda/miniconda/Miniconda3-4.7.10-Windows-x86_64.exe
ubuntu推薦地址:https://mirrors.tuna./anaconda/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh
conda create -n deepLearn python=3.6
conda activate deepLearn

安裝visual studio code  ,非必須,也可以用其它的   spyder3

啟動(dòng)后選擇打開(kāi)目錄
初次打開(kāi)python文件時(shí),右下角提示安裝python擴(kuò)展,點(diǎn)install
左下角切換python的不同版本(環(huán)境)

章節(jié)


# STEP 2: Create the Network
network = keras.models.Sequential()
network.add(keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(keras.layers.Dense(10, activation='softmax'))

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# Step 3: Train
network.fit(train_images, train_labels, epochs=5, batch_size=128)
# Step 4 :Evaluate the Network
test_loss, test_acc = network.evaluate(test_images, test_labels)
# Step 5 :predict
predict1=model.predict(x_val)


python文件.net文件問(wèn)題類(lèi)型入?yún)?/td>出參激活函數(shù)1
激活函數(shù)2隱藏層數(shù)損失函數(shù)優(yōu)化器代碼
2-1 
手寫(xiě)數(shù)字識(shí)別
mnist

28 * 28 圖像單標(biāo)簽多分類(lèi)relu整流線(xiàn)性單元
prelu、
elu
softmax
1categorical_crossentropy
rmsprop
network.add(keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(keras.layers.Dense(10, activation='softmax'))
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
3-5 
評(píng)論
imdb
-二分類(lèi)詞序列二分類(lèi)relu
sigmoid [0,1]
2binary_crossentropy二元交叉熵

rmsprop
model.add(keras.layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
3-6  
新聞
reuters
-多分類(lèi)詞序列單標(biāo)簽多分類(lèi)
relu
softmax
2categorical_crossentropy分類(lèi)交叉熵
rmsprop
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
3-7 

boston_housing
-標(biāo)量回歸多維數(shù)值價(jià)格relu
無(wú)2mse平均絕對(duì)誤差
rmsprop
 model.add(keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)))
    model.add(keras.layers.Dense(64, activation='relu'))
    model.add(keras.layers.Dense(1))
    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
4-4   
imdb 
優(yōu)化 Dropout l1_l2







5-1 Ch_05_Introduction_to_Convnetsmnist
CNN







5-2Ch_05_Using_Convnets_With_Small_Datasets貓狗分類(lèi)









5-3
貓狗分類(lèi)
VGG16 預(yù)訓(xùn)練網(wǎng)絡(luò) 特征提取97%準(zhǔn)確率






5-4
貓狗分類(lèi)
貓 可視化








Ch_05_Visualizing_Convnet_Filters









5-4Ch_05_Class_Activation_Heatmaps
熱力圖







6-1_a

詞向量







6-1_b

imdb 
GloVe  








6-2Ch_06_Understanding_Recurrent_Neural_Networks
imdb  
RNN LSTM(長(zhǎng)短期記憶) GRU(門(mén)控循環(huán)單元) 








model = Sequential()
>>> model.add(Embedding(10000, 32))
>>> model.add(SimpleRNN(32, return_sequences=True))
model.add(SimpleRNN(32, return_sequences=True))
>>> model.summary()
6-3Ch_06_Advanced_Usage_Of_Recurrent_Neural_Networks
溫度預(yù)測(cè) 









6-4
imdb  
 Conv1D 比RNN速度更快








7-1

函數(shù)式,多輸入輸出







8-1

字符級(jí)的 LSTM 文本生成







8-2

DeepDream 圖像生成







8-3Ch_08_Neural_Style_Transfer

風(fēng)格遷移







8-4Ch_08_Generating_Images_With_VAEs
變分自編碼器(VAE)







8-5

生成式對(duì)抗網(wǎng)絡(luò)(GAN)









枚舉值預(yù)處理

keras.utils.to_categorical(train_labels)

 > labels
    array([0, 2, 1, 2, 0])
    > to_categorical(labels)
    array([[ 1., 0., 0.],
           [ 0., 0., 1.],
           [ 0., 1., 0.],
           [ 0., 0., 1.],
           [ 1., 0., 0.]], dtype=float32)

數(shù)值預(yù)處理

x_train=np.array([[1],[2],[3],[4.3],[2.5],[4]])
mean = x_train.mean(axis=0)
x_train -= mean
std = x_train.std(axis=0)
x_train /= std

print(x_train)
>>>[[-1.58892269]
 [-0.70618786]
 [ 0.17654697]
 [ 1.32410224]
 [-0.26482045]
 [ 1.0592818 ]]

Z-score標(biāo)準(zhǔn)化、最大-最小標(biāo)準(zhǔn)化、對(duì)數(shù)函數(shù)轉(zhuǎn)換,反余切函數(shù)轉(zhuǎn)換


功能點(diǎn)

訓(xùn)練模型保存及再載入

model.save('model_weight_3-5.h5')
model = keras.models.load_model('model_weight_3-5.h5')  

預(yù)測(cè)應(yīng)用

predict1=model.predict(x_val)
print(predict1)

.net 讀取圖片

   var imagePath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), imageName);
   var pathToVGG16model = VGG16.download_model_if_needed();
   var image = new float[224 * 224 * 3];
   CPPUtil.load_image(imagePath, image);

.net 保存與加載

 var network= CNTK.Function.Load(fullpath, computeDevice);
 network.Save(modelPath);

查看網(wǎng)絡(luò)結(jié)構(gòu)

model.summary()

模型復(fù)用

conv_base = keras.applications.VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
    conv_base.summary()

凍結(jié)某層

 conv_base.trainable = False



微調(diào)模型

現(xiàn)在你可以開(kāi)始微調(diào)網(wǎng)絡(luò)。我們將使用學(xué)習(xí)率非常小的 RMSProp 優(yōu)化器來(lái)實(shí)現(xiàn)。
(1) 在已經(jīng)訓(xùn)練好的基網(wǎng)絡(luò)(base network)上添加自定義網(wǎng)絡(luò)。
(2) 凍結(jié)基網(wǎng)絡(luò)。
(3) 訓(xùn)練所添加的部分。
(4) 解凍基網(wǎng)絡(luò)的一些層。
(5) 聯(lián)合訓(xùn)練解凍的這些層和添加的部分。
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
   if layer.name == 'block5_conv1':
     layer.trainable = True


總結(jié)一下,防止神經(jīng)網(wǎng)絡(luò)過(guò)擬合的常用方法包括:

獲取更多的訓(xùn)練數(shù)據(jù)
減小網(wǎng)絡(luò)容量
添加權(quán)重正則化
添加 dropout


深度學(xué)習(xí)適用場(chǎng)景

第1級(jí)無(wú)序列表">將向量數(shù)據(jù)映射到向量數(shù)據(jù)
預(yù)測(cè)性醫(yī)療保?。簩⒒颊哚t(yī)療記錄映射到患者治療效果的預(yù)測(cè)。
行為定向:將一組網(wǎng)站屬性映射到用戶(hù)在網(wǎng)站上所花費(fèi)的時(shí)間數(shù)據(jù)。
產(chǎn)品質(zhì)量控制:將與某件產(chǎn)品制成品相關(guān)的一組屬性映射到產(chǎn)品明年會(huì)壞掉的概率。

第1級(jí)無(wú)序列表">將圖像數(shù)據(jù)映射到向量數(shù)據(jù)
醫(yī)生助手:將醫(yī)學(xué)影像幻燈片映射到是否存在腫瘤的預(yù)測(cè)。
自動(dòng)駕駛車(chē)輛:將車(chē)載攝像機(jī)的視頻畫(huà)面映射到方向盤(pán)的角度控制命令。
棋盤(pán)游戲人工智能:將圍棋和象棋棋盤(pán)映射到下一步走棋。
飲食助手:將食物照片映射到食物的卡路里數(shù)量。
年齡預(yù)測(cè):將自拍照片映射到人的年齡。

第1級(jí)無(wú)序列表">將時(shí)間序列數(shù)據(jù)映射為向量數(shù)據(jù)
天氣預(yù)報(bào):將多個(gè)地點(diǎn)天氣數(shù)據(jù)的時(shí)間序列映射到某地下周的天氣數(shù)據(jù)。
腦機(jī)接口:將腦磁圖(MEG)數(shù)據(jù)的時(shí)間序列映射到計(jì)算機(jī)命令。
行為定向:將網(wǎng)站上用戶(hù)交互的時(shí)間序列映射到用戶(hù)購(gòu)買(mǎi)某件商品的概率。

第1級(jí)無(wú)序列表">將文本映射到文本
智能回復(fù):將電子郵件映射到合理的單行回復(fù)。
回答問(wèn)題:將常識(shí)問(wèn)題映射到答案。
生成摘要:將一篇長(zhǎng)文章映射到文章的簡(jiǎn)短摘要。

第1級(jí)無(wú)序列表">將圖像映射到文本
圖像描述:將圖像映射到描述圖像內(nèi)容的簡(jiǎn)短說(shuō)明。

第1級(jí)無(wú)序列表">將文本映射到圖像
條件圖像生成:將簡(jiǎn)短的文字描述映射到與這段描述相匹配的圖像。
標(biāo)識(shí)生成 / 選擇:將公司的名稱(chēng)和描述映射到公司標(biāo)識(shí)。

第1級(jí)無(wú)序列表">將圖像映射到圖像
超分辨率:將縮小的圖像映射到相同圖像的更高分辨率版本。
視覺(jué)深度感知:將室內(nèi)環(huán)境的圖像映射到深度預(yù)測(cè)圖。

第1級(jí)無(wú)序列表">將圖像和文本映射到文本
視覺(jué)問(wèn)答:將圖像和關(guān)于圖像內(nèi)容的自然語(yǔ)言問(wèn)題映射到自然語(yǔ)言答案。

第1級(jí)無(wú)序列表">將視頻和文本映射到文本
視頻問(wèn)答:將短視頻和關(guān)于視頻內(nèi)容的自然語(yǔ)言問(wèn)題映射到自然語(yǔ)言答案。


不適合場(chǎng)景:

深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)方支。普通深度學(xué)習(xí) 只是存儲(chǔ)了權(quán)重,缺少歷史記憶。
這個(gè)變換由層的權(quán)重來(lái)參數(shù)化,權(quán)重根據(jù)模型當(dāng)前表現(xiàn)進(jìn)行迭代更新。這種幾何變換有一個(gè)關(guān)鍵性質(zhì),就是它必須是可微的(differentiable),這樣我們才能通過(guò)梯度下降來(lái)學(xué)習(xí)其參數(shù)。

一般來(lái)說(shuō),任何需要推理(比如編程或科學(xué)方法的應(yīng)用)、長(zhǎng)期規(guī)劃和算法數(shù)據(jù)處理的東西,無(wú)論投入多少數(shù)據(jù),深度學(xué)習(xí)模型都無(wú)法實(shí)現(xiàn)。即使是排序算法,用深度神經(jīng)網(wǎng)絡(luò)來(lái)學(xué)習(xí)也是非常困難的。



數(shù)據(jù)轉(zhuǎn)換1

會(huì)員1:{累計(jì)購(gòu)買(mǎi)金額:2000,
                累計(jì)購(gòu)買(mǎi)次數(shù):5,
                注冊(cè)日期:18-01-01
                姓別:男,
                客戶(hù)價(jià)值:100
             }



轉(zhuǎn)換為深度學(xué)習(xí)的訓(xùn)練數(shù)據(jù):
x=  [金額均方差,次數(shù)均差,日期=1009,姓別=[1,0]  ]            y=[100]
x=  [金額均方差,次數(shù)均差,日期=1009,姓別=1,0       ]         y=[100]

數(shù)據(jù)轉(zhuǎn)換2   銷(xiāo)量預(yù)測(cè)


日期
時(shí)間(某小時(shí))面包銷(xiāo)量




1-19100




1-110200




















日期時(shí)間(某小時(shí))節(jié)假日類(lèi)型周幾農(nóng)歷第幾天公歷第幾天距離節(jié)假日天數(shù)天氣
10011枚舉枚舉
枚舉
數(shù)字或枚舉數(shù)字或枚舉
數(shù)字或枚舉
枚舉

數(shù)據(jù)轉(zhuǎn)換3   下次乘機(jī)日期是否可以預(yù)測(cè)

乘機(jī)人1 :[    ]
下單日期乘機(jī)日期








2018-1-12018-2-1








2018-1-22018-2-10








2018-4-152018-6-1








2018-8-22018-8-4








2019-1-12019-2-1








2019-1-22019-2-10










乘機(jī)日期是否乘機(jī)
2018-2-11
2018-2-2
0
.。。。0
2018-2-101
。。。0
2018-6-11
。。。0
2018-8-41
2-11
2-101



一,train loss與test loss結(jié)果分析

 

train loss 不斷下降,test loss不斷下降,說(shuō)明網(wǎng)絡(luò)仍在學(xué)習(xí);

train loss 不斷下降,test loss趨于不變,說(shuō)明網(wǎng)絡(luò)過(guò)擬合;

train loss 趨于不變,test loss不斷下降,說(shuō)明數(shù)據(jù)集100%有問(wèn)題;

train loss 趨于不變,test loss趨于不變,說(shuō)明學(xué)習(xí)遇到瓶頸,需要減小學(xué)習(xí)率或批量數(shù)目;

train loss 不斷上升,test loss不斷上升,說(shuō)明網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)不當(dāng),訓(xùn)練超參數(shù)設(shè)置不當(dāng),數(shù)據(jù)集經(jīng)過(guò)清洗等問(wèn)題。

損失是對(duì)糟糕預(yù)測(cè)的懲罰。也就是說(shuō),損失是一個(gè)數(shù)值,表示對(duì)于單個(gè)樣本而言模型預(yù)測(cè)的準(zhǔn)確程度。如果模型的預(yù)測(cè)完全準(zhǔn)確,則損失為零,否則損失會(huì)較大。訓(xùn)練模型的目標(biāo)是從所有樣本中找到一組平均損失“較小”的權(quán)重和偏差。例如,下圖左側(cè)顯示的是損失較大的模型,右側(cè)顯示的是損失較小的模型。關(guān)于此圖,請(qǐng)注意以下幾點(diǎn):
 
紅色箭頭表示損失。
藍(lán)線(xiàn)表示預(yù)測(cè)。
 
 




kaggle比賽貓狗數(shù)據(jù)集

https://www./c/dogs-vs-cats/data 
百度網(wǎng)盤(pán)分享
鏈接:https://pan.baidu.com/s/13hw4LK8ihR6-6-8mpjLKDA 密碼:dmp4

可視化

可視化卷積神經(jīng)網(wǎng)絡(luò)的中間輸出(中間激活):有助于理解卷積神經(jīng)網(wǎng)絡(luò)連續(xù)的層如何對(duì)輸入進(jìn)行變換,也有助于初步了解卷積神經(jīng)網(wǎng)絡(luò)每個(gè)過(guò)濾器的含義。
可視化卷積神經(jīng)網(wǎng)絡(luò)的過(guò)濾器:有助于精確理解卷積神經(jīng)網(wǎng)絡(luò)中每個(gè)過(guò)濾器容易接受的視覺(jué)模式或視覺(jué)概念。
可視化圖像中類(lèi)激活的熱力圖:有助于理解圖像的哪個(gè)部分被識(shí)別為屬于某個(gè)類(lèi)別,從而可以定位圖像中的物體。







5-4自動(dòng)下載的模型

https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5
https://storage./download.tensorflow.org/data/imagenet_class_index.json


詞嵌入方案

之一 word2vec 算法發(fā)布之后,這一思路才開(kāi)始在研究領(lǐng)域和工業(yè)應(yīng)用中取得成功。word2vec 算法由 Google 的 Tomas Mikolov 于 2013 年開(kāi)發(fā),其維度抓住了特定的語(yǔ)義屬性,比如性別。
有許多預(yù)計(jì)算的詞嵌入數(shù)據(jù)庫(kù),你都可以下載并在 Keras 的 Embedding 層中使用。word2vec 就是其中之一。另一個(gè)常用的是 GloVe(global vectors for word representation,詞表示全局向量),由斯坦福大學(xué)的研究人員于 2014 年開(kāi)發(fā)。這種嵌入方法基于對(duì)詞共現(xiàn)統(tǒng)計(jì)矩陣進(jìn)行因式分解。其開(kāi)發(fā)者已經(jīng)公開(kāi)了數(shù)百萬(wàn)個(gè)英文標(biāo)記的預(yù)計(jì)算嵌入,它們都是從維基百科數(shù)據(jù)和 Common Crawl 數(shù)據(jù)得到的。

下載 IMDB 數(shù)據(jù)的原始文本
首先,打開(kāi) http:///0tIo,下載原始 IMDB 數(shù)據(jù)集并解壓。

下載 GloVe 詞嵌入
打開(kāi) https://nlp./projects/glove,下載 2014 年英文維基百科的預(yù)計(jì)算嵌入。這是一個(gè) 822 MB 的壓縮文件,文件名是 glove.6B.zip,里面包含 400 000 個(gè)單詞(或非單詞的標(biāo)記)的 100 維嵌入向量。解壓文件。


RNN

SimpleRNN 并不是 Keras 中唯一可用的循環(huán)層,還有另外兩個(gè):LSTM 和 GRU。在實(shí)踐中總會(huì)用到其中之一,因?yàn)?SimpleRNN 通常過(guò)于簡(jiǎn)化,沒(méi)有實(shí)用價(jià)值。SimpleRNN 的最大問(wèn)題是,在時(shí)刻 t,理論上來(lái)說(shuō),它應(yīng)該能夠記住許多時(shí)間步之前見(jiàn)過(guò)的信息,但實(shí)際上它是不可能學(xué)到這種長(zhǎng)期依賴(lài)的。其原因在于梯度消失問(wèn)題(vanishing gradient problem),這一效應(yīng)類(lèi)似于在層數(shù)較多的非循環(huán)網(wǎng)絡(luò)(即前饋網(wǎng)絡(luò))中觀察到的效應(yīng):隨著層數(shù)的增加,網(wǎng)絡(luò)最終變得無(wú)法訓(xùn)練。

長(zhǎng)短期記憶(LSTM,long short-term memory)算法由 Hochreiter 和 Schmidhuber 在 1997 年開(kāi)發(fā) ,是二人研究梯度消失問(wèn)題的重要成果。

我們將會(huì)介紹以下三種技巧。

循環(huán) dropout(recurrent dropout)。這是一種特殊的內(nèi)置方法,在循環(huán)層中使用 dropout 來(lái)降低過(guò)擬合。
堆疊循環(huán)層(stacking recurrent layers)。這會(huì)提高網(wǎng)絡(luò)的表示能力(代價(jià)是更高的計(jì)算負(fù)荷)。
雙向循環(huán)層(bidirectional recurrent layer)。將相同的信息以不同的方式呈現(xiàn)給循環(huán)網(wǎng)絡(luò),可以提高精度并緩解遺忘問(wèn)題。

6-3#解決證書(shū)報(bào)錯(cuò) urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

6-3手動(dòng)下載溫度數(shù)據(jù)



數(shù)據(jù)標(biāo)準(zhǔn)化

mean = float_data[:200000].mean(axis=0)
float_data -= mean
std = float_data[:200000].std(axis=0)
float_data /= std

6-3 讀取文件失敗問(wèn)題

# 原始代碼
# with open(file='./text.txt', mode='r') as fp:

# 修改后代碼
with open(file='./text.txt', mode='r', encoding='utf-8') as fp:


增加網(wǎng)絡(luò)容量的通常做法是增加每層單元數(shù)或增加層數(shù)。循環(huán)層堆疊(recurrent layer stacking)是構(gòu)建更加強(qiáng)大的循環(huán)網(wǎng)絡(luò)的經(jīng)典方法,例如,目前谷歌翻譯算法就是 7 個(gè)大型 LSTM 層的堆疊——這個(gè)架構(gòu)很大。
值得注意的是,本節(jié)的 RNN 層都是按時(shí)間正序處理序列(更早的時(shí)間步在前),這可能是一個(gè)隨意的決定。至少,至今我們還沒(méi)有嘗試質(zhì)疑這個(gè)決定。如果 RNN 按時(shí)間逆序處理輸入序列(更晚的時(shí)間步在前),能否表現(xiàn)得足夠好呢?
這非常合理:GRU 層通常更善于記住最近的數(shù)據(jù),而不是久遠(yuǎn)的數(shù)據(jù),與更早的數(shù)據(jù)點(diǎn)相比,更靠后的天氣數(shù)據(jù)點(diǎn)對(duì)問(wèn)題自然具有更高的預(yù)測(cè)能力(這也是基于常識(shí)的基準(zhǔn)方法非常強(qiáng)大的原因)。因此,按時(shí)間正序的模型必然會(huì)優(yōu)于時(shí)間逆序的模型。重要的是,對(duì)許多其他問(wèn)題(包括自然語(yǔ)言)而言,情況并不是這樣:直覺(jué)上來(lái)看,一個(gè)單詞對(duì)理解句子的重要性通常并不取決于它在句子中的位置。我們嘗試對(duì) 6.2 節(jié) IMDB 示例中的 LSTM 應(yīng)用相同的技巧。代碼清單6-42 使用逆序序列訓(xùn)練并評(píng)估一個(gè) LSTM

雙向 RNN 

正是利用這個(gè)想法來(lái)提高正序 RNN 的性能。它從兩個(gè)方向查看數(shù)據(jù)(見(jiàn)圖 6-25),從而得到更加豐富的表示,并捕捉到僅使用正序 RNN 時(shí)可能忽略的一些模式。


model = Sequential()
model.add(layers.Bidirectional(
   layers.GRU(32), input_shape=(None, float_data.shape[-1])))
model.add(layers.Dense(1))
model.compile(optimizer=RMSprop(), loss='mae')
history = model.fit_generator(train_gen,
                steps_per_epoch=500,
                epochs=40,
                validation_data=val_gen,
                validation_steps=val_steps)
這個(gè)模型的表現(xiàn)與普通 GRU 層差不多一樣好。其原因很容易理解:所有的預(yù)測(cè)能力肯定都來(lái)自于正序的那一半網(wǎng)絡(luò),因?yàn)槲覀円呀?jīng)知道,逆序的那一半在這個(gè)任務(wù)上的表現(xiàn)非常糟糕(本例同樣是因?yàn)?,最近的?shù)據(jù)比久遠(yuǎn)的數(shù)據(jù)更加重要)。



6本章總結(jié)

第1級(jí)無(wú)序列表">你在本章學(xué)到了以下技術(shù),它們廣泛應(yīng)用于序列數(shù)據(jù)(從文本到時(shí)間序列)組成的數(shù)據(jù)集。
如何對(duì)文本分詞。
什么是詞嵌入,如何使用詞嵌入。
什么是循環(huán)網(wǎng)絡(luò),如何使用循環(huán)網(wǎng)絡(luò)。
如何堆疊 RNN 層和使用雙向 RNN,以構(gòu)建更加強(qiáng)大的序列處理模型。
如何使用一維卷積神經(jīng)網(wǎng)絡(luò)來(lái)處理序列。
如何結(jié)合一維卷積神經(jīng)網(wǎng)絡(luò)和 RNN 來(lái)處理長(zhǎng)序列。
你可以用 RNN 進(jìn)行時(shí)間序列回歸(“預(yù)測(cè)未來(lái)”)、時(shí)間序列分類(lèi)、時(shí)間序列異常檢測(cè)和序列標(biāo)記(比如找出句子中的人名或日期)。
同樣,你可以將一維卷積神經(jīng)網(wǎng)絡(luò)用于機(jī)器翻譯(序列到序列的卷積模型,比如 SliceNet)、文檔分類(lèi)和拼寫(xiě)校正。
如果序列數(shù)據(jù)的整體順序很重要,那么最好使用循環(huán)網(wǎng)絡(luò)來(lái)處理。時(shí)間序列通常都是這樣,最近的數(shù)據(jù)可能比久遠(yuǎn)的數(shù)據(jù)包含更多的信息量。
如果整體順序沒(méi)有意義,那么一維卷積神經(jīng)網(wǎng)絡(luò)可以實(shí)現(xiàn)同樣好的效果,而且計(jì)算代價(jià)更小。文本數(shù)據(jù)通常都是這樣,在句首發(fā)現(xiàn)關(guān)鍵詞和在句尾發(fā)現(xiàn)關(guān)鍵詞一樣都很有意義。



7本章包括以下內(nèi)容:

Keras 函數(shù)式 API
使用 Keras 回調(diào)函數(shù)
使用 TensorBoard 可視化工具
開(kāi)發(fā)最先進(jìn)模型的重要最佳實(shí)踐

7.1.1 函數(shù)式 API 簡(jiǎn)介
使用函數(shù)式 API,你可以直接操作張量,也可以把層當(dāng)作函數(shù)來(lái)使用,接收張量并返回張量(因此得名函數(shù)式 API)。
from keras import Input, layers
input_tensor = Input(shape=(32,)) ←------ 一個(gè)張量
dense = layers.Dense(32, activation='relu') ←------ 一個(gè)張量
一個(gè)層是一個(gè)函數(shù)
output_tensor = dense(input_tensor) ←------ 可以在一個(gè)張量上調(diào)用一個(gè)層,它會(huì)返回一個(gè)張量
我們首先來(lái)看一個(gè)最簡(jiǎn)單的示例,并列展示一個(gè)簡(jiǎn)單的 Sequential 模型以及對(duì)應(yīng)的函數(shù)式 API 實(shí)現(xiàn)。
from keras.models import Sequential, Model
from keras import layers
from keras import Input
seq_model = Sequential() ←------ 前面學(xué)過(guò)的Sequential模型
seq_model.add(layers.Dense(32, activation='relu', input_shape=(64,)))
seq_model.add(layers.Dense(32, activation='relu'))
seq_model.add(layers.Dense(10, activation='softmax'))
input_tensor = Input(shape=(64,)) (以下4行)對(duì)應(yīng)的函數(shù)式API實(shí)現(xiàn)
x = layers.Dense(32, activation='relu')(input_tensor)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = Model(input_tensor, output_tensor) ←------ Model類(lèi)將輸入張量和輸出張量轉(zhuǎn)換為一個(gè)模型
model.summary() ←------ 查看模型
調(diào)用 model.summary() 的輸出如下所示。



輸入某個(gè)匿名人士的一系列社交媒體發(fā)帖,然后嘗試預(yù)測(cè)那個(gè)人的屬性,比如年齡、性別和收入水平(見(jiàn)圖 7-7)。代碼清單7-3 用函數(shù)式 API 實(shí)現(xiàn)一個(gè)三輸出模型
from keras import layers
from keras import Input
from keras.models import Model
vocabulary_size = 50000
num_income_groups = 10
posts_input = Input(shape=(None,), dtype='int32', name='posts')
embedded_posts = layers.Embedding(256, vocabulary_size)(posts_input)
x = layers.Conv1D(128, 5, activation='relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.GlobalMaxPooling1D()(x)
x = layers.Dense(128, activation='relu')(x)
age_prediction = layers.Dense(1, name='age')(x) ←------ 注意,輸出層都具有名稱(chēng)
income_prediction = layers.Dense(num_income_groups,
                 activation='softmax',
                 name='income')(x)
gender_prediction = layers.Dense(1, activation='sigmoid', name='gender')(x)
model = Model(posts_input,
        [age_prediction, income_prediction, gender_prediction])
重要的是,訓(xùn)練這種模型需要能夠?qū)W(wǎng)絡(luò)的各個(gè)頭指定不同的損失函數(shù),例如,年齡預(yù)測(cè)是標(biāo)量回歸任務(wù),而性別預(yù)測(cè)是二分類(lèi)任務(wù),二者需要不同的訓(xùn)練過(guò)程。但是,梯度下降要求將一個(gè)標(biāo)量最小化,所以為了能夠訓(xùn)練模型,我們必須將這些損失合并為單個(gè)標(biāo)量。合并不同損失最簡(jiǎn)單的方法就是對(duì)所有損失求和。在 Keras 中,你可以在編譯時(shí)使用損失組成的列表或字典來(lái)為不同輸出指定不同損失,然后將得到的損失值相加得到一個(gè)全局損失,并在訓(xùn)練過(guò)程中將這個(gè)損失最小化。代碼清單7-4 多輸出模型的編譯選項(xiàng):多重?fù)p失
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary_crossentropy'])
model.compile(optimizer='rmsprop', (以下4行)與上述寫(xiě)法等效(只有輸出層具有名稱(chēng)時(shí)才能采用這種寫(xiě)法)
        loss={'age': 'mse',
           'income': 'categorical_crossentropy',
           'gender': 'binary_crossentropy'})
注意,嚴(yán)重不平衡的損失貢獻(xiàn)會(huì)導(dǎo)致模型表示針對(duì)單個(gè)損失值最大的任務(wù)優(yōu)先進(jìn)行優(yōu)化,而不考慮其他任務(wù)的優(yōu)化。為了解決這個(gè)問(wèn)題,我們可以為每個(gè)損失值對(duì)最終損失的貢獻(xiàn)分配不同大小的重要性。如果不同的損失值具有不同的取值范圍,那么這一方法尤其有用。比如,用于年齡回歸任務(wù)的均方誤差(MSE)損失值通常在 3~5 左右,而用于性別分類(lèi)任務(wù)的交叉熵?fù)p失值可能低至 0.1。在這種情況下,為了平衡不同損失的貢獻(xiàn),我們可以讓交叉熵?fù)p失的權(quán)重取 10,而 MSE 損失的權(quán)重取 0.5。代碼清單7-5 多輸出模型的編譯選項(xiàng):損失加權(quán)
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary
_crossentropy'],
        loss_weights=[0.25, 1., 10.])
model.compile(optimizer='rmsprop', (以下7行)與上述寫(xiě)法等效(只有輸出層具有名稱(chēng)時(shí)才能采用這種寫(xiě)法)
        loss={'age': 'mse',
           'income': 'categorical_crossentropy',
           'gender': 'binary_crossentropy'},
        loss_weights={'age': 0.25,
               'income': 1.,
               'gender': 10.})
與多輸入模型相同,多輸出模型的訓(xùn)練輸入數(shù)據(jù)可以是 Numpy 數(shù)組組成的列表或字典。代碼清單7-6 將數(shù)據(jù)輸入到多輸出模型中
model.fit(posts, [age_targets, income_targets, gender_targets], (以下2行)假設(shè)age_targets、income_targets和gender_targets都是Numpy數(shù)組
     epochs=10, batch_size=64)
model.fit(posts, {'age': age_targets, (以下4行)與上述寫(xiě)法等效(只有輸出層具有名稱(chēng)時(shí)才能采用這種寫(xiě)法)
          'income': income_targets,
          'gender': gender_targets},
     epochs=10, batch_size=64)



殘差連接

殘差連接(residual connection)是一種常見(jiàn)的類(lèi)圖網(wǎng)絡(luò)組件,在 2015 年之后的許多網(wǎng)絡(luò)架構(gòu)(包括 Xception)中都可以見(jiàn)到。2015 年末,來(lái)自微軟的何愷明等人在 ILSVRC ImageNet 挑戰(zhàn)賽中獲勝 ,其中引入了這一方法。殘差連接解決了困擾所有大規(guī)模深度學(xué)習(xí)模型的兩個(gè)共性問(wèn)題:梯度消失和表示瓶頸。通常來(lái)說(shuō),向任何多于 10 層的模型中添加殘差連接,都可能會(huì)有所幫助。
殘差連接是讓前面某層的輸出作為后面某層的輸入,從而在序列網(wǎng)絡(luò)中有效地創(chuàng)造了一條捷徑。前面層的輸出沒(méi)有與后面層的激活連接在一起,而是與后面層的激活相加(這里假設(shè)兩個(gè)激活的形狀相同)。


Inception 模塊
Inception 是一種流行的卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu)類(lèi)型,它由 Google 的 Christian Szegedy 及其同事在 2013—2014 年開(kāi)發(fā),其靈感來(lái)源于早期的 network-in-network 架構(gòu)。 它是模塊的堆疊,這些模塊本身看起來(lái)像是小型的獨(dú)立網(wǎng)絡(luò),被分為多個(gè)并行分支。Inception 模塊最基本的形式包含 3~4 個(gè)分支,首先是一個(gè) 1×1 的卷積,然后是一個(gè) 3×3 的卷積,最后將所得到的特征連接在一起。這種設(shè)置有助于網(wǎng)絡(luò)分別學(xué)習(xí)空間特征和逐通道的特征,這比聯(lián)合學(xué)習(xí)這兩種特征更加有效。Inception 模塊也可能具有更復(fù)雜的形式,通常會(huì)包含池化運(yùn)算、不同尺寸的空間卷積(比如在某些分支上使用 5×5 的卷積代替 3×3 的卷積)和不包含空間卷積的分支(只有一個(gè) 1×1 卷積)。圖 7-8 給出了這種模塊的一個(gè)示例,它來(lái)自于 Inception V3。


想要學(xué)習(xí)圖像表示的這種潛在空間,GAN 和 VAE 是兩種不同的策略,每種策略都有各自的特點(diǎn)。VAE 非常適合用于學(xué)習(xí)具有良好結(jié)構(gòu)的潛在空間,其中特定方向表示數(shù)據(jù)中有意義的變化軸(見(jiàn)圖 8-10)。GAN 生成的圖像可能非常逼真,但它的潛在空間可能沒(méi)有良好結(jié)構(gòu),也沒(méi)有足夠的連續(xù)性。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多