Keras 层

2022-04-13 14:27 更新

如前所述,Keras 层是 Keras 模型的主要构建块。每一层接收输入信息,做一些计算,最后输出转换后的信息。一层的输出将作为输入流入下一层。我们将在本章中了解有关图层的完整详细信息。

介绍

Keras 层需要输入的形状 (input_shape)来理解输入数据的结构,初始化器为每个输入设置权重,最后激活器来转换输出以使其非线性。在这两者之间,约束限制并指定要生成的输入数据的权重范围,正则化器将通过在优化过程中动态应用权重的惩罚来尝试优化层(和模型)。

总而言之,Keras 层需要低于最低限度的细节来创建一个完整的层。

  • 输入数据的形状
  • 层中神经元/单元的数量
  • 初始化程序
  • 正则化器
  • 约束
  • 激活

让我们在下一章中了解基本概念。在了解基本概念之前,让我们使用 Sequential 模型 API 创建一个简单的 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 行 导入必要的模块。
  • 第 7 行 使用 Sequential API 创建一个新模型。
  • 第 9 行 创建一个新的 Dense 层并将其添加到模型中。Dense 是 Keras 提供的入门级层,它接受神经元或单元(32)的数量作为其所需参数。如果图层是第一层,那么我们还需要提供Input Shape, (16,)。否则,上一层的输出将用作下一层的输入。所有其他参数都是可选的。
    • 第一个参数表示单元(神经元)的数量。
    • input_shape表示输入数据的形状。
    • kernel_initializer表示要使用的初始化程序。he_uniform函数被设置为值。
    • kernel_regularizer表示要使用的正则化器。无设置为值。
    • kernel_constraint表示要使用的约束。MaxNorm函数被设置为值。
    • activation表示要使用的激活。relu 函数被设置为值。
  • 第 10 行创建了具有 16 个单元的第二个 Dense 层,并将relu设置为激活函数。
  • 第 11 行创建了具有 8 个单元的最终 Dense 层。

层的基本概念

让我们了解层的基本概念以及 Keras 如何支持每个概念。

输入形状

在机器学习中,所有类型的输入数据,如文本、图像或视频,都将首先转换为数字数组,然后输入算法。输入的数字可以是一维数组、二维数组(矩阵)或多维数组。我们可以使用shape指定维度信息,这是一个整数元组。例如,(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.]]
]
>>>

要创建模型的第一层(或模型的输入层),应指定输入数据的形状。

初始化

在机器学习中,权重将分配给所有输入数据。Initializers 模块提供了不同的函数来设置这些初始权重。一些 Keras Initializer 函数如下:

Zeros()

所有输入数据生成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表示模型内核的初始化程序。

Ones()

所有输入数据生成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

所有输入数据生成用户指定的常量值(例如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表示常数值

RandomNormal

使用输入数据的正态分布生成值。

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代表生成随机数的值

RandomUniform

使用输入数据的均匀分布生成值。

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表示要生成的随机值的上限

TruncatedNormal

使用输入数据的截断正态分布生成值。

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

根据图层的输入形状和输出形状以及指定的比例生成值。

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值中的任何一个
  • distribution 代表正态或均匀

它使用以下公式找到正态分布的stddev值,然后使用正态分布找到权重,

stddev = sqrt(scale / n)

其中n代表,

  • mode = fan_in 的输入单元数
  • mode = fan_out 的输出单元数
  • mode = fan_avg 的平均输入和输出单元数

类似地,它使用以下公式找到均匀分布的极限,然后使用均匀分布找到权重,

limit = sqrt(3 * scale / n)

lecun_normal

使用输入数据的 lecun 正态分布生成值。

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,然后应用正态分布

stddev = sqrt(1 / fan_in)

其中,fan_in表示输入单元的数量。

lecun_uniform

使用输入数据的 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表示输入单元的数量
  • fan_out表示输出单元的数量

Glorot_normal

使用输入数据的 glorot 正态分布生成值。

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,然后应用正态分布

stddev = sqrt(2 / (fan_in + fan_out))
  • fan_in表示输入单元的数量
  • fan_out表示输出单元的数量

Glorot_uniform

使用输入数据的 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表示输入单元的数量。
  • fan_out表示输出单元的数量

he_normal

使用输入数据的正态分布生成值。

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,然后应用正态分布。

stddev = sqrt(2 / fan_in)

其中,fan_in表示输入单元的数量。

he_uniform

使用输入数据的均匀分布生成值。

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表示输入单元的数量。

Orthogonal

生成随机正交矩阵。

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)
)

约束

在机器学习中,将在优化阶段对参数(权重)设置约束。<>Constraints 模块提供了不同的功能来设置层上的约束。一些约束函数如下。

non_neg

将权重限制为非负。

from keras.constraints import non_neg

其中,kernel_constraint表示要在层中使用的约束。

UnitNorm

将权重约束为单位范数。

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

将权重限制为小于或等于给定值的范数。

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表示上限
  • 轴表示要应用约束的维度。例如,在 Shape (2,3,4) 轴中,0 表示第一维,1 表示第二维,2 表示第三维

MinMaxNorm

将权重约束为指定的最小值和最大值之间的范数。

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表示应用权重约束的速率。

正则化器

在机器学习中,正则化器用于优化阶段。它在优化过程中对层参数应用一些惩罚。Keras 正则化模块提供以下函数来设置层的惩罚。正则化仅适用于每层基础。

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表示应用权重约束的速率。

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))

激活

在机器学习中,激活函数是一种特殊的函数,用于发现特定神经元是否被激活。基本上,激活函数对输入数据进行非线性变换,从而使神经元能够更好地学习。神经元的输出取决于激活函数。

当您回忆起单一感知的概念时,感知器(神经元)的输出只是激活函数的结果,它接受所有输入乘以其相应的权重加上总体偏差(如果有的话)的总和。

result = Activation(SUMOF(input * weight) + bias)

因此,激活函数在模型的成功学习中起着重要作用。Keras 在 activations 模块中提供了很多激活函数。让我们学习模块中可用的所有激活。

线性

应用线性函数。什么也没做。

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


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

其中,激活是指层的激活函数。可以简单地通过函数名称指定,层将使用相应的激活器。

elu

应用指数线性单位

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


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

selu

应用缩放指数线性单位。

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


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

relu

应用整流线性单元。

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


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

softmax

应用 Softmax 函数。

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


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

softplus

应用Softplus功能。

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


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

softsign

应用softsign功能。

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


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

sigmoid

应用 Sigmoid 函数。

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


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

hard_sigmoid

应用 hard_sigmoid 函数。

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


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

exponential

应用指数函数。

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


model = Sequential() 
model.add(Dense(512, activation = 'exponential', input_shape = (784,)))
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号