如前所述,Keras 層是 Keras 模型的主要構建塊。每一層接收輸入信息,做一些計算,最后輸出轉換后的信息。一層的輸出將作為輸入流入下一層。我們將在本章中了解有關圖層的完整詳細信息。
Keras 層需要輸入的形狀 (input_shape)來理解輸入數(shù)據(jù)的結構,初始化器為每個輸入設置權重,最后激活器來轉換輸出以使其非線性。在這兩者之間,約束限制并指定要生成的輸入數(shù)據(jù)的權重范圍,正則化器將通過在優(yōu)化過程中動態(tài)應用權重的懲罰來嘗試優(yōu)化層(和模型)。
總而言之,Keras 層需要低于最低限度的細節(jié)來創(chuàng)建一個完整的層。
讓我們在下一章中了解基本概念。在了解基本概念之前,讓我們使用 Sequential 模型 API 創(chuàng)建一個簡單的 Keras 層,以了解 Keras 模型和層的工作原理。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
from keras import regularizers
from keras import constraints
model = Sequential()
model.add(Dense(32, input_shape=(16,), kernel_initializer = 'he_uniform',
kernel_regularizer = None, kernel_constraint = 'MaxNorm', activation = 'relu'))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(8))
代碼詳解:
Sequential API
創(chuàng)建一個新模型。Input Shape, (16,)
。否則,上一層的輸出將用作下一層的輸入。所有其他參數(shù)都是可選的。
input_shape
表示輸入數(shù)據(jù)的形狀。kernel_initializer
表示要使用的初始化程序。he_uniform
函數(shù)被設置為值。kernel_regularizer
表示要使用的正則化
器。無設置為值。kernel_constraint
表示要使用的約束。MaxNorm
函數(shù)被設置為值。activation
表示要使用的激活。relu 函數(shù)被設置為值。讓我們了解層的基本概念以及 Keras 如何支持每個概念。
在機器學習中,所有類型的輸入數(shù)據(jù),如文本、圖像或視頻,都將首先轉換為數(shù)字數(shù)組,然后輸入算法。輸入的數(shù)字可以是一維數(shù)組、二維數(shù)組(矩陣)或多維數(shù)組。我們可以使用shape
指定維度信息,這是一個整數(shù)元組。例如,(4,2)
表示四行兩列的矩陣。
>>> import numpy as np
>>> shape = (4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
[0. 0.]
[0. 0.]
[0. 0.]
[0. 0.]
]
>>>
類似地,(3,4,2)
三維矩陣具有三個 4x2 矩陣的集合(兩行四列)
>>> import numpy as np
>>> shape = (3, 4, 2)
>>> input = np.zeros(shape)
>>> print(input)
[
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
]
>>>
要創(chuàng)建模型的第一層(或模型的輸入層),應指定輸入數(shù)據(jù)的形狀。
在機器學習中,權重將分配給所有輸入數(shù)據(jù)。Initializers 模塊提供了不同的函數(shù)來設置這些初始權重。一些 Keras Initializer 函數(shù)如下:
所有輸入數(shù)據(jù)生成0。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Zeros()
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
其中,kernel_initializer
表示模型內(nèi)核的初始化程序。
所有輸入數(shù)據(jù)生成1。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Ones()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
所有輸入數(shù)據(jù)生成用戶指定的常量值(例如5)。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Constant(value = 0) model.add(
Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)
其中,value
表示常數(shù)值
使用輸入數(shù)據(jù)的正態(tài)分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.RandomNormal(mean=0.0,
stddev = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
mean
表示要生成的隨機值的平均值stddev
表示要生成的隨機值的標準偏差seed
代表生成隨機數(shù)的值使用輸入數(shù)據(jù)的均勻分布生成值。
from keras import initializers
my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
minval
表示要生成的隨機值的下限maxval
表示要生成的隨機值的上限使用輸入數(shù)據(jù)的截斷正態(tài)分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.TruncatedNormal(mean = 0.0, stddev = 0.05, seed = None
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
根據(jù)圖層的輸入形狀和輸出形狀以及指定的比例生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.VarianceScaling(
scale = 1.0, mode = 'fan_in', distribution = 'normal', seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
skernel_initializer = my_init))
scale
表示縮放因子mode
表示fan_in
、fan_out
和fan_avg
值中的任何一個distribution
代表正態(tài)或均勻
它使用以下公式找到正態(tài)分布的stddev
值,然后使用正態(tài)分布找到權重,
stddev = sqrt(scale / n)
其中n
代表,
mode = fan_in
的輸入單元數(shù)mode = fan_out
的輸出單元數(shù)mode = fan_avg
的平均輸入和輸出單元數(shù)類似地,它使用以下公式找到均勻分布的極限,然后使用均勻分布找到權重,
limit = sqrt(3 * scale / n)
使用輸入數(shù)據(jù)的 lecun 正態(tài)分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
它使用以下公式找到stddev
,然后應用正態(tài)分布
stddev = sqrt(1 / fan_in)
其中,fan_in
表示輸入單元的數(shù)量。
使用輸入數(shù)據(jù)的 lecun 均勻分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.lecun_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
它使用以下公式找到極限,然后應用均勻分布
limit = sqrt(3 / fan_in)
fan_in
表示輸入單元的數(shù)量fan_out
表示輸出單元的數(shù)量使用輸入數(shù)據(jù)的 glorot 正態(tài)分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.glorot_normal(seed=None) model.add(
Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)
它使用以下公式找到 stddev,然后應用正態(tài)分布
stddev = sqrt(2 / (fan_in + fan_out))
fan_in
表示輸入單元的數(shù)量fan_out
表示輸出單元的數(shù)量使用輸入數(shù)據(jù)的 glorot 均勻分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.glorot_uniform(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
它使用以下公式找到極限
,然后應用均勻分布
limit = sqrt(6 / (fan_in + fan_out))
fan_in
表示輸入單元的數(shù)量。fan_out
表示輸出單元的數(shù)量使用輸入數(shù)據(jù)的正態(tài)分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.RandomUniform(minval = -0.05, maxval = 0.05, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
它使用以下公式找到stddev
,然后應用正態(tài)分布。
stddev = sqrt(2 / fan_in)
其中,fan_in
表示輸入單元的數(shù)量。
使用輸入數(shù)據(jù)的均勻分布生成值。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.he_normal(seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
它使用以下公式找到limit
,然后應用均勻分布。
limit = sqrt(6 / fan_in)
其中,fan_in
表示輸入單元的數(shù)量。
生成隨機正交矩陣。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Orthogonal(gain = 1.0, seed = None)
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_initializer = my_init))
其中,gain
表示矩陣的乘法因子。
生成單位矩陣。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import initializers
my_init = initializers.Identity(gain = 1.0) model.add(
Dense(512, activation = 'relu', input_shape = (784,), kernel_initializer = my_init)
)
在機器學習中,將在優(yōu)化階段對參數(shù)(權重)設置約束。<>Constraints 模塊提供了不同的功能來設置層上的約束。一些約束函數(shù)如下。
將權重限制為非負。
from keras.constraints import non_neg
其中,kernel_constraint
表示要在層中使用的約束。
將權重約束為單位范數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints
my_constrain = constraints.UnitNorm(axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_constraint = my_constrain))
將權重限制為小于或等于給定值的范數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints
my_constrain = constraints.MaxNorm(max_value = 2, axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_constraint = my_constrain))
max_value
表示上限將權重約束為指定的最小值和最大值之間的范數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import constraints
my_constrain = constraints.MinMaxNorm(min_value = 0.0, max_value = 1.0, rate = 1.0, axis = 0)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_constraint = my_constrain))
其中,rate
表示應用權重約束的速率。
在機器學習中,正則化器用于優(yōu)化階段。它在優(yōu)化過程中對層參數(shù)應用一些懲罰。Keras 正則化模塊提供以下函數(shù)來設置層的懲罰。正則化僅適用于每層基礎。
它提供基于 L1 的正則化
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers
my_regularizer = regularizers.l1(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_regularizer = my_regularizer))
其中,kernel_regularizer
表示應用權重約束的速率。
它提供基于 L2 的正則化
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers
my_regularizer = regularizers.l2(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_regularizer = my_regularizer))
它提供基于 L1 和 L2 的正則化。
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras import regularizers
my_regularizer = regularizers.l2(0.)
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,),
kernel_regularizer = my_regularizer))
在機器學習中,激活函數(shù)是一種特殊的函數(shù),用于發(fā)現(xiàn)特定神經(jīng)元是否被激活?;旧希せ詈瘮?shù)對輸入數(shù)據(jù)進行非線性變換,從而使神經(jīng)元能夠更好地學習。神經(jīng)元的輸出取決于激活函數(shù)。
當您回憶起單一感知的概念時,感知器(神經(jīng)元)的輸出只是激活函數(shù)的結果,它接受所有輸入乘以其相應的權重加上總體偏差(如果有的話)的總和。
result = Activation(SUMOF(input * weight) + bias)
因此,激活函數(shù)在模型的成功學習中起著重要作用。Keras 在 activations 模塊中提供了很多激活函數(shù)。讓我們學習模塊中可用的所有激活。
應用線性函數(shù)。什么也沒做。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'linear', input_shape = (784,)))
其中,激活是指層的激活函數(shù)。可以簡單地通過函數(shù)名稱指定,層將使用相應的激活器。
應用指數(shù)線性單位
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'elu', input_shape = (784,)))
應用縮放指數(shù)線性單位。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'selu', input_shape = (784,)))
應用整流線性單元。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))
應用 Softmax 函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softmax', input_shape = (784,)))
應用Softplus功能。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softplus', input_shape = (784,)))
應用softsign功能。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softsign', input_shape = (784,)))
應用 Sigmoid 函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'sigmoid', input_shape = (784,)))
應用 hard_sigmoid 函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'hard_sigmoid', input_shape = (784,)))
應用指數(shù)函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'exponential', input_shape = (784,)))
更多建議: