小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 幽游it 2020-03-17

資料

代碼 

.net  python雙實現(xiàn)

書(對應(yīng)上述代碼python)

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

熱門人工智能分類

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

強化學(xué)習(xí) openAi

資料優(yōu)點:

主流、系統(tǒng)化、入門容易、環(huá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

啟動后選擇打開目錄
初次打開python文件時,右下角提示安裝python擴展,點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文件問題類型入?yún)?/td>出參激活函數(shù)1
激活函數(shù)2隱藏層數(shù)損失函數(shù)優(yōu)化器代碼
2-1 
手寫數(shù)字識別
mnist

28 * 28 圖像單標(biāo)簽多分類relu整流線性單元
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 
評論
imdb
-二分類詞序列二分類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
-多分類詞序列單標(biāo)簽多分類
relu
softmax
2categorical_crossentropy分類交叉熵
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ù)值價格relu
2mse平均絕對誤差
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貓狗分類









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






5-4
貓狗分類
貓 可視化








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(長短期記憶) GRU(門控循環(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ù)測 









6-4
imdb  
 Conv1D 比RNN速度更快








7-1

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







8-1

字符級的 LSTM 文本生成







8-2

DeepDream 圖像生成







8-3Ch_08_Neural_Style_Transfer

風(fēng)格遷移







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







8-5

生成式對抗網(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)化、對數(shù)函數(shù)轉(zhuǎn)換,反余切函數(shù)轉(zhuǎn)換


功能點

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

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

預(yù)測應(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)在你可以開始微調(diào)網(wǎng)絡(luò)。我們將使用學(xué)習(xí)率非常小的 RMSProp 優(yōu)化器來實現(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ò)過擬合的常用方法包括:

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


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

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

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

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

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

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

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

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

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

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


不適合場景:

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

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



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

會員1:{累計購買金額:2000,
                累計購買次數(shù):5,
                注冊日期:18-01-01
                姓別:男,
                客戶價值: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   銷量預(yù)測


日期
時間(某小時)面包銷量




1-19100




1-110200




















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

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

乘機人1 :[    ]
下單日期乘機日期








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










乘機日期是否乘機
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不斷下降,說明網(wǎng)絡(luò)仍在學(xué)習(xí);

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

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

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

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

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




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

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

可視化

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







5-4自動下載的模型

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

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

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


RNN

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

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

我們將會介紹以下三種技巧。

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

6-3#解決證書報錯 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手動下載溫度數(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 讀取文件失敗問題

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

雙向 RNN 

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


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)
這個模型的表現(xiàn)與普通 GRU 層差不多一樣好。其原因很容易理解:所有的預(yù)測能力肯定都來自于正序的那一半網(wǎng)絡(luò),因為我們已經(jīng)知道,逆序的那一半在這個任務(wù)上的表現(xiàn)非常糟糕(本例同樣是因為,最近的數(shù)據(jù)比久遠的數(shù)據(jù)更加重要)。



6本章總結(jié)

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



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

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

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



輸入某個匿名人士的一系列社交媒體發(fā)帖,然后嘗試預(yù)測那個人的屬性,比如年齡、性別和收入水平(見圖 7-7)。代碼清單7-3 用函數(shù)式 API 實現(xiàn)一個三輸出模型
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) ←------ 注意,輸出層都具有名稱
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ò)的各個頭指定不同的損失函數(shù),例如,年齡預(yù)測是標(biāo)量回歸任務(wù),而性別預(yù)測是二分類任務(wù),二者需要不同的訓(xùn)練過程。但是,梯度下降要求將一個標(biāo)量最小化,所以為了能夠訓(xùn)練模型,我們必須將這些損失合并為單個標(biāo)量。合并不同損失最簡單的方法就是對所有損失求和。在 Keras 中,你可以在編譯時使用損失組成的列表或字典來為不同輸出指定不同損失,然后將得到的損失值相加得到一個全局損失,并在訓(xùn)練過程中將這個損失最小化。代碼清單7-4 多輸出模型的編譯選項:多重?fù)p失
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary_crossentropy'])
model.compile(optimizer='rmsprop', (以下4行)與上述寫法等效(只有輸出層具有名稱時才能采用這種寫法)
        loss={'age': 'mse',
           'income': 'categorical_crossentropy',
           'gender': 'binary_crossentropy'})
注意,嚴(yán)重不平衡的損失貢獻會導(dǎo)致模型表示針對單個損失值最大的任務(wù)優(yōu)先進行優(yōu)化,而不考慮其他任務(wù)的優(yōu)化。為了解決這個問題,我們可以為每個損失值對最終損失的貢獻分配不同大小的重要性。如果不同的損失值具有不同的取值范圍,那么這一方法尤其有用。比如,用于年齡回歸任務(wù)的均方誤差(MSE)損失值通常在 3~5 左右,而用于性別分類任務(wù)的交叉熵?fù)p失值可能低至 0.1。在這種情況下,為了平衡不同損失的貢獻,我們可以讓交叉熵?fù)p失的權(quán)重取 10,而 MSE 損失的權(quán)重取 0.5。代碼清單7-5 多輸出模型的編譯選項:損失加權(quán)
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary
_crossentropy'],
        loss_weights=[0.25, 1., 10.])
model.compile(optimizer='rmsprop', (以下7行)與上述寫法等效(只有輸出層具有名稱時才能采用這種寫法)
        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行)與上述寫法等效(只有輸出層具有名稱時才能采用這種寫法)
          'income': income_targets,
          'gender': gender_targets},
     epochs=10, batch_size=64)



殘差連接

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


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


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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多