Keras深度学习入门-2

文章详细介绍了Keras中的核心网络层,包括Dense层、激活函数、Dropout层防止过拟合,以及卷积层(Conv1D,Conv2D,Conv3D)和池化层的概念、参数和作用。此外,还提到了激活函数如ReLU及其变体,以及Softmax在多分类中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Keras 层共用API

Keras 层分类

常见核心网络层

Dense层

Dense参数详解

Activation层

Dropout层

过拟合

造成过拟合的原因

Dropput参数详解

Flatten层

Input层

Reshape层

常见卷积层

什么是卷积

卷积公式

Conv1D

参数详解

Conv2D

参数详解

Conv3D

池化层

概念

作用

类型

MaxPooling1D

参数详解

MaxPooling2D

参数详解

MaxPooling3D

参数详解:

AveragePooling1D

参数详解

高级激活层

非饱和激活函数

ReLU

ReLU的缺点

ELUs

Leaky ReLUs

PReLU

Softmax概念

Softmax公式

Softmax作用

高级激活函数API

参数详解


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 标准化的轴。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值