Keras Layers层怎么用?Keras中如何定义和添加Layers?

文章导读
Previous Quiz Next 如先前所学,Keras 层是 Keras 模型的主要构建块。每个层接收输入信息,进行一些计算,并最终输出转换后的信息。一层的输出将作为下一层的输入流入。我们将在本章中学习关于层的完整细节。
📋 目录
  1. 介绍
  2. 层的基本概念
  3. 初始化器
  4. 约束条件
  5. 正则化器
  6. Activations
A A

Keras - 层



Previous
Quiz
Next

如先前所学,Keras 层是 Keras 模型的主要构建块。每个层接收输入信息,进行一些计算,并最终输出转换后的信息。一层的输出将作为下一层的输入流入。我们将在本章中学习关于层的完整细节。

介绍

Keras 层需要输入形状 (input_shape)来理解输入数据的结构,initializer来为每个输入设置权重,以及 activators 来转换输出使其非线性。在此之间,constraints 限制并指定生成输入数据权重的范围,regularizer 将尝试通过在优化过程中动态对权重施加惩罚来优化层(以及模型)。

总结来说,Keras 层需要以下最小细节来创建一个完整的层。

  • 输入数据的形状
  • 层中神经元/单元的数量
  • Initializers
  • Regularizers
  • Constraints
  • Activations

让我们在下一章中理解基本概念。在理解基本概念之前,让我们使用 Sequential model 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 表示要使用的 initializer。he_uniform 函数被设置为值。

    • kernel_regularizer 表示要使用的 regularizer。None 被设置为值。

    • kernel_constraint 表示要使用的 constraint。MaxNorm 函数被设置为值。

    • activation 表示要使用的 activation。relu 函数被设置为值。

  • 第 10 行创建第二个 Dense 层,包含 16 个单元,并将 relu 设置为 activation function。

  • 第 11 行创建最终的 Dense 层,包含 8 个单元。

层的基本概念

让我们了解层的核心概念,以及 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.]]
]
>>>

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

初始化器

在机器学习中,会为所有输入数据分配权重。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 表示 normaluniform

VarianceScaling

它使用以下公式为正态分布计算 stddev 值,然后使用正态分布生成权重:

stddev = sqrt(scale / n)

其中 n 表示:

  • 当 mode = fan_in 时,为输入单元数量

  • 当 mode = fan_out 时,为输出单元数量

  • 当 mode = fan_avg 时,为输入和输出单元数量的平均值

类似地,它使用以下公式为均匀分布计算 limit,然后使用均匀分布生成权重:

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,然后应用均匀分布

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,然后应用均匀分布

limit = sqrt(6 / (fan_in + fan_out))

其中,

  • fan_in 表示输入单元数量。

  • fan_out 表示输出单元数量

he_normal

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

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

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

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 模块提供了不同的函数来为层设置约束条件。以下是一些约束函数。

NonNeg

将权重约束为非负值。

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

其中,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 表示上限值

  • axis 表示应用约束条件的维度。例如,在 Shape (2,3,4) 中,axis 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))

Activations

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

回想一下单感知器(perceptron)的概念,感知器(神经元)的输出仅仅是激活函数的结果,该函数接受所有输入与其对应权重相乘的求和加上整体 bias(如果有的话)。

result = Activation(SUMOF(input * weight) + bias)  # 结果 = 激活函数(输入*权重求和 + bias)

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

linear

应用 Linear function(线性函数)。什么都不做。

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

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

其中,activation 指代该层的激活函数。它可以通过函数名称简单指定,层将使用对应的激活器。

elu

应用 Exponential linear unit(指数线性单元)。

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

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

selu

应用 Scaled exponential linear unit(缩放指数线性单元)。

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

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

relu

应用 Rectified Linear Unit(修正线性单元)。

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

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

softmax

应用 Softmax function(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 function(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 function(softsign 函数)。

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

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

tanh

应用 Hyperbolic tangent function(双曲正切函数)。

from keras.models import Sequential 
from keras.layers import Activation, Dense 
model = Sequential() 
model.add(Dense(512, activation = 'tanh', input_shape = (784,)))

sigmoid

应用 Sigmoid function(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 function(硬 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

应用 exponential function(指数函数)。

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

model = Sequential() 
model.add(Dense(512, activation = 'exponential', input_shape = (784,)))
序号 Layers & Description
1

Dense Layer

Dense layer 是常规的深度连接神经网络层。

2

Dropout Layers

Dropout 是机器学习中的一个重要概念。

3

Flatten Layers

Flatten 用于展平输入。

4

Reshape Layers

Reshape 用于改变输入的形状。

5

Permute Layers

Permute 也用于使用模式改变输入的形状。

6

RepeatVector Layers

RepeatVector 用于将输入重复指定次数 n。

7

Lambda Layers

Lambda 用于使用表达式或函数转换输入数据。

8

Convolution Layers

Keras 包含大量用于创建基于卷积的 ANN 的层,这些层通常被称为 Convolution Neural Network (CNN)(卷积神经网络)。

9

Pooling Layer

它用于对时序数据执行最大池化操作。

10

Locally connected layer

Locally connected layers 与 Conv1D layer 类似,但区别在于 Conv1D layer 的权重是共享的,而这里的权重是非共享的。

11

Merge Layer

它用于合并输入列表。

12

Embedding Layer

它在输入层执行嵌入操作。