輸入模式與網絡架構間的對應關系:
- 向量數據:密集連接網絡(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')) |
圖像多分類 |
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))) |
一個單層 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 層的堆疊,用於向量序列的二分類。 |