BiLSTM神经网络:从原理到实战应用

Karto_SLAM研究 今天开始试试karto进行建图。karto是一个项目,后端是SPA(Sparse Pose Adjustment),前端是Scan Matcher。 相关链接: https://github.com/ros-perception/open_karto https://github.com/ros-perception/slam_karto https://github.com/ros-perception/sparse_bundle_adjustment 参考文献: Konolige, Kurt 阅读详情

1. BiLSTM到底是什么?为什么它比普通LSTM更“聪明”?

大家好,我是老张,在AI这个圈子里摸爬滚打了十几年,从早期的简单神经网络玩到现在的大模型,可以说见证了各种技术的起起落落。今天想和大家深入聊聊一个在序列数据处理上经久不衰的“老将”——双向长短期记忆网络,也就是BiLSTM。你可能听说过LSTM,它解决了传统RNN记性差、容易“失忆”的问题。但BiLSTM更绝,它让模型学会了“瞻前顾后”,理解能力直接上了一个台阶。

想象一下你在读一本侦探小说。如果只允许你从前往后读,在读到一半的时候,你对某个角色的判断可能完全基于他之前的行为。但如果你已经读完了全书,再回头看中间的情节,你对这个角色的动机、他每一句话的深意,理解会透彻得多。BiLSTM干的就是这个事:它用两个LSTM,一个从左往右读句子(正向),一个从右往左读句子(反向),然后把两者的理解结合起来。这样,模型在分析句子中任何一个词的时候,都同时知道它左边和右边发生了什么,捕捉到的上下文信息就完整了。

我最早在做一个舆情分析项目时踩过坑。当时用的就是单向LSTM,模型判断“这个产品不算太差”这句话的情感时,因为只看到了“不算太”,它可能倾向于中性或轻微正面。但加上反向LSTM后,模型能同时看到后面的“差”,就能更准确地判断出这其实是个委婉的负面评价。这个改进让我们的准确率提升了将近5个百分点,效果立竿见影。所以,BiLSTM的核心优势就在于这种双向的上下文感知能力,这在自然语言处理、语音识别、基因序列分析等需要理解完整语境的任务中,简直是神器。

2. 拆解BiLSTM:门控机制与双向信息流是如何协作的?

要搞懂BiLSTM,咱们得先把它拆开,看看里面的两个“核心员工”——正向LSTM和反向LSTM——是怎么工作的,以及它们手里的“门控”工具。

2.1 LSTM的门控:三个关键“阀门”

LSTM之所以能记住长期信息,全靠它精巧的门控结构。你可以把它想象成一个有记忆的传送带车间,车间里有三个关键的阀门控制器:

  1. 遗忘门:决定从长期记忆单元中扔掉哪些旧信息。它查看当前的输入和短时记忆,输出一个0到1之间的数给每个长期记忆单元。0代表“全忘掉”,1代表“完全保留”。
  2. 输入门:决定当前哪些新信息值得存入长期记忆单元。它由两部分组成,一部分是“输入门层”决定更新哪些值,另一部分是“候选值层”生成新的候选值。
  3. 输出门:决定基于当前的长期记忆,输出什么样的短时记忆给下一个时间步。它控制着长期记忆对当前输出的影响程度。

用代码来看可能更直观。虽然一个LSTM单元的内部计算涉及矩阵运算,但概念上可以这么理解它的关键步骤(以下为示意逻辑):

# 伪代码示意LSTM在一个时间步的计算流程
def lstm_cell(prev_long_memory, prev_short_memory, current_input):
    # 1. 计算遗忘门:决定丢弃什么
    forget_gate = sigmoid(W_f * [prev_short_memory, current_input] + b_f)

    # 2. 计算输入门和候选值:决定存储什么新信息
    input_gate = sigmoid(W_i * [prev_short_memory, current_input] + b_i)
    candidate_values = tanh(W_c * [prev_short_memory, current_input] + b_c)

    # 3. 更新长期记忆单元
    current_long_memory = forget_gate * prev_long_memory + input_gate * candidate_values

    # 4. 计算输出门:决定输出什么
    output_gate = sigmoid(W_o * [prev_short_memory, current_input] + b_o)

    # 5. 生成当前短时记忆(即隐藏状态)
    current_short_memory = output_gate * tanh(current_long_memory)

    return current_long_memory, current_short_memory

正是这三个门的协同工作,让LSTM能够有选择地记住重要的、忘记无关的,从而克服了梯度消失问题。

2.2 双向的魔力:1+1>2

单向LSTM就像一个人只能听故事的开头,然后一边听一边猜后续。而BiLSTM是两个人,一个从故事开头听到结尾,另一个从故事结尾倒着听到开头,最后两人一合计,对故事中每个情节的理解都更全面。

在模型结构上,BiLSTM就是简单粗暴地把两个独立的LSTM层堆叠起来,但处理数据的方向相反。对于一个输入序列 [词1, 词2, 词3, ..., 词T]:

  • 正向LSTM层:按 词1 -> 词2 -> ... -> 词T 的顺序处理,生成一系列隐藏状态 [h1_forward, h2_forward, ..., hT_forward]。
  • 反向LSTM层:按 词T -> ... -> 词2 -> 词1 的顺序处理,生成另一系列隐藏状态 [hT_backward, ..., h2_backward, h1_backward]。

最后,在每一个时间步 t,BiLSTM的输出是把正向和反向在这个位置的隐藏状态连接起来:output_t = [h_t_forward, h_t_backward]。这个拼接起来的向量,就同时包含了词 t 之前和之后的所有上下文信息。

我常用一个表格来对比单向和双向在处理信息上的差异:

特性单向LSTM双向LSTM (BiLSTM)
信息流方向仅从前向后前向 + 后向,两个独立流
上下文视野仅左侧(过去)上下文完整的双侧上下文
计算复杂度较低约为单向的2倍
典型适用任务语言模型(预测下一个词)、实时流处理句子级分类、命名实体识别、机器翻译(编码器)
输出表示每个时间步的隐藏状态 h_t每个时间步拼接的状态 [h_t_forward, h_t_backward]

在实际搭建模型时,我们几乎不需要手动实现双向逻辑,主流框架如TensorFlow/Keras和PyTorch都提供了 Bidirectional 包装器,用起来非常方便。

3. 手把手实战:用BiLSTM构建一个文本情感分类器

光说不练假把式,咱们直接上代码,用一个完整的例子看看BiLSTM怎么用。这次我们做一个中文情感分类任务,判断一条评论是正面还是负面。我会把每一步的细节和踩过的坑都讲清楚。

3.1 环境准备与数据预处理

首先,确保你的环境里有TensorFlow或PyTorch。我这里用Keras API,因为它对新手最友好。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Bidirectional, LSTM, Dense, Dropout
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
import pandas as pd

# 1. 准备示例数据(这里用模拟数据,实战中请加载你自己的数据集,如中文酒店评论)
# 假设我们有一些评论和标签(1=正面,0=负面)
texts = [
    "这部电影真是太精彩了,演员演技在线,剧情扣人心弦。",
    "完全浪费时间,故事老套,看得我昏昏欲睡。",
    "产品包装很好,送货速度快,效果符合预期。",
    "服务质量很差,客服态度恶劣,不会再买了。",
    "虽然有点小贵,但品质对得起价格,推荐。",
    "非常失望,实物与图片严重不符,材质廉价。"
]
labels = [1, 0, 1, 0, 1, 0]  # 对应的情感标签

数据预处理是NLP任务成败的关键。对于中文,你需要先分词。这里我用一个简单的空格分隔模拟分词结果(实战中请使用jieba等分词工具)。

# 模拟分词后的结果(实际应用需使用jieba.cut)
texts_segmented = [
    "这 部 电影 真是 太 精彩 了 , 演员 演技 在线 , 剧情 扣人心弦 。",
    "完全 浪费 时间 , 故事 老套 , 看得 我 昏昏欲睡 。",
    "产品 包装 很好 , 送货 速度 快 , 效果 符合 预期 。",
    "服务 质量 很 差 , 客服 态度 恶劣 , 不会 再 买 了 。",
    "虽然 有点 小贵 , 但 品质 对得起 价格 , 推荐 。",
    "非常 失望 , 实物 与 图片 严重 不符 , 材质 廉价 。"
]

# 2. 文本向量化:将词语转换成数字索引
vocab_size = 1000  # 词汇表大小,根据你的数据调整
embedding_dim = 128  # 词向量维度
max_length = 20  # 每条评论最大长度(短于则填充,长于则截断)
oov_token = "<UNK>"  # 用于替换未在词汇表中的词

tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_token)
tokenizer.fit_on_texts(texts_segmented)  # 构建词汇表
word_index = tokenizer.word_index
print(f"词汇表大小: {len(word_index)}")

# 将文本转换为数字序列
sequences = tokenizer.texts_to_sequences(texts_segmented)
# 进行填充/截断,使所有序列长度一致
padded_sequences = pad_sequences(sequences, maxlen=max_length, padding='post', truncating='post')

print("原始文本:", texts_segmented[0])
print("数字序列:", sequences[0])
print("填充后序列:", padded_sequences[0])
print("序列形状:", padded_sequences.shape)

注意:padding='post' 表示在序列末尾填充,truncating='post' 表示从末尾截断。对于BiLSTM,填充位置在末尾是常见的,因为不影响前面的实际内容。词向量维度 embedding_dim 是个重要参数,太小表达能力不足,太大容易过拟合且训练慢,128或256对于中等任务是个不错的起点。

3.2 构建与训练BiLSTM模型

数据准备好了,现在来搭建模型的核心部分。我们将使用 Bidirectional 包装器来轻松创建双向LSTM层。

# 3. 构建BiLSTM模型
model = Sequential([
    # 嵌入层:将整数索引映射为密集向量
    Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=max_length),
    # 第一层双向LSTM:return_sequences=True 表示返回每个时间步的输出,为下一层准备
    Bidirectional(LSTM(units=64, return_sequences=True, dropout=0.2, recurrent_dropout=0.2)),
    # 第二层双向LSTM:最后一层通常只返回最后时间步的输出(或全局信息)
    Bidirectional(LSTM(units=32, dropout=0.2, recurrent_dropout=0.2)),
    # 全连接层进行特征整合
    Dense(units=16, activation='relu'),
    Dropout(0.5),  # 丢弃层防止过拟合
    # 输出层:二分类,使用sigmoid激活函数
    Dense(units=1, activation='sigmoid')
])

# 编译模型
model.compile(
    optimizer='adam',  # 自适应学习率优化器,新手首选
    loss='binary_crossentropy',  # 二分类交叉熵损失
    metrics=['accuracy']  # 评估指标
)

# 打印模型结构摘要
model.summary()

运行 model.summary() 你会看到各层的输出形状。特别关注 Bidirectional 层,它的输出维度是 units * 2,因为它拼接了正向和反向的LSTM输出。

接下来,划分训练集和验证集,并开始训练。由于我们是极小的示例数据,这里直接训练,实战中一定要划分验证集来监控过拟合。

# 将数据和标签转为numpy数组
X = np.array(padded_sequences)
y = np.array(labels)

# 4. 训练模型
print("开始训练...")
history = model.fit(
    X, y,
    epochs=30,  # 训练轮数,小数据可能很快收敛
    batch_size=2,  # 批大小,根据你的GPU内存调整
    verbose=1  # 显示训练进度条
)

# 5. 进行预测
test_texts = ["这个手机电池续航超长,非常满意。", "体验糟糕,系统卡顿严重。"]
# 对新文本进行同样的分词和预处理(此处省略分词步骤,假设已分词)
test_segmented = ["这个 手机 电池 续航 超长 , 非常 满意 。", "体验 糟糕 , 系统 卡顿 严重 。"]
test_sequences = tokenizer.texts_to_sequences(test_segmented)
test_padded = pad_sequences(test_sequences, maxlen=max_length, padding='post', truncating='post')

predictions = model.predict(test_padded)
print("\n预测结果:")
for text, pred in zip(test_texts, predictions):
    sentiment = "正面" if pred > 0.5 else "负面"
    print(f"评论:'{text}' -> 情感:{sentiment} (置信度:{pred[0]:.4f})")

在这个例子中,我加入了 Dropout 和 recurrent_dropout。这是防止BiLSTM过拟合的关键技巧,尤其是当你的训练数据量不大时。dropout 作用于输入的连接,recurrent_dropout 作用于循环连接,后者对RNN系列模型特别重要。

4. 超越基础:BiLSTM的进阶技巧与实战调优指南

模型跑起来只是第一步,要想让它真正好用,还得进行细致的调优。根据我多年的项目经验,以下几个方向是提升BiLSTM性能的关键。

4.1 层数与结构设计:不是越深越好

很多人觉得,既然BiLSTM好,那我就堆叠它三四层。但事实上,对于许多任务,1到2层的BiLSTM已经足够。更深层的BiLSTM会显著增加训练难度和计算成本,而且容易导致梯度在反向传播时变得不稳定或消失。

  • 单层BiLSTM:适用于句子分类、简单序列标注。输出可以直接接全连接层做分类。
  • 双层堆叠BiLSTM:适用于更复杂的任务,如机器翻译的编码器、需要深层语义理解的场景。第一层设置 return_sequences=True,将每个时间步的输出传给第二层。
  • 结合CNN:一种强大的模式是使用一维卷积层(Conv1D)在BiLSTM之前。CNN可以高效地提取局部n-gram特征,然后由BiLSTM捕捉长距离依赖。这种 CNN-BiLSTM 结构在文本分类上表现非常出色。
# 示例:CNN-BiLSTM混合结构
from tensorflow.keras.layers import Conv1D, GlobalMaxPooling1D

model_hybrid = Sequential([
    Embedding(vocab_size, embedding_dim, input_length=max_length),
    Conv1D(filters=64, kernel_size=3, activation='relu'),  # 提取3-gram特征
    Bidirectional(LSTM(64, return_sequences=True)),
    GlobalMaxPooling1D(),  # 全局最大池化,取每个特征通道的最大值
    Dense(32, activation='relu'),
    Dense(1, activation='sigmoid')
])

4.2 注意力机制:让模型学会“聚焦”

即使有了双向上下文,序列中不同部分的重要性也是不同的。注意力机制可以让BiLSTM学会在做出判断时,动态地关注输入序列中更相关的部分。比如在情感分析中,模型应该更关注“精彩”、“糟糕”、“推荐”这样的情感词,而不是“这个”、“的”、“了”之类的虚词。

在BiLSTM后添加注意力层并不复杂。虽然Keras没有内置的标准注意力层,但我们可以自定义或使用 return_sequences=True 获取所有时间步的输出后,接一个 GlobalAveragePooling1D 或 GlobalMaxPooling1D,这可以看作是一种简单的“硬”注意力。更高级的做法是实现一个 Attention 层,计算每个时间步隐藏状态的加权和。

# 一种简单的加权注意力思路(示意性代码)
# 假设 bi_lstm_output 的形状为 (batch_size, timesteps, features)
# 我们可以学习一个权重向量,对每个时间步的特征进行加权求和
attention_weights = tf.nn.softmax(tf.linspace.Dense(1)(bi_lstm_output), axis=1)
context_vector = tf.reduce_sum(attention_weights * bi_lstm_output, axis=1)
# 然后用 context_vector 接全连接层分类

4.3 超参数调优实战清单

调参是个经验活,这里我列一个清单,你可以按顺序尝试调整:

  1. 词向量维度 (embedding_dim):从128开始尝试,增加到256或512看验证集效果是否有提升。如果数据量小,维度不宜过大。
  2. LSTM单元数 (units):这是最重要的参数之一。常见起点是64或128。如果模型欠拟合(训练集准确率也低),可以增加到256甚至512。如果过拟合,则减少单元数或加强Dropout。
  3. Dropout率:包括嵌入层后的SpatialDropout1D、LSTM层的dropout和recurrent_dropout、全连接层前的Dropout。从0.2到0.5开始尝试。recurrent_dropout对防止过拟合非常有效,但会大幅增加训练时间。
  4. 优化器与学习率:Adam 是默认的好选择。如果训练后期震荡,可以尝试 Adam 并搭配学习率衰减,或者换用 RMSprop。
  5. 序列最大长度 (max_length):覆盖大部分样本(如95%)的长度即可,太短损失信息,太长增加计算负担和填充噪声。可以分析训练数据长度的百分位数来确定。
  6. 批大小 (batch_size):在GPU内存允许范围内,使用较大的批大小(如32、64)通常能使训练更稳定。但有些研究发现,小批量(如16)有时能带来更好的泛化性能。

调参时务必使用验证集来评估,而不是只看训练集准确率。记录每次实验的参数和结果,慢慢你就能找到感觉。

4.4 处理长序列与效率优化

