如前所述,Keras 層是 Keras 模型的主要構(gòu)建塊。每一層接收輸入信息,做一些計(jì)算,最后輸出轉(zhuǎn)換后的信息。一層的輸出將作為輸入流入下一層。我們將在本章中了解有關(guān)圖層的完整詳細(xì)信息。
Keras 層需要輸入的形狀 (input_shape)來理解輸入數(shù)據(jù)的結(jié)構(gòu),初始化器為每個(gè)輸入設(shè)置權(quán)重,最后激活器來轉(zhuǎn)換輸出以使其非線性。在這兩者之間,約束限制并指定要生成的輸入數(shù)據(jù)的權(quán)重范圍,正則化器將通過在優(yōu)化過程中動態(tài)應(yīng)用權(quán)重的懲罰來嘗試優(yōu)化層(和模型)。
總而言之,Keras 層需要低于最低限度的細(xì)節(jié)來創(chuàng)建一個(gè)完整的層。
讓我們在下一章中了解基本概念。在了解基本概念之前,讓我們使用 Sequential 模型 API 創(chuàng)建一個(gè)簡單的 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)建一個(gè)新模型。Input Shape, (16,)
。否則,上一層的輸出將用作下一層的輸入。所有其他參數(shù)都是可選的。
input_shape
表示輸入數(shù)據(jù)的形狀。kernel_initializer
表示要使用的初始化程序。he_uniform
函數(shù)被設(shè)置為值。kernel_regularizer
表示要使用的正則化
器。無設(shè)置為值。kernel_constraint
表示要使用的約束。MaxNorm
函數(shù)被設(shè)置為值。activation
表示要使用的激活。relu 函數(shù)被設(shè)置為值。讓我們了解層的基本概念以及 Keras 如何支持每個(gè)概念。
在機(jī)器學(xué)習(xí)中,所有類型的輸入數(shù)據(jù),如文本、圖像或視頻,都將首先轉(zhuǎn)換為數(shù)字?jǐn)?shù)組,然后輸入算法。輸入的數(shù)字可以是一維數(shù)組、二維數(shù)組(矩陣)或多維數(shù)組。我們可以使用shape
指定維度信息,這是一個(gè)整數(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)
三維矩陣具有三個(gè) 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.]]
]
>>>
要?jiǎng)?chuàng)建模型的第一層(或模型的輸入層),應(yīng)指定輸入數(shù)據(jù)的形狀。
在機(jī)器學(xué)習(xí)中,權(quán)重將分配給所有輸入數(shù)據(jù)。Initializers 模塊提供了不同的函數(shù)來設(shè)置這些初始權(quán)重。一些 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
表示要生成的隨機(jī)值的平均值stddev
表示要生成的隨機(jī)值的標(biāo)準(zhǔn)偏差seed
代表生成隨機(jī)數(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
表示要生成的隨機(jī)值的下限maxval
表示要生成的隨機(jī)值的上限使用輸入數(shù)據(jù)的截?cái)嗾龖B(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
值中的任何一個(gè)distribution
代表正態(tài)或均勻
它使用以下公式找到正態(tài)分布的stddev
值,然后使用正態(tài)分布找到權(quán)重,
stddev = sqrt(scale / n)
其中n
代表,
mode = fan_in
的輸入單元數(shù)mode = fan_out
的輸出單元數(shù)mode = fan_avg
的平均輸入和輸出單元數(shù)類似地,它使用以下公式找到均勻分布的極限,然后使用均勻分布找到權(quán)重,
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
,然后應(yīng)用正態(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))
它使用以下公式找到極限,然后應(yīng)用均勻分布
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,然后應(yīng)用正態(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))
它使用以下公式找到極限
,然后應(yīng)用均勻分布
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
,然后應(yīng)用正態(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
,然后應(yīng)用均勻分布。
limit = sqrt(6 / fan_in)
其中,fan_in
表示輸入單元的數(shù)量。
生成隨機(jī)正交矩陣。
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)
)
在機(jī)器學(xué)習(xí)中,將在優(yōu)化階段對參數(shù)(權(quán)重)設(shè)置約束。<>Constraints 模塊提供了不同的功能來設(shè)置層上的約束。一些約束函數(shù)如下。
將權(quán)重限制為非負(fù)。
from keras.constraints import non_neg
其中,kernel_constraint
表示要在層中使用的約束。
將權(quán)重約束為單位范數(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))
將權(quán)重限制為小于或等于給定值的范數(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
表示上限將權(quán)重約束為指定的最小值和最大值之間的范數(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īng)用權(quán)重約束的速率。
在機(jī)器學(xué)習(xí)中,正則化器用于優(yōu)化階段。它在優(yōu)化過程中對層參數(shù)應(yīng)用一些懲罰。Keras 正則化模塊提供以下函數(shù)來設(shè)置層的懲罰。正則化僅適用于每層基礎(chǔ)。
它提供基于 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
表示應(yīng)用權(quán)重約束的速率。
它提供基于 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))
在機(jī)器學(xué)習(xí)中,激活函數(shù)是一種特殊的函數(shù),用于發(fā)現(xiàn)特定神經(jīng)元是否被激活?;旧希せ詈瘮?shù)對輸入數(shù)據(jù)進(jìn)行非線性變換,從而使神經(jīng)元能夠更好地學(xué)習(xí)。神經(jīng)元的輸出取決于激活函數(shù)。
當(dāng)您回憶起單一感知的概念時(shí),感知器(神經(jīng)元)的輸出只是激活函數(shù)的結(jié)果,它接受所有輸入乘以其相應(yīng)的權(quán)重加上總體偏差(如果有的話)的總和。
result = Activation(SUMOF(input * weight) + bias)
因此,激活函數(shù)在模型的成功學(xué)習(xí)中起著重要作用。Keras 在 activations 模塊中提供了很多激活函數(shù)。讓我們學(xué)習(xí)模塊中可用的所有激活。
應(yīng)用線性函數(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ù)名稱指定,層將使用相應(yīng)的激活器。
應(yīng)用指數(shù)線性單位
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'elu', input_shape = (784,)))
應(yīng)用縮放指數(shù)線性單位。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'selu', input_shape = (784,)))
應(yīng)用整流線性單元。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))
應(yīng)用 Softmax 函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softmax', input_shape = (784,)))
應(yīng)用Softplus功能。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softplus', input_shape = (784,)))
應(yīng)用softsign功能。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'softsign', input_shape = (784,)))
應(yīng)用 Sigmoid 函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'sigmoid', input_shape = (784,)))
應(yīng)用 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,)))
應(yīng)用指數(shù)函數(shù)。
from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'exponential', input_shape = (784,)))
更多建議: