Keras 简明教程

Keras - Layers

正如前面所学,Keras 层是 Keras 模型的主要构建块。每一层接收输入信息,进行一些计算,最后输出转换后的信息。一层输出将流入下一层作为其输入。让我们在此章节中了解有关层的完整详细信息。

Introduction

一个 Keras 层需要 shape of the input (input_shape) 以便了解输入数据的结构,需要 initializer 设置每个输入的权重,最后需要激活器将输出转化为非线性。中间用约束限制输入数据权重的生成范围,而正则化函数会通过在优化过程中动态地对权重施加惩罚,来尝试优化层(以及模型)。

总而言之,Keras 层需要以下最低细节信息才能创建一个完整的层。

  1. 输入数据形状

  2. 层中的神经元/单元数

  3. Initializers

  4. Regularizers

  5. Constraints

  6. Activations

让我们在下一章了解基本概念。在了解基本概念之前,让我们使用顺序模型 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. Line 1-5 导入必要的模块。

  2. Line 7 使用顺序 API 创建一个新模型。

  3. Line 9 创建一个新的 Dense 层并将其添加到模型中。 Dense 是由 Keras 提供的入口层,它以神经元或单元数(32)作为其必需参数。如果该层是第一层,那么我们也需要提供 Input Shape, (16,) 。否则,将把前一层的输出用作下一层的输入。所有其他参数都是可选的。第一个参数表示单元(神经元)数。 input_shape 表示输入数据形状。 kernel_initializer 表示要使用的初始化器。 he_uniform 函数被设置为 value。 kernel_regularizer 表示要使用的 regularizer 。None 被设置为 value。 kernel_constraint 表示要使用的约束。 MaxNorm 函数被设置为 value。 activation 表示要使用的激活。relu 函数被设置为 value。

  4. Line 10 使用 16 个单元创建第二个 Dense 层,并将 relu 设置为激活函数。

  5. Line 11 使用 8 个单元创建最终的 Dense 层。

Basic Concept of Layers

让我们了解一下层的概念,以及 Keras 对每个概念的支持方式。

Input shape

在机器学习中,文本、图像或视频等的各种输入数据将首先转换为数字数组,然后馈送到算法中。输入数字可能是单维数组、二维数组(矩阵)或多维数组。我们可以使用整数元组 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

在机器学习中,所有输入数据都将分配权重。 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))

其中,

  1. mean 表示要生成的随机数值的均值

  2. stddev 表示要生成的随机数值的标准差

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

其中,

  1. minval 表示要生成的随机数值的下限

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

其中,

  1. scale 表示缩放因子

  2. mode 表示 fan_in, fan_outfan_avg 中的任何一个数值

  3. distribution 表示 normaluniform 中的任何一个数值

VarianceScaling

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

stddev = sqrt(scale / n)

n 表示,

  1. 模式的输入单元数量 = fan_in

  2. 模式的输出单元数量 = fan_out

  3. 模式的平均输入和输出单元数量 = 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 ,然后应用均匀分布

limit = sqrt(3 / fan_in)

其中,

  1. fan_in 表示输入单元的数量

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

其中,

  1. fan_in 表示输入单元的数量

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

其中,

  1. fan_in 表示输入单元的数量。

  2. 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

在机器学习中,将在优化过程中对参数(权重)设置约束。<>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))

其中,

  1. max_value 表示上限

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

Regularizers

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

L1 Regularizer

它提供基于 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 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 and L2 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))

Activations

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

当你回想单一感知的概念时,感知器(神经元)的输出仅仅是激活函数的结果,激活函数接受所有输入与其对应权重的总和乘以其结果加上整体偏差(如果可用的话)。

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

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

linear

应用线性函数。不进行任何操作。

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

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

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

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

tanh

应用双曲正切函数。

from keras.models import Sequential
from keras.layers import Activation, Dense
model = Sequential()
model.add(Dense(512, activation = 'tanh', 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,)))

Sr.No

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,通常称为卷积神经网络 (CNN)。

9

Pooling Layer 用于对时间数据执行最大池化操作。

10

Locally connected layer 局部连接层与 Conv1D 层类似,但区别是 Conv1D 层权重是共享的,但此处的权重是不共享的。

11

Merge Layer 用于合并输入列表。

12

Embedding Layer 它在输入层中执行嵌入操作。