1. 模型初始化
-
初始化定義了設置 Keras 各層權重隨機初始值的方法。用來將初始化器傳入 Keras 層的參數名取決於具體的層。通常關鍵字為
kernel_initializer
和bias_initializer
:model.add(Dense(64, kernel_initializer='random_uniform', bias_initializer='zeros'))
-
內置的初始化工具 (是
keras.initializers
模塊的一部分)-
Initializer
- 初始化器基類:所有初始化器繼承這個類。
-
Zeros
- 將張量初始值設為 0 的初始化器。
-
Ones
- 將張量初始值設為 1 的初始化器。
-
Constant
- 將張量初始值設為 constant的初始化器。
-
RandomNormal
- 按照正態分布生成隨機張量
-
RandomUniform
- 按照均勻分布生成隨機張量
-
TruncatedNormal
- 截尾正態分布。生成的隨機值與
RandomNormal
生成的類似,但是在距離平均值兩個標准差之外的隨機值將被丟棄並重新生成。這是用來生成神經網絡權重和濾波器的推薦初始化器。
- 截尾正態分布。生成的隨機值與
-
VarianceScaling
-
初始化器能夠根據權值的尺寸調整其規模。
使用
distribution="normal"
時,樣本是從一個以 0 為中心的截斷正態分布中抽取的,stddev = sqrt(scale / n)
,其中 n 是:- 權值張量中輸入單元的數量,如果 mode = "fan_in"。
- 輸出單元的數量,如果 mode = "fan_out"。
- 輸入和輸出單位數量的平均數,如果 mode = "fan_avg"。
使用
distribution="uniform"
時,樣本是從 [-limit,limit] 內的均勻分布中抽取的,其中limit = sqrt(3 * scale / n)
。
-
-
Orthogonal
- 生成一個隨機正交矩陣
-
Identity
- 生成單位矩陣
-
lecun_uniform
- LeCun 均勻初始化器。它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
limit
是sqrt(3 / fan_in)
,fan_in
是權值張量中的輸入單位的數量。
- LeCun 均勻初始化器。它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
-
glorot_normal (cs231n推薦):也稱為 Xavier 正態分布初始化器。
- 它從以 0 為中心,標准差為
stddev = sqrt(2 / (fan_in + fan_out))
的截斷正態分布中抽取樣本, 其中fan_in
是權值張量中的輸入單位的數量,fan_out
是權值張量中的輸出單位的數量。
- 它從以 0 為中心,標准差為
-
glorot_uniform:Glorot 均勻分布初始化器,也稱為 Xavier 均勻分布初始化器。
- 它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
limit
是sqrt(6 / (fan_in + fan_out))
,fan_in
是權值張量中的輸入單位的數量,fan_out
是權值張量中的輸出單位的數量。
- 它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
-
he_normal
- He 正態分布初始化器。它從以 0 為中心,標准差為
stddev = sqrt(2 / fan_in)
的截斷正態分布中抽取樣本, 其中fan_in
是權值張量中的輸入單位的數量,
- He 正態分布初始化器。它從以 0 為中心,標准差為
-
lecun_normal
- LeCun 正態分布初始化器。它從以 0 為中心,標准差為
stddev = sqrt(1 / fan_in)
的截斷正態分布中抽取樣本, 其中fan_in
是權值張量中的輸入單位的數量。
- LeCun 正態分布初始化器。它從以 0 為中心,標准差為
-
he_uniform
- He 均勻方差縮放初始化器。它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
limit
是sqrt(6 / fan_in)
, 其中fan_in
是權值張量中的輸入單位的數量。
- He 均勻方差縮放初始化器。它從 [-limit,limit] 中的均勻分布中抽取樣本, 其中
-
2. 自定義初始化器
-
如果傳遞一個自定義的可調用函數,那么它必須使用參數
shape
(需要初始化的變量的尺寸)和dtype
(數據類型):from keras import backend as K def my_init(shape, dtype=None): return K.random_normal(shape, dtype=dtype) model.add(Dense(64, kernel_initializer=my_init))