BiLSTM的一个固有缺点是计算效率较低,尤其是处理长序列时。因为其顺序计算特性,无法像Transformer那样并行化。针对长序列,可以考虑:

  • 分层或分块:将超长文档先分成句子或段落,分别用BiLSTM编码,再对段落表示进行聚合。
  • 使用CuDNN LSTM:如果你在使用TensorFlow-GPU,确保 LSTM 层使用的是高度优化的CuDNN实现(默认就是)。在PyTorch中,使用 torch.nn.LSTM 并设置 batch_first=True 也能获得良好优化。
  • 梯度裁剪:在编译模型时设置 clipvalue 或 clipnorm,防止训练过程中梯度爆炸。
    optimizer = tf.keras.optimizers.Adam(clipvalue=1.0)  # 将梯度裁剪到[-1.0, 1.0]区间
    

我在处理一个工业设备传感器时序数据预测项目时,序列长度达到上千。直接使用BiLSTM训练非常慢。后来我们采用了先使用一维卷积进行下采样,压缩序列长度,再输入BiLSTM的策略,在保证精度的同时将训练速度提升了3倍。这提醒我们,没有银弹,最好的结构往往是针对具体任务设计的混合结构。

BiLSTM作为序列建模的经典支柱,其思想——利用双向上下文和门控记忆——至今仍在许多最新模型中发光发热。理解它、用好它,是深入NLP和时序分析领域非常扎实的一步。希望这些原理剖析和实战经验能帮你少走弯路,直接上手解决实际问题。如果在具体项目中遇到奇怪的损失震荡或者准确率上不去,不妨回头检查一下数据预处理是否干净,或者试试调整一下Dropout率和网络深度,往往会有意想不到的效果。

BiLSTM原理、优化及代码实现(时序预测/分类/回归拟合,Matlab) 同样,BiLSTM也存在一定可进行优化选择的超参数,若采取经验法或试错法,则有不能获取最优取值组合、时间成本高等问题。优化算法通过对超参数组合的随机生成与更新,能够更快速地获取优解,不失为一种应用方法。前面的文章中KAU已经介绍过很多种优化算法及其改进策略,本文中我也会应用这些算法优化BiLSTM,下面简单罗列一些优化算法方便一些朋友查看相应原理。 阅读详情

相关推荐

一文理解BILSTM神经网络

双向长短期记忆网络(BiLSTM,Bidirectional Long Short-Term Memory)**是一种特殊的循环神经网络(RNN),它在自然语言处理(NLP)、时间序列分析等领域具有广泛应用。BiLSTM通过在两个方向上处理输入序列,能够更好地捕捉序列中每个时间步长的上下文信息。

m0_69378371的博客 2685

Karto_slam框架与代码解析

Karto_slam框架与代码解析1、Karto_slam概况介绍2、karto_slam具体介绍1、scan-matcher2、添加顶点和边的信息3、回环检测4、优化求解3、关于Karto_slam简单的总结正文如下1、Karto_slam概况 上面两张图主要是对Karto_slam的一个整体框架,从2016年slam的大综述中,可以看到这其实就是一般slam的一个基本框架,这里指的是带优

qq_24893115的博客 1万+

BiLSTM介绍及中文命名实体识别应用

What-什么是LSTM和BiLSTM? LSTM:全称Long Short-Term Memory,是RNN(Recurrent Neural Network)的一种。LSTM由于其设计的特点,非常适合用于对时序数据的建模,如文本数据。 BiLSTM:Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。 可以看出其很适合...

miner_zhu的博客 3万+

Karto_SLAM算法学习

一、代码下载地址 https://github.com/ros-perception/open_karto.git https://github.com/ros-perception/slam_karto.git 代码分为两部分 :open_karto、slam_karto 采用通用的图 优化方法,Karto_SLAM是基于图优化的思想,用高度优化和非迭代 cholesky分解进行稀疏系统解耦作为...

LISIMANHAHA的博客 3257

基于双向长短期神经网络BILSTM的分类预测,基于GRU神经网络的分类预测

基于双向长短期神经网络BILSTM的分类预测,基于GRU神经网络的分类预测

abc991835105的博客 1279

基于双向长短期神经网络BILSTM的发生概率预测,基于GRU神经网络的发生概率预

基于双向长短期神经网络BILSTM的发生概率预测,基于GRU神经网络的发生概率预

abc991835105的博客 1588

几种SLAM算法跑出的效果比较

