目录
Keras 层共用API
- layer.get_weights(): 以Numpy矩阵的形式返回层的权重。
- layer.set_weights(weights): 从Numpy矩阵中设置层的权重(与get_weights的输出形状相同)。
- layer.get_config(): 返回包含层配置的字典。
# 导入Dense层 from keras.layers import Dense layer = Dense(32) # 获得层的配置 config = layer.get_config() # 查看配置 config
Keras 层分类
- 核心网络层 Core
- 卷积层 Pooling
- 局部链接层 Locally-connected
- 循环层 Recurrent
- 嵌入层 Embedding
- 融合层 Merge
- 高级激活层 Advanced Activations
- 标准化层 Normalization
- 噪声层 Noise
- 层封装器 Wrappers
- 自己编写的层 Own
常见核心网络层
- Dense
- Activation
- Dropout
- Flatten
- Input
- Reshape
Dense层
Dense层就是全连接层,Dense 实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量
# 从layers中导入全连接层
from keras.layers import Dense
# 实例化全连接层
Dense(units=10, activation=None, use_bias=True, kernel_initializer='glorot_uniform',
bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
Dense参数详解
- units: 正整数,输出空间维度。
- activation: 激活函数,若不指定,则不使用激活函数
- use_bias: 布尔值,该层是否使用偏置向量。
- kernel_initializer: kernel 权值矩阵的初始化器
- bias_initializer: 偏置向量的初始化器
- kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数
- bias_regularizer: 运用到偏置向的的正则化函数
- activity_regularizer: 运用到层的输出的正则化函数
- kernel_constraint: 运用到 kernel 权值矩阵的约束函数
- bias_constraint: 运用到偏置向量的约束函数
# 从models包导入序贯模型
from keras.models import Sequential
# 实例化模型
model = Sequential()
# 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
# 其输出数组的尺寸为 (*, 32)
# (*,16)第一个参数表示样本数量,第二个参数表示样本特征数(权重参数)
# (16,)表示一维数据
# 32 表示给层上的神经元数量
model.add(Dense(32, input_shape=(16,)))
# 在第一层之后,你就不再需要指定输入的尺寸了
model.add(Dense(32))
Activation层
将激活函数用在输出,输入和输出尺寸相同,常见的激活函数有relu,tanh,softmax,sigmoid等
import keras
## 实例化激活函数
keras.layers.Activation("relu")
Dropout层
包括在训练中每次更新时, 将输入单元的按比率随机设置为 0, 这有助于防止过拟合

过拟合
过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。
造成过拟合的原因
- 训练数据集样本单一,样本不足。如果训练样本只有负样本,然后那生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型。
- 训练数据中噪声干扰过大。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
- 模型过于复杂。模型太复杂,已经能够“死记硬背”记下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的模型都有稳定的输出。模型太复杂是过拟合的重要因素。
keras.layers.Dropout(rate=0.5, noise_shape=None, seed=None)
Dropput参数详解
- rate: 在 0 和 1 之间浮动。需要丢弃的输入比例。
- noise_shape: 1D 整数张量,表示将与输入相乘的二进制 dropout 掩层的形状。
例如,如果你的输入尺寸为(batch_size, timesteps, features),然后你希望 dropout 掩层在所有时间步都是一样的,
你可以使用 noise_shape=(batch_size, 1, features)。 - seed: 一个作为随机种子的整数。
Flatten层
将输入展平。不影响批量大小
# 创建序贯模型
model = Sequential()
# 64: 输出空间的维度,就是卷积中滤波器的数量
# 3:卷积的高度和宽度
# 3:移动的步长
# same:在移动的时候如果输入矩阵的列或者行长度不够,就用0来补齐
# input_shape:(高度,宽度,通道数)
model.add(keras.layers.Conv2D(64, 3, 3,
border_mode='same',
input_shape=(32, 32, 3)))
# 现在:model.output_shape == (None, 64, 32, 32)
model.add(keras.layers.Flatten())
# 现在:model.output_shape == (None, 65536)
Input层
Input() 用于实例化 Keras 张量
# 导入模型
from keras.models import Model
# 这是 Keras 中的一个逻辑回归
x = keras.engine.topology.Input(shape=(32,))
# x是上一层的输出,是这一层的输入
y = Dense(16, activation='softmax')(x)
# 构建模型
model = Model(x, y)
Reshape层
将输入重新调整为特定的尺寸
# 作为 Sequential 模型的第一层
model = Sequential()
model.add(keras.layers.Reshape((3, 4), input_shape=(12,)))
# model.output_shape == (None, 3, 4)
# `None` 是批表示的维度
# 作为 Sequential 模型的中间层
model.add(keras.layers.Reshape((6, 2)))
# model.output_shape == (None, 6, 2)
# 还支持使用 `-1` 表示维度的尺寸推断
model.add(keras.layers.Reshape((-1, 2, 2)))
# model.output_shape == (None, 3, 2, 2)
常见卷积层
- Conv1D
- Conv2D
- Conv3D
什么是卷积
所谓卷积,可以从函数上这么理解,本质上就是先将一个函数翻转,然后进行滑动叠加。
在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加
卷积公式
-
连续形式

-
离散形式

可以看到先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。 然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。
Conv1D
1D 卷积层 (例如时序卷积)。 该层创建了一个卷积核,该卷积核以 单个空间(或时间)维上的层输入进行卷积, 以生成输出张量。
# keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1,
# activation=None, use_bias=True, kernel_initializer='glorot_uniform',
# bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
# activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
参数详解
- filters: 整数,输出空间的维度(即卷积中滤波器的输出数量)。
- kernel_size: 一个整数,或者单个整数表示的元组或列表,指明 1D 卷积窗口的长度。
-
strides: 一个整数,或者单个整数表示的元组或列表,指明卷积的步长。 指定任何 stride 值 != 1 与指定 dilation_rate 值 != 1 两者不兼容。
-
padding:
"valid" 表示「不填充」。
"same" 表示填充输入以使输出具有与原始输入相同的长度。
"causal" 表示因果(膨胀)卷积。 -
dilation_rate: 一个整数,或者单个整数表示的元组或列表,指定用于膨胀卷积的膨胀率。
- activation: 要使用的激活函数
- use_bias: 布尔值,该层是否使用偏置向量。
- kernel_initializer: kernel 权值矩阵的初始化器
- bias_initializer: 偏置向量的初始化器
- kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数
- bias_regularizer: 运用到偏置向量的正则化函数
- activity_regularizer: 运用到层输出(它的激活值)的正则化函数
- kernel_constraint: 运用到 kernel 权值矩阵的约束函数
- bias_constraint: 运用到偏置向量的约束函数
Conv2D
2D 卷积层 (例如对图像的空间卷积)。 该层创建了一个卷积核, 该卷积核对层输入进行卷积, 以生成输出张量。
In [26]:
# keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
# dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform',
# bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
# activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
参数详解
- data_format: 字符串
channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。
channels_last 对应输入尺寸为 (batch, height, width, channels),
channels_first 对应输入尺寸为 (batch, channels, height, width)。
它默认为从 Keras 配置文件 ~/.keras/keras.json 中找到的 image_data_format 值。如果你从未设置它,将使用 “channels_last”。
Conv3D
3D 卷积层 (例如立体空间卷积)。 该层创建了一个卷积核, 该卷积核对层输入进行卷积。
In [27]:
# keras.layers.Conv3D(filters, kernel_size, strides=(1, 1, 1), padding='valid', data_format=None,
# dilation_rate=(1, 1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform',
# bias_initializer='zeros',kernel_regularizer=None, bias_regularizer=None,
# activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
- data_format: 字符串,
channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。
channels_last 对应输入尺寸为: (batch, spatial_dim1, spatial_dim2, spatial_dim3, channels),
channels_first 对应输入尺寸为: (batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)。
它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用 “channels_last”。
池化层
概念
pooling,又名池化,思想来自于视觉机制,是对信息进行抽象的过程。
作用
- 增大感受野(可以理解为提高高度可以看到更多的视野)
- 平移不变性(pooling不断地抽象了区域的特征而不关心位置,所以pooling一定程度上增加了平移不变性)
- 降低优化难度和参数(全局池化更是可以大大降低模型的参数量和优化工作量)
类型
- 最大池化
如果选取区域最大值(max pooling),则能更好保留纹理特征

- 平均池化
如果选取区域均值(mean pooling),往往能保留整体数据的特征,较好的突出背景信息

MaxPooling1D
对于时序数据(1维数据)的最大池化
In [29]:
# keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid')
参数详解
- pool_size: 整数,最大池化的窗口大小。
- strides: 整数,或者是 None。作为缩小比例的因数。 例如,2 会使得输入张量缩小一半。 如果是 None,那么默认值是 pool_size。
- padding: "valid" 或者 "same" 。
MaxPooling2D
对于空域数据(2维数据)的最大池化
In [31]:
# keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
参数详解
- pool_size: 整数,或者 2 个整数元组,(垂直方向,水平方向)缩小比例的因数。
(2,2)会把输入张量的两个维度都缩小一半。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
MaxPooling3D
对3D(空域,或时空域)数据的最大池化
In [32]:
# keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)
参数详解:
- pool_size: 3 个整数的元组,缩小(维度 1,维度 2,维度 3)比例的因数。
(2, 2, 2) 会把 3D 输入张量的每个维度缩小一半。
AveragePooling1D
对于时序数据的平均池化
In [34]:
# keras.layers.AveragePooling1D(pool_size=2, strides=None, padding='valid')
参数详解
- pool_size: 整数,平均池化的窗口大小
同理AveragePooling2D和AveragePooling3D都是进行平均池化,只不过数据的维度不同。
如果再前面加上Global,那么池化的作用域就是全局,比如GlobalAveragePooling1D,GlobalMaxPooling2D等
高级激活层
- LeakyReLU
- PReLU
- ELU
- Softmax
非饱和激活函数
sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:
- 首先,“非饱和激活函数”能解决所谓的“梯度消失”问题。
- 其次,它能加快收敛速度。
ReLU
ReLU函数代表的的是“修正线性单元”,它是带有卷积图像的输入x的最大函数(x,o)。ReLU函数将矩阵x内所有负值都设为零,其余的值不变
ReLU的缺点
训练的时候很”脆弱”,很容易就”die”了 例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0。如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了
ELUs
ELUs是“指数线性单元”,它试图将激活函数的平均值接近零,从而加快学习的速度。同时,它还能通过正值的标识来避免梯度消失的问题。

Leaky ReLUs
ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。

PReLU
PReLU可以看作是Leaky ReLU的一个变体。在PReLU中,负值部分的斜率是根据数据来定的,而非预先定义的。

Softmax概念
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类
Softmax公式
假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是

代码表示
def softmax(x):
exps = np.exp(x)
return exps / np.sum(exps)
假如 softmax 的输入是:
[1.0,2.0,3.0]
softmax 的结果是:
[0.09,0.24,0.67]
Softmax作用
- 所有的值都是 [0, 1] 之间的(因为概率必须是 [0, 1])
- 所有的值加起来等于 1
高级激活函数API
In [36]:
# keras.layers.LeakyReLU(alpha=0.3)
# keras.layers.PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)
# keras.layers.ELU(alpha=1.0)
# keras.layers.Softmax(axis=-1)
参数详解
- alpha: 负因子的尺度
- alpha_initializer: 权重的初始化函数。
- alpha_regularizer: 权重的正则化方法。
- alpha_constraint: 权重的约束。
- shared_axes: 激活函数共享可学习参数的轴。
- theta: float >= 0。激活的阈值位。
- axis: 整数,应用 softmax 标准化的轴。
文章详细介绍了Keras中的核心网络层,包括Dense层、激活函数、Dropout层防止过拟合,以及卷积层(Conv1D,Conv2D,Conv3D)和池化层的概念、参数和作用。此外,还提到了激活函数如ReLU及其变体,以及Softmax在多分类中的应用。

被折叠的 条评论
为什么被折叠?



