Keras 層

2022-04-13 14:27 更新

如前所述,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è)完整的層。

  • 輸入數(shù)據(jù)的形狀
  • 層中神經(jīng)元/單元的數(shù)量
  • 初始化程序
  • 正則化器
  • 約束
  • 激活

讓我們在下一章中了解基本概念。在了解基本概念之前,讓我們使用 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))

代碼詳解:

  • 第 1-5 行 導(dǎo)入必要的模塊。
  • 第 7 行 使用 Sequential API 創(chuàng)建一個(gè)新模型。
  • 第 9 行 創(chuàng)建一個(gè)新的 Dense 層并將其添加到模型中。Dense 是 Keras 提供的入門級層,它接受神經(jīng)元或單元(32)的數(shù)量作為其所需參數(shù)。如果圖層是第一層,那么我們還需要提供Input Shape, (16,)。否則,上一層的輸出將用作下一層的輸入。所有其他參數(shù)都是可選的。
    • 第一個(gè)參數(shù)表示單元(神經(jīng)元)的數(shù)量。
    • input_shape表示輸入數(shù)據(jù)的形狀。
    • kernel_initializer表示要使用的初始化程序。he_uniform函數(shù)被設(shè)置為值。
    • kernel_regularizer表示要使用的正則化器。無設(shè)置為值。
    • kernel_constraint表示要使用的約束。MaxNorm函數(shù)被設(shè)置為值。
    • activation表示要使用的激活。relu 函數(shù)被設(shè)置為值。
  • 第 10 行創(chuàng)建了具有 16 個(gè)單元的第二個(gè) Dense 層,并將relu設(shè)置為激活函數(shù)。
  • 第 11 行創(chuàng)建了具有 8 個(gè)單元的最終 Dense 層。

層的基本概念

讓我們了解層的基本概念以及 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ù)如下:

Zeros()

所有輸入數(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)核的初始化程序。

Ones()

所有輸入數(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))

Constant

所有輸入數(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ù)值

RandomNormal

使用輸入數(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ù)的值

RandomUniform

使用輸入數(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ī)值的上限

TruncatedNormal

使用輸入數(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))

VarianceScaling

根據(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_infan_outfan_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)

lecun_normal

使用輸入數(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ù)量。

lecun_uniform

使用輸入數(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ù)量

Glorot_normal

使用輸入數(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ù)量

Glorot_uniform

使用輸入數(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ù)量

he_normal

使用輸入數(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ù)量。

he_uniform

使用輸入數(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ù)量。

Orthogonal

生成隨機(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表示矩陣的乘法因子。

Identity

生成單位矩陣。

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ù)如下。

non_neg

將權(quán)重限制為非負(fù)。

from keras.constraints import non_neg

其中,kernel_constraint表示要在層中使用的約束。

UnitNorm

將權(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))

MaxNorm

將權(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表示上限
  • 軸表示要應(yīng)用約束的維度。例如,在 Shape (2,3,4) 軸中,0 表示第一維,1 表示第二維,2 表示第三維

MinMaxNorm

將權(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 正則化器

它提供基于 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 正則化器

它提供基于 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 正則化器

它提供基于 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)的激活器。

elu

應(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,)))

selu

應(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,)))

relu

應(yīng)用整流線性單元。

from keras.models import Sequential 
from keras.layers import Activation, Dense 


model = Sequential() 
model.add(Dense(512, activation = 'relu', input_shape = (784,)))

softmax

應(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,)))

softplus

應(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,)))

softsign

應(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,)))

sigmoid

應(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,)))

hard_sigmoid

應(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,)))

exponential

應(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,)))
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號