Keras - 层



如前所述,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 表示要使用的正则化器。None 被设置为值。

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

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

  • 第 10 行 创建第二个具有 16 个单元的Dense 层,并将relu 设置为激活函数。

  • 第 11 行 创建具有 8 个单元的最终 Dense 层。

层的基本概念

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

输入形状

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

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

初始化器

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

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

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

常数

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

随机正态分布

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

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

随机均匀分布

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

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 表示要生成的随机值的较高边界

截断正态分布

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

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

方差缩放

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

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_outfan_avg 值中的任何一个

  • distribution 表示normaluniform 中的任何一个

方差缩放

它使用以下公式找到正态分布的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 表示输入单元的数量。

正交

生成一个随机正交矩阵。

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

约束

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

非负

约束权重为非负。

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 表示要在层中使用的约束。

单位范数

约束权重为单位范数。

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

最大范数

约束权重为小于或等于给定值的范数。

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 表示第三维度

最小最大范数

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

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

其中,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,)))
序号 层 & 描述
1

密集层

密集层是常规的全连接神经网络层。

2

Dropout层

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

3

扁平化层

Flatten用于将输入扁平化。

4

重塑层

Reshape用于改变输入的形状。

5

置换层

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

6

重复向量层

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

7

Lambda层

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

8

卷积层

Keras包含许多用于创建基于卷积的ANN的层,通常称为卷积神经网络(CNN)

9

池化层

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

10

局部连接层

局部连接层类似于Conv1D层,但不同之处在于Conv1D层的权重是共享的,而这里权重是不共享的。

11

合并层

它用于合并输入列表。

12

嵌入层

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

广告

© . All rights reserved.