1. 程式人生 > >Keras讀書筆記----網路層(Core常用層)

Keras讀書筆記----網路層(Core常用層)

1. 所有層共有方法

  • layer.get_weights() :返回層的權重( numpy array)
  • layer.set_weights(weights) :從numpy array中將權重載入到該層中,要求numpy array的形狀與get_weights的形狀相同
  • layer.get_config() :返回當前層配置資訊的字典,層也可以藉由配置資訊重構
from keras.utils.layer_utils import layer_from_config
config = layer.get_config()
layer = layer_from_config(config)
如果層僅有一個計算節點(即該層不是共享層),則可以通過下列方法獲得輸入張量、輸出張量、輸入資料的形狀和輸出資料的形狀:
  • layer.input
  • layer.output
  • layer.input_shape
  • layer.output_shape
如果該層有多個計算節點(參考層計算節點和共享層)。可以使用下面的方法
  • layer.get_input_at(node_index)
  • layer.get_output_at(node_index)
  • layer.get_input_shape_at(node_index)
  • layer.get_output_shape_at(node_index)

2. 常用層

常用層對應於core模組, core內部定義了一系列常用的網路層,包括全連線、啟用層等

2.1. Dense層

keras.layers.core.Dense(output_dim, init='glorot_uniform', activation='linear', weights=None, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True, input_dim=None)
  • output_dim:大於0的整數,代表該層的輸出維度。模型中非首層的全連線層其輸入維度可以自動推斷,因此非首層的全連線定義時不需要指定輸入維度。
  • init:初始化方法,為預定義初始化方法名的字串,或用於初始化權重的Theano函式。該引數僅在不傳遞 weights 引數時才有意義。
  • activation:啟用函式,為預定義的啟用函式名,或逐元素( element-wise)的Theano函式。如果不指定該引數,將不會使用任何啟用函式(即使用線性啟用函式: a(x)=x)
  • weights:權值,為numpy array的list。該list應含有一個形如( input_dim,output_dim)的權重矩陣和一個形如(output_dim,)的偏置向量。
  • W_regularizer:施加在權重上的正則項,為WeightRegularizer物件
  • b_regularizer:施加在偏置向量上的正則項,為WeightRegularizer物件
  • activity_regularizer:施加在輸出上的正則項,為ActivityRegularizer物件
  • W_constraints:施加在權重上的約束項,為Constraints物件
  • b_constraints:施加在偏置上的約束項,為Constraints物件
  • bias:布林值,是否包含偏置向量(即層對輸入做線性變換還是仿射變換)
  • input_dim:整數,輸入資料的維度。當Dense層作為網路的第一層時,必須指定該引數或 input_shape 引數。
輸入:形如( nb_samples, input_dim)的2D張量
輸出:形如 ( nb_samples, output_dim)的2D張量

2.2. Activation層

啟用層對一個層的輸出施加啟用函式
keras.layers.core.Activation(activation)
  • activation:將要使用的啟用函式,為預定義啟用函式名或一個Tensorflow/Theano的函式。
輸入shape任意,當使用啟用層作為第一層時,要指定 input_shape
輸出shape與輸入shape相同

2.3. Dropout層

為輸入資料施加Dropout。 Dropout將在訓練過程中每次更新引數時隨機斷開一定百分比( p)的輸入神經元連線, Dropout層用於防止過擬合。
keras.layers.core.Dropout(p)
  • p: 0~1的浮點數,控制需要斷開的連結的比例

2.4. SpatialDropout1D層

SpatialDropout1D與Dropout的作用類似,但它斷開的是整個1D特徵圖,而不是單個神經元。如果一張特徵圖的相鄰畫素之間有很強的相關性(通常發生在低層的卷積層中),那麼普通的dropout無法正則化其輸出,否則就會導致明顯的學習率下降。這種情況下, SpatialDropout1D能夠幫助提高特徵圖之間的獨立性,應該用其取代普通的Dropout
keras.layers.core.SpatialDropout1D(p)
  • p: 0~1的浮點數,控制需要斷開的連結的比例
輸入shape輸入形如( samples, timesteps, channels)的3D張量
輸出shape與輸入相同

2.5. SpatialDropout2D層

SpatialDropout2D與Dropout的作用類似,但它斷開的是整個2D特徵圖,而不是單個神經元。如果一張特徵圖的相鄰畫素之間有很強的相關性(通常發生在低層的卷積層中),那麼普通的dropout無法正則化其輸出,否則就會導致明顯的學習率下降。這種情況下, SpatialDropout2D能夠幫助提高特徵圖之間的獨立性,應該用其取代普通的Dropout
keras.layers.core.SpatialDropout2D(p, dim_ordering='default')
  • p: 0~1的浮點數,控制需要斷開的連結的比例
  • dim_ordering:'th'或'tf',預設為 ~/.keras/keras.json 配置的 image_dim_ordering 值
輸入shape:th’模式下,輸入形如( samples, channels, rows, cols)的4D張量,‘tf’模式下,輸入形如( samples, rows, cols, channels)的4D張量,注意這裡的輸入shape指的是函式內部實現的輸入shape,而非函式介面應指定的 input_shape 。
輸出shape與輸入相同

2.6. SpatialDropout3D層

keras.layers.core.SpatialDropout3D(p, dim_ordering='default')
與之上的類似

2.7. Flatten層

Flatten層用來將輸入“壓平”,即把多維的輸入一維化,常用在從卷積層到全連線層的過渡。 Flatten不影響batch的大小。
keras.layers.core.Flatten()

2.8. Reshape層

Reshape層用來將輸入shape轉換為特定的shape
keras.layers.core.Reshape(target_shape)
  • target_shape:目標shape,為整數的tuple,不包含樣本數目的維度( batch大小)
