Keras – 层
正如前面所学,Keras层是Keras模型的主要构建模块。每一层接收输入信息,进行一些计算,最后输出转换后的信息。一个层的输出将流入下一个层作为其输入。让我们在本章中了解关于层的完整细节。
简介
Keras层需要 ** 输入的形状(input_shape)** 来理解输入数据的结构, ** 初始化器为** 每个输入设置权重,最后激活器将输出转化为非线性。在这两者之间,约束条件限制并指定了要生成的输入数据的权重范围,正则器将试图通过在优化过程中动态地对权重进行惩罚来优化该层(和模型)。
总而言之,Keras层需要以下最小的细节来创建一个完整的层。
- 输入数据的形状
- 该层中的神经元/单元的数量
- 初始化器
- 正则器
- 限制条件
- 激活
让我们在下一章中了解基本概念。在理解基本概念之前,让我们使用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)作为它的必要参数。如果该层是第一层,那么我们也需要提供 输入形状,(16,) 。否则,前一层的输出将被用作下一层的输入。所有其他参数都是可选的。
- 第一个参数代表单元(神经元)的数量。
-
input_shape 代表输入数据的形状。
-
kernel_initializer 代表要使用的初始化器, he_uniform 函数被设置为值。
-
kernel_regularizer 代表要使用的 正则器 。None被设置为值。
-
kernel_ constraint_ 表示使用的约束条件, MaxNorm 函数被设置为值。
-
activation 代表要使用的激活,relu函数被设置为值。
- 第一个参数代表单元(神经元)的数量。
-
第10 行用16个单元创建第二个 密集 层,并设置 relu 为激活函数。
-
第11 行创建最后的密集层,有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) 三维矩阵有三个集合的4×2矩阵(两行和四列)。
>>> 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 代表模型内核的初始化器。
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))
常数
为所有输入数据生成一个由用户指定的常数(如 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)
)
其中, 值 代表常量值
随机正态
使用输入数据的正态分布生成数值。
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 代表要生成的随机值的上限。
截断的正态分布
使用输入数据的截断正态分布生成数值。
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_out 和 fan_avg 中的任何一个值
-
distribution ** 代表 **正态分布 或 均匀分布 的任何一种
方差缩放
它使用以下公式找到正态分布的 stddev 值,然后使用正态分布找到权重、
stddev = sqrt(scale / n)
其中 n 代表、
- 模式的输入单位数 = fan_in
-
模式的输出单位数 = fan_out
-
模式的输入和输出单位的平均数 = 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 ,然后应用均匀分布
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
使用输入数据的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 = 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))
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的正则化。
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在激活模块中提供了很多激活函数。让我们来学习该模块中的所有激活功能。
线性
应用线性函数。什么都不做。
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 | 剔除层 剔除 层是机器学习中的一个重要概念。 |
3 | 扁平层 扁平层 用于扁平化输入。 |
4 | 重塑图层 重塑图层 用于改变输入的形状。 |
5 | Permute Layers Permute 也用于用图案改变输入的形状。 |
6 | RepeatVector Layers RepeatVector 用于重复输入设定的次数,n次。 |
7 | Lambda层 Lambda 用于使用表达式或函数来转换输入数据。 |
8 | 卷积层 Keras包含很多层,用于创建基于卷积的ANN,通常被称为 卷积神经网络(CNN)。 |
9 | 池化层 它用于对时态数据进行最大池化操作。 |
10 | 局部连接 层 局部连接层类似于Conv1D层,但区别在于Conv1D层的权重是共享的,而这里的权重是不共享的。 |
11 | 合并层 它用于合并输入的列表。 |
12 | 嵌入 层 它在输入层执行嵌入操作。 |