Keras - 层

  • 简述

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

    Keras 层需要输入的形状 (input_shape)了解输入数据的结构,initializer为每个输入设置权重,最后激活器将输出转换为非线性。在这两者之间,约束限制并指定要生成的输入数据的权重范围,并且正则化器将通过在优化过程中动态地对权重应用惩罚来尝试优化层(和模型)。
    总而言之,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代表regularizer要使用的。无设置为值。
      • kernel_constraint表示要使用的约束。MaxNorm函数设置为值。
      • activation表示要使用的激活。relu 函数设置为值。
    • 行 10创建第二个Dense具有 16 个单元的层并设置relu作为激活函数。
    • 行 11创建具有 8 个单位的最终密集层。
  • 层的基本概念

    让我们了解层的基本概念以及 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模块提供了不同的功能来设置这些初始权重。某些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_in, fan_outfan_avg价值观
    • distribution代表任何一个normal或者uniform

    VarianceScaling

    它发现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使用以下公式,然后应用均匀分布
    
    
    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

    使用输入数据的均匀分布产生价值。
    
    
    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表示上限
    • 表示要应用约束的维度。例如,在 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 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))
    
    
  • 激活

    在机器学习中,激活函数是一种特殊的函数,用于检测特定神经元是否被激活。基本上,激活函数对输入数据进行非线性变换,从而使神经元能够更好地学习。神经元的输出取决于激活函数。
    回想一下单一感知的概念,感知器(神经元)的输出只是激活函数的结果,它接受所有输入的总和乘以其相应的权重加上总体偏差(如果有的话)。
    
    
    result = Activation(SUMOF(input * weight) + bias)
    
    
    因此,激活函数在模型的成功学习中起着重要作用。Keras 在激活模块中提供了很多激活功能。让我们了解模块中可用的所有激活。

    行ar

    应用线性函数。什么也没做。
    
    
    from keras.models import Sequential 
    
    from keras.layers import Activation, Dense 
    
    
    
    model = Sequential() 
    
    model.add(Dense(512, activation = '行ar', 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

    应用硬 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
    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
    它在输入层执行嵌入操作。