輸入shape:任意,但輸入的shape必須固定。當使用該層為模型首層時,需要指定 input_shape 引數
輸出shape:(batch_size,)+target_shape
# as first layer in a Sequential model
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# now: model.output_shape == (None, 3, 4)
# note: `None` is the batch dimension
# as intermediate layer in a Sequential model
model.add(Reshape((6, 2)))
# now: model.output_shape == (None, 6, 2)

2.9. Permute層

Permute層將輸入的維度按照給定模式進行重排,例如,當需要將RNN和CNN網路連線時,可能會用到該層。
keras.layers.core.Permute(dims)
  • dims:整數tuple,指定重排的模式,不包含樣本數的維度。重拍模式的下標從1開始。例如( 2, 1)代表將輸入的第二個維度重拍到輸出的第一個維度,而將輸入的第一個維度重排到第二個維度
輸入shape任意,當使用啟用層作為第一層時,要指定 input_shape
輸出shape與輸入相同,但是其維度按照指定的模式重新排列
model = Sequential()
model.add(Permute((2, 1), input_shape=(10, 64)))
# now: model.output_shape == (None, 64, 10)
# note: `None` is the batch dimension

2.10. RepeatVector層

RepeatVector層將輸入重複n次
keras.layers.core.RepeatVector(n)
  • n:整數,重複的次數
輸入shape形如( nb_samples, features)的2D張量
輸出shape形如( nb_samples, n, features)的3D張量

2.11. Merge層

Merge層根據給定的模式,將一個張量列表中的若干張量合併為一個單獨的張量
keras.engine.topology.Merge(layers=None, mode='sum', concat_axis=-1, dot_axes=-1, output_shape=None, node_indices=None, tensor_indices=None, name=None)
  • layers:該引數為Keras張量的列表,或Keras層物件的列表。該列表的元素數目必須大於1。
  • mode:合併模式,為預定義合併模式名的字串或lambda函式或普通函式,如果為lambda函式或普通函式,則該函式必須接受一個張量的list作為輸入,並返回一個張量。如果為字串,則必須是下列值之一:“sum”, “mul”, “concat”, “ave”, “cos”, “dot”
  • concat_axis:整數,當 mode=concat 時指定需要串聯的軸
  • dot_axes:整數或整數tuple,當 mode=dot 時,指定要消去的軸
  • output_shape:整數tuple或lambda函式/普通函式(當mode為函式時)。如果output_shape是函式時,該函式的輸入值應為一一對應於輸入shape的list,並返回輸出張量的shape。
  • node_indices:可選,為整數list,如果有些層具有多個輸出節點( node)的話,該引數可以指定需要merge的那些節點的下標。如果沒有提供,該引數的預設值為全0向量,即合併輸入層0號節點的輸出值。
  • tensor_indices:可選,為整數list,如果有些層返回多個輸出張量的話,該引數用以指定需要合併的那些張量。
model1 = Sequential()
model1.add(Dense(32))
model2 = Sequential()
model2.add(Dense(32))
merged_model = Sequential()
merged_model.add(Merge([model1, model2], mode='concat', concat_axis=1)

2.12. Lambda層

本函式用以對上一層的輸出施以任何Theano/TensorFlow表示式
keras.layers.core.Lambda(function, output_shape=None, arguments={})
  • function:要實現的函式,該函式僅接受一個變數,即上一層的輸出
  • output_shape:函式應該返回的值的shape,可以是一個tuple,也可以是一個根據輸入shape計算輸出shape的函式
  • arguments:可選,字典,用來記錄向函式中傳遞的其他關鍵字引數
輸入shape任意,當使用該層作為第一層時,要指定 input_shape
輸出shape由 output_shape 引數指定的輸出shape

2.13. ActivityRegularizer層

經過本層的資料不會有任何變化,但會基於其啟用值更新損失函式值
keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)
  • l1: 1範數正則因子(正浮點數)
  • l2: 2範數正則因子(正浮點數)
輸入shape任意,當使用該層作為第一層時,要指定 input_shape
輸出shape與輸入shape相同

2.14. Masking層

使用給定的值對輸入的序列訊號進行“遮蔽”,用以定位需要跳過的時間步對於輸入張量的時間步,即輸入張量的第1維度(維度從0開始算,見例子),如果輸入張量在該時間步上都等於 mask_value ,則該時間步將在模型接下來的所有層(只要支援masking)被跳過(遮蔽)。如果模型接下來的一些層不支援masking,卻接受到masking過的資料,則丟擲異常。
keras.layers.core.Masking(mask_value=0.0)
例子:
考慮輸入資料 x 是一個形如(samples,timesteps,features)的張量,現將其送入LSTM層。因為你缺少時間步為3和5的訊號,所以你希望將其掩蓋。這時候應該:
賦值 x[:,3,:] = 0. , x[:,5,:] = 0.
在LSTM層之前插入 mask_value=0. 的 Masking 層
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))

2.15. Highway層

Highway層建立全連線的Highway網路,這是LSTM在前饋神經網路中的推廣
keras.layers.core.Highway(init='glorot_uniform', transform_bias=-2, activation='linear', weights=None, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True, input_dim=None)
引數與Dense層同名相同

2.16. MaxoutDense層

全連線的Maxout層,MaxoutDense 層以 nb_features 個 Dense(input_dim,output_dim) 線性層的輸出的最大值為輸出。 MaxoutDense 可對輸入學習出一個凸的、分段線性的啟用函式。
keras.layers.core.MaxoutDense(nb_features)
  • nb_features:內部使用的全連線層的數目
輸入shape形如( nb_samples, input_dim)的2D張量
輸出shape形如( nb_samples, output_dim)的2D張量