keras搭建密集連接網絡/卷積網絡/循環網絡


輸入模式與網絡架構間的對應關系:

  • 向量數據:密集連接網絡(Dense層)
  • 圖像數據:二維卷積神經網絡
  • 聲音數據(比如波形):一維卷積神經網絡(首選)或循環神經網絡
  • 文本數據:一維卷積神經網絡(首選)或循環神經網絡
  • 時間序列數據:循環神經網絡(首選)或一維卷積神經網絡
  • 其他類型的序列數據:循環神經網絡或一維卷積神經網絡。如果數據順序非常重要(比如時間序列,但文本不是),那么首選循環神經網絡
  • 視頻數據:三維卷積神經網絡(如果需要捕捉運動效果),或者幀級的二維神經網絡(用於特征提取)+循環神經網絡或一維卷積神經網絡(用於處理得到的序列)
  • 立體數據:三維卷積神經網絡

三種網絡架構:

  • 1.密集連接網絡

  • 2.卷積網絡

  • 3.循環網絡

1.密集連接網絡

密集連接網絡是Dense層的堆疊,用於處理向量數據(向量批量)。這種網絡假設輸入特征中沒有特定結構:之所以叫作密集連接,是因為Dense層的每個單元都和其他所有單元相連接;

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))

model.compile(optimizer='rmsprop',loss='binary_crossentropy')

  

對於二分類問題,層堆疊的最后一層使用sigmoid激活且

只有一個單元的Dense層,並使用binary_crossentropy

作為損失,目標應該是0或1.

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(num_classes,activation='softmax'))

model.compile(optimizer='rmsprop',loss='categorical_crossentropy')

對於單標簽多分類問題,每個樣本只有一個類別(不會超過一個),

層堆疊的最后一層是一個Dense層,它使用softmax激活,其

單元個數等於類別個數。如果目標是one-hot編碼的,那么使用

categorical_crossentropy作為損失;如果目標是整數,那么

使用sparse_categorical_crossentropy作為損失

 

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(num_classes,activation='sigmoid'))

model.compile(optimizer='rmsprop',loss='binary_crossentropy')

對於多標簽多分類問題,每個樣本可以有多個類別,層堆疊的最后一層

是一個Dense層,它使用sigmoid激活其單元個數等於類別個數,並使用

binary_crossentropy作為損失,目標應該是k-hot編碼的

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(num_classes)

model.compile(optimizer='rmsprop',loss='mse')

  

對於連續值向量的回歸問題,層堆疊的最后一層是一個不帶激活Dense層,

其單元個數等於你要預測的值的個數(通常只有一個值,比如房價)。

有幾種損失可用於回歸問題,最常見的是

mena_squared_error(均方誤差,MSE)

mean_absolute_error(平均絕對誤差,MAE)

2.卷積神經網絡

卷積層能夠查看空間局部模式,其方法是對輸入張量的不同空間位置(圖塊)應用相同的幾何變換。這樣得到的表示具有平移不變性,這使得卷積層能夠高效利用數據,並且能夠高度模塊化。

卷積神經網絡或卷積網絡是卷積層和最大池化層的堆疊。池化層可以對數據進行空間下采樣, 這么做有兩個目的隨着特征數量的增大,我們需要讓特征圖的尺寸保持在合理范圍內;讓后面的卷積層能夠“看到”輸入中更大的空間范圍。卷積神經網絡的最后通常是一個 Flatten 運算 或全局池化層,將空間特征圖轉換為向量,然后再是 Dense 層,用於實現分類或回歸。 注意,大部分(或者全部)普通卷積很可能不久后會被深度可分離卷積(depthwise separable convolution,SeparableConv2D 層)所替代,后者與前者等效,但速度更快、表示效率更高。 對於三維、二維和一維的輸入來說都是如此。如果你從頭開始構建一個新網絡,那么一定要使用深度可分離卷積。SeparableConv2D 層可直接替代 Conv2D 層,得到一個更小、更快的網絡, 在任務上的表現也更好。

model = models.Sequential() 
model.add(layers.SeparableConv2D(32, 3, activation='relu', input_shape=(height, width, channels)))                                 
model.add(layers.SeparableConv2D(64, 3, activation='relu')) 
model.add(layers.MaxPooling2D(2)) model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.MaxPooling2D(2)) model.add(layers.SeparableConv2D(64, 3, activation='relu'))
model.add(layers.SeparableConv2D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling2D()) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(num_classes, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
圖像多分類

 

3.循環神經網絡

循環神經網絡(RNN)的工作原理是,對輸入序列每次處理一個時間步,並且自始至終保存一個狀態(state,這個狀態通常是一個向量或一組向量,即狀態幾何空間中的點)。

如果序列中的模式不具有時間平移不變性,那么應該優先使用循環神經網絡,而不是一維卷積神經網絡。keras中有三種RNN層:SimpleRNN/GRU/LSTM。對於大多數實際用途,你應該使用GRU或LSTM。兩者中LSTM更強大,計算代價也更高。可以將GRU看作是一種更簡單、計算代價更小的替代方法。想要將多個RNN層逐個堆疊在一起,最后一層之前的每一層都應該返回輸出的完整序列(每個輸入時間步都對應一個輸出時間步)。

如果你不再堆疊更多的RNN層,那么通常只返回最后一個輸出,其中包含關於整個序列的二分類。

model = models.Sequential() 
model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features))) 
model.add(layers.Dense(num_classes, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy')
一個單層 RNN 層,用於向量序列的二分類
model = models.Sequential() 
model.add(layers.LSTM(32, return_sequences=True, input_shape=(num_timesteps, num_features))) 
model.add(layers.LSTM(32, return_sequences=True)) 
model.add(layers.LSTM(32)) 
model.add(layers.Dense(num_classes, activation='sigmoid')) 
 
model.compile(optimizer='rmsprop', loss='binary_crossentropy')

RNN 層的堆疊,用於向量序列的二分類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM