神经网络算法各种层的原理(基于Keras)--输入层,全连接层,卷积层,池化层,嵌入层,长短期记忆网络层等
神经网络中的不同层提供了构建各种深度学习模型所需的基础构件,承担着数据转换和特征提取的核心功能。我们可以根据具体任务的需求选择合适的层来构建模型。
1.输入层(Input Layer)
输入层(Input Layer)是神经网络的第一个层,它接收原始数据作为输入,并将其传递给后续的隐藏层或输出层进行处理。输入层不进行任何运算,其唯一任务是接收外部数据并按指定的格式传递到网络中。根据不同的应用场景,数据的格式也有所不用:
图像处理:输入层接收图像的像素矩阵或张量,通常为三维数据(宽度、高度、通道数)。
文本处理:输入层接收文本数据的向量化表示,例如词嵌入或词袋模型(Bag of Words)。
时间序列数据:输入层接收时间序列数据的特征,可以是不同时间步长的数值数据或信号数据。
表格数据:输入层接收结构化数据的每个特征值,如数值型或类别型特征。
输入层的节点数通常与数据的特征维度相同,每个节点对应一个输入特征。
在Keras中导入Input层:
from keras.layers import Input
# 定义输入层:shape=(10,) 表示每个输入样本是长度为10的向量
input1 = Input(shape=(10,))
这段代码就明确指定输入数据的维度为(None, 10),其中None表示可变批次大小(batch_size),10表示每个样本的特征长度。例如:输入数据形状需为(batch_size, 10)的二维数组,若输入不符合此形状,模型构建时会直接报错
2.嵌入层(Embedding Layer)
嵌入层(Embedding Layer)的原理是将离散数据映射为连续变量,捕捉潜在关系。在机器学习中,Embedding 主要是指将离散的高维数据(如文字、图片、音频)映射到低纬度的连续向量空间。这个过程会生成由实数构成的向量,用于捕捉原始数据的潜在搞关系和结构。
2.1使用嵌入层的必要性
需求 | 传统方法 | 嵌入层方案 | 优势 |
---|---|---|---|
处理离散数据 | One-hot编码 | 低维稠密向量 | 解决维度灾难 |
捕捉语义关系 | 手动特征工程 | 自动学习向量空间关系 | 支持迁移学习 |
计算效率 | 高维稀疏矩阵运算 | 低维稠密矩阵运算 | 加速训练 |
罕见词处理 | 无法有效表示 | 通过上下文学习合理表示 | 提升泛化能力 |
与One-hot编码的对比实验
实验表明,在相同任务下,嵌入层可使模型参数量减少90%以上,同时提升准确率。例如:
- One-hot编码:词汇表1000词 → 1000维向量
- 嵌入层:词汇表1000词 → 64维向量
附 One-hot编码原理:
One-Hot编码(独热编码)是一种将分类变量转换为二进制向量的技术,核心是通过N位二进制向量对N个类别进行独立编码。通过为每个类别分配唯一的二进制位(仅一位为1,其余为0)实现无序特征的数值化表示。
假设我们有一群学生,他们可以通过四个特征来形容,分别是:
- 性别:[“男”,“女”]
- 年级:[“初一”,“初二”,“初三”]
- 学校:[“一中”,“二中”,“三中”,“四中”]
这时候就可以用独热编码的形式来表示了,我们用采用N位状态寄存器来对N个状态进行编码,拿上面的例子来说,就是:
举个例子,用上述四个特征来描述小明同学,即“男生,初一,来自二中”,就可以采用 [1 0 1 0 0 0 1 0 0]
2.2典型应用场景
自然语言处理(NLP):词嵌入(Word2Vec、GloVe),句子/文档嵌入(BERT、Sentence-BERT)
推荐系统:将用户ID、物品ID映射为向量,计算相似度
图神经网络(GNN):节点嵌入(Node2Vec)用于社交网络分析
2.3代码示例
from keras.models import Sequential # 导入的是 Sequential 顺序模型,Sequential 模型是一个线性堆叠的神经网络模型,就像搭积木一样,你可以一层一层地按顺序添加神经网络层。
from keras.layers import Embedding # 导入嵌入层
# 构建模型
model = Sequential()
# 嵌入层:1000个词,每个词用8维向量表示,输入长度为10
model.add(Embedding(input_dim=1000, # 词汇表大小output_dim=8, # 每个词的向量维度input_length=10 # 输入序列长度
))
嵌入层输入的是input_dim,即词汇表大小(有多少个不同的词或字),output_dim: 每个词向量的维度(压缩后的维度),input_length: 每个输入序列的长度(一句话有多少个词)。这个例子中是将1000个不同的词(每个词用索引表示)映射成8维的稠密向量。
(1)input_dim:
input_dim是根据数据中所有唯一词(或字)的总数来决定的。可以通过Tokenizer文本分词和编码得到。
具体可参考:https://blog.csdn.net/Cupid_kl/article/details/151050561?spm=1011.2415.3001.5331
(2)output_dim(词向量维度)是一个超参数,需要根据经验和实验来确定:
- 小词汇表(<1000):4-16维,一般output_dim = 8
- 中等词汇表(1000-10000):16-128维,一般output_dim = 64
- 大词汇表(>10000):128-512维,一般output_dim = 256
(3)input_length 由数据预处理决定,具体来说是pad_sequences 的 maxlen 参数
from keras.preprocessing.sequence import pad_sequences# 原始序列可能长度不同
sequences = [[2, 3, 4, 1], [1, 5, 6], [2, 7, 8, 9], [9, 10, 1, 11, 12, 13]]# 决定 input_length 的关键步骤!
max_length = 6 # 你选择的固定长度
padded_sequences = pad_sequences(sequences, maxlen=max_length, padding='post')print("填充后序列形状:", padded_sequences.shape) # (4, 6)
# 这里的 6 就是 input_length
input_length的数值是统计所有序列长度后取一个合适的百分位数(如95%)。
3.卷积层(Convolutional Layer)
卷积层是一种专门用于处理具有网格状拓扑结构数据(如图像、音频、时间序列)的神经网络层。它的核心思想是通过一个叫做“卷积核”(或“滤波器”)的小窗口,在输入数据上滑动,局部地提取特征。
3.1原理
(1)核心组件:卷积核(Kernel / Filter)
一个小的、可学习的权重矩阵(例如 3x3, 5x5)。就像一个探照灯或模板,用于检测输入数据中的特定局部模式,如边缘、角点、颜色块、纹理等。
(2)工作过程:卷积操作
卷积操作可以类比为“刷油漆”或“加权平均”。
- 放置(Place):将卷积核覆盖在输入数据的左上角起始位置。
- 计算(Compute):将卷积核覆盖区域的元素与卷积核对应的权重元素逐点相乘后求和,最后再加上一个偏置(Bias) 项。这个计算结果就是输出特征图(Feature Map)在该位置的值。
输出值 = (输入区域₁ * 权重₁) + (输入区域₂ * 权重₂) + … + 偏置 - 滑动(Slide):根据设定的步长(Stride),将卷积核向右移动一定距离,重复步骤2。当滑完一行后,向下移动,继续扫描。
- 填充(Padding - 可选):为了解决卷积导致输出尺寸变小的问题,有时会在输入数据的周围填充一圈0(或其他值),这被称为“Same Padding”;不填充则称为“Valid Padding”。
(3) 输出:特征图(Feature Map)
卷积核在整个输入上滑动计算后,会生成一个二维的激活图,这就是特征图。特征图上每个点的值越高,表示该区域与卷积核所探测的模式匹配度越高。
多卷积核:一个卷积层通常使用多个卷积核(例如32个、64个)。每个卷积核独立学习检测一种特定的模式,因此一层卷积会输出多个特征图