Gmapping是一种基于激光的SLAM算法,它已经集成在ROS中,是移动机器人中使用最多的SLAM算法。这个算法已经由Grisetti等人提出是一种基于Rao-Blackwellized的粒子滤波的SLAM方法。基于粒子滤波的算法用许多加权粒子表示路径的后验概率,每个粒子都给出一个重要性因子。但是,它们通常需要大量的粒子才能获得比较好的的结果,从而增加该算法的的计算复杂性。此外,与PF重采样过程相关的粒子退化耗尽问题也降低了算法的准确性。粒子退化问题包括在重采样阶段从样本集粒子中消除大量的粒子。

qq_57425280的博客 3954

Bilstm双向长短期神经网络多输入单输出回归分析

bilstm,gru ,回归分析

abc991835105的博客 1747

在ros下使用karto slam建立地图

     KartoSLAM是基于图优化的方法,用高度优化和非迭代 cholesky矩阵进行稀疏系统解耦作为解.图优化方法利用图的均值表示地图,每个节点表示机器人轨迹的一个位置点和传感器测量数据集,箭头的指向的连接表示连续机器人位置点的运动,每个新节点加入,地图就会依据空间中的节点箭头的约束进行计算更新。karto slam需要odom和laser scan的信息。      在ros当中使用k...

dzhongjie的博客 7643

时序预测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)时间序列预测

时序预测 | MATLAB实现BiLSTM时间序列预测 目录时序预测 | MATLAB实现BiLSTM时间序列预测BiLSTM介绍BiLSTM实现单层BiLSTM设计多层BiLSTM设计BiLSTM程序设计案例1设计案例2参考资料致谢 BiLSTM介绍 所谓的Bi-LSTM以及Bi-RNN,可以看成是两层神经网络,第一层从左边作为序列的起始输入,在时序上可以理解成从序列的开头开始输入,而第二层则是从右边作为系列的起始输入,在时序处理上可以理解成从序列的最后输入,反向做与第一层一样的处理处理。最后对得到的两

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 6418

cartographer、graphslam论文

Cartographer主要理论是通过闭环检测来消除构图过程中产生的累积误差[1]。用于闭环检测的基本单元是submap。一个submap是由一定数量的laser scan构成。将一个laser scan插入其对应的submap时,会基于submap已有的laser scan及其它传感器数据估计其在该submap中的最佳位置。submap的创建在短时间内的误差累积被认为是足够小的。然而随着时间推移,越来越多的submap被创建后,submap间的误差累积则会越来越大。因此需要通过闭环检测适当的优化这些submap的位姿进而消除这些累积误差,这就将问题转化成一个位姿优化问题。当一个submap的构建完成时,也就是不会再有新的laser scan插入到该submap时,该submap就会加入到闭环检测中。闭环检测会考虑所有的已完成创建的submap。当一个新的laser scan加入到地图中时,如果该laser scan的估计位姿与地图中某个submap的某个laser scan的位姿比较接近的话,那么通过某种 scan match策略就会找到该闭环。Cartographer中的scan match策略通过在新加入地图的laser scan的估计位姿附近取一个窗口,进而在该窗口内寻找该laser scan的一个可能的匹配,如果找到了一个足够好的匹配,则会将该匹配的闭环约束加入到位姿优化问题中。Cartographer的重点内容就是融合多传感器数据的局部submap创建以及用于闭环检测的scan match策略的实现。

BiLSTM之一:模型理解

本文着眼于内部计算过程而不是数据原理,分别总结了RNN,BiRNN,LSTM以及BiLSTM等神经网络模型内部结构。

芳樽里的歌的博客 6万+

EMC系列EtherCAT总线运动控制器(二):Motion通讯连接、总线配置及诊断

雷赛-EMC系列EtherCAT总线运动控制器(二):Motion通讯连接、总线配置及诊断

weixin_38570076的博客 1856

一幅图真正理解LSTM、BiLSTM

本文对RNN、LSTM、BiLSTM的内部结构和输入输出做了透彻的剖析,目标是能够解答LSTM和BiLSTM的任何疑问。RNN:循环神经网络LSTM:长短期记忆网络BiLSTM:双向长短期记忆网络重要的先验知识本质上单个RNN cell是在多个时间步上展开的形式,也可以理解为RNN是神经网络在时序上的权重共享(CNN相当于空间上的权重共享)LSTM也都是一样。

u012254599的博客 8400

高分系列卫星轨道、传感器参数等信息

遥感卫星数据简介-高分系列

中遥科 3296

GXHT40温湿度传感器:I2C通信与CRC校验实战解析

本文详细解析GXHT40温湿度传感器的I2C通信协议与CRC校验机制,涵盖硬件连接、时序控制、数据读取及加热功能应用。通过实战案例分享优化技巧与异常处理,帮助开发者提升嵌入式系统中传感器数据的准确性与可靠性。

rgv234567的博客 235

机器学习入门--双向长短期记忆神经网络(BiLSTM)原理与实践

本文介绍了双向长短期记忆网络(BiLSTM)的数学原理。首先解释了LSTM作为递归神经网络的变体,通过引入门控机制解决了传统RNN中的梯度问题。随后详细描述了LSTM的关键组成部分,包括遗忘门、输入门、更新单元状态、细胞状态更新、输出门和隐状态更新的计算过程。接着对BiLSTM进行介绍,指出其在时间序列上同时运行两个LSTM,一个前向处理,一个后向处理,最终将两者的隐藏状态连接形成最终的双向隐藏状态。本文阐述了BiLSTM的原理及其在序列建模中的重要性。

qq_45831510的博客 1万+

新手小白如何学习编程

学习目标推荐第一门语言优势网站 / APP 开发(前端)JavaScript浏览器原生支持,能快速做出可视化效果后端 / 服务器 / 数据分析Python语法简洁像英语,库多、应用广(入门友好)游戏开发先用电竞入门,再转专业引擎硬件 / 嵌入式(比如单片机)C 语言贴近硬件,行业标准办公自动化(Excel / 文档处理)Python快速解决重复工作(比如批量改文件)👉新手首选推荐。

2501_94331842的博客 2224

RNN与LSTM原理及实战:从基础到BiLSTM应用

循环神经网络(RNN)是处理序列数据的核心架构,通过隐藏状态的循环传递保留历史信息,解决了传统前馈神经网络无法建模时序依赖的问题。其衍生技术长短期记忆网络(LSTM)通过门控机制有效缓解了梯度消失问题,在自然语言处理和时间序列预测中表现突出。双向LSTM(BiLSTM)进一步融合上下文信息,显著提升命名实体识别等任务的准确率。工程实践中,合理设置dropout(0.1-0.3)和梯度裁剪能有效提升模型稳定性。这些技术在电商评论分析、医疗实体识别等场景中展现出强大优势,如LSTM可使长文本分类准确率提升27%

weixin_34293246的博客 431

无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误怎么解决

本文的内容是无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误的解决办法。

西岸贤 1万+

别再被手机厂商忽悠了!一文看懂光学变焦、数字变焦和混合变焦到底有啥区别

本文深入解析手机摄影中的光学变焦、数字变焦和混合变焦技术,揭示它们的工作原理和实际效果差异。光学变焦保持无损画质,数字变焦依赖算法放大,而混合变焦结合两者优势。帮助消费者识破厂商宣传,根据实际需求选择最适合的变焦方式,提升拍摄质量。

weixin_28717969的博客 400

基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测

LSTM原理,BILSTM原理,GRU原理,BIGRU原理,BP神经网络原理,基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。

abc991835105的博客 2401

零基础教你学RDMA驱动开发:从入门到精通--第6章 内存管理与DMA映射​6.2 DMA地址转换:内核dma_map_single()与硬件IOVA(I/O虚拟地址)​

本文深入探讨RDMA驱动中DMA地址转换机制,重点分析内核dma_map_single()函数与硬件IOVA的作用。主要内容包括:1)DMA地址转换的必要性,解决CPU虚拟地址与HCA设备DMA地址的空间割裂问题;2)内核DMA映射机制实现原理,涵盖无IOMMU(直接物理地址映射)和有IOMMU(IOVA转换)两种场景;3)硬件IOVA的工作流程及其与RDMA内存注册的结合;4)RDMA驱动开发中的关键问题,如缓存一致性、映射方向错误、IOVA泄漏等;5)以mlx5驱动为例的实践分析。文章强调DMA地址转换

xiaoheshang_123的博客 235
上一篇: Python自动化批量识别化学分子结构——从图片到SMILES/SDF的实战指南
下一篇: 随机森林算法实战指南:从基础到高级应用
apple5
博客等级 码龄17年 121粉丝 1666原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值