Python----循環神經網絡(BiLSTM:雙向長短時記憶網絡)

一、LSTM 與?BiLSTM對比

1.1、LSTM

????????LSTM(長短期記憶網絡)?是一種改進的循環神經網絡(RNN),專門解決傳統RNN難以學習長期依賴的問題。它通過遺忘門、輸入門和輸出門來控制信息的流動,保留重要信息并丟棄無關內容,從而有效處理長序列數據。LSTM的核心是細胞狀態,它像一條傳送帶,允許信息在不同時間步之間穩定傳遞,避免梯度消失或爆炸,適用于時間序列預測、語音識別等任務。

1.2、BiLSTM?

????????BiLSTM(雙向長短期記憶網絡)?在LSTM的基礎上增加反向處理層,同時捕捉過去和未來的上下文信息。前向LSTM按時間順序處理序列,后向LSTM逆序處理,最終結合兩個方向的輸出,增強模型對全局上下文的理解。BiLSTM在自然語言處理任務(如機器翻譯、命名實體識別)中表現優異,但計算成本更高。它特別適合需要雙向信息交互的場景,如語義理解、情感分析等。?

????????BiLSTM結構包含兩個方向的LSTM網絡:一個正向(forward)LSTM和一 個反向(backward)LSTM。

????????這兩個方向的LSTM在模型訓練過程中分別處理輸入序列,最后的隱藏狀態 由這兩個方向的LSTM拼接而成。這樣的結構使得模型能夠同時考慮到輸入 序列中每個位置的過去和未來信息,更全面地捕捉序列中的上下文信息。

????????如下面這個情感分類的例子,正向的LSTM按照從左到右的順序處理“我”、 “愛”、“你”,反向的LSTM按照從右到左的順序處理“你”、“愛”、“我”,然后 將兩個LSTM的最后一個隱藏層拼接起來再經過softmax等處理得到分類結果。

????????舉一個例子,如一句話“我今天很開心,因為我考試考了 100 分”要做情感 分類,LSTM只能從左到右的看,因此在看到“很開心”這個關鍵詞時它獲得 的只有上文的信息,而BiLSTM是雙向的因此也能看到“因為我考試考了 100 分”這一部分,而這一部分對應最終結果是否準確有很大的幫助。?

特征LSTMBiLSTM
方向性單向(僅過去信息)雙向(過去和未來信息)
計算復雜度較低較高(約2倍)
典型應用時間序列預測、語言模型文本分類、序列標注、機器翻譯
內存需求較少較多

13、優勢?

BiLSTM相對于單向LSTM具有以下優勢:

????????能夠捕捉到輸入序列中每個位置的過去和未來信息,更全面地捕捉序列 中的上下文信息。

????????可以更好地處理長距離的依賴關系。

????????在許多自然語言處理任務中都取得了良好的效果。

二、庫函數-LSTM

torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None)

LSTM — PyTorch 2.7 documentation

參數描述
input_size輸入?x?中預期特征的數量
hidden_size處于隱藏狀態?h?的特征數量
num_layers循環層數。例如,設置意味著將兩個 LSTM 堆疊在一起以形成一個堆疊的 LSTM。 第二個 LSTM 接收第一個 LSTM 的輸出,并且 計算最終結果。默認值:1num_layers=2
bias偏置如果 ,則層不使用?b_ih?和?b_hh?的偏差權重。 違約:FalseTrue
batch_first?如果 ,則提供輸入和輸出張量 作為?(batch, seq, feature)?而不是?(seq, batch, feature)。?請注意,這不適用于隱藏狀態或單元格狀態。請參閱 Inputs/Outputs 部分了解詳細信息。違約:TrueFalse
dropout?如果為非零,則在每個?除最后一層外的 LSTM 層,其 dropout 概率等于 。默認值:0dropout
bidirectional

如果 ,則變為雙向 LSTM。違約:TrueFalse

?

  • weight_ih_l[k]_reverse?– 類似于?weight_ih_l[k]?的相反方向。 僅當 時存在。bidirectional=True

  • weight_hh_l[k]_reverse?– 類似于?weight_hh_l[k]?的相反方向。 僅當 時存在。bidirectional=True

  • bias_ih_l[k]_reverse?– 類似于?bias_ih_l[k]?的相反方向。 僅當 時存在。bidirectional=True

  • bias_hh_l[k]_reverse?– 類似于?bias_hh_l[k]?的相反方向。 僅當 時存在。bidirectional=True

proj_size

如果 ,將使用 LSTM 和相應大小的投影。默認值:0>?0

import torch
import numpy as np
from torch import nn# 1.字符輸入
text = "In Beijing Sarah bought a basket of apples In Guangzhou Sarah bought a basket of bananas"torch.manual_seed(1)# 3.數據集劃分
input_seq = [text[:-1]]
output_seq = [text[1:]]
print("input_seq:", input_seq)
# print("output_seq:", output_seq)# 4.數據編碼:one-hot
chars = set(text)
chars = sorted(chars)
# print("chars:", chars)
# {" ":0, "a":1 }
char2int = {char: ind for ind, char in enumerate(chars)}
# print("char2int:", char2int)
# {0:" ", 1: "a"}
int2char = dict(enumerate(chars))# 將字符轉成數字編碼
input_seq = [[char2int[char] for char in seq] for seq in input_seq]
# print("input_seq:", input_seq)
output_seq = [[char2int[char] for char in seq] for seq in output_seq]# one-hot 編碼,pytorch的RNN的輸入張量的填充
def one_hot_encode(seq, bs, seq_len, size):features = np.zeros((bs, seq_len, size), dtype=np.float32)for i in range(bs):for u in range(seq_len):features[i, u, seq[i][u]] = 1.0return torch.tensor(features, dtype=torch.float32)input_seq = one_hot_encode(input_seq, 1, len(text)-1, len(chars))
output_seq = torch.tensor(output_seq, dtype=torch.long).view(-1)
print("output_seq:", output_seq)# 5.定義前向模型
class Model(nn.Module):def __init__(self, input_size, hidden_size, out_size):super(Model, self).__init__()self.hidden_size = hidden_sizeself.bilstm1 = nn.LSTM(input_size, hidden_size, num_layers=1, batch_first=True, bidirectional=True)self.fc1 = nn.Linear(hidden_size * 2, out_size)def forward(self, x):out, hidden = self.bilstm1(x)x = out.contiguous().view(-1, self.hidden_size * 2)x = self.fc1(x)return x, hiddenmodel = Model(len(chars), 32, len(chars))# 6.定義損失函數和優化器
cri = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)# 7.開始迭代
epochs = 1000
for epoch in range(1, epochs+1):output, hidden = model(input_seq)loss = cri(output, output_seq)optimizer.zero_grad()loss.backward()optimizer.step()# 8.顯示頻率設置if epoch == 0 or epoch % 50 == 0:print(f"Epoch [{epoch}/{epochs}], Loss {loss:.4f}")# print("input_seq.shape:", input_seq.shape)
# print("hidden.shape:", hidden.shape)
# print("output.shape:", output.shape)
# print("input_w:", model.rnn1.weight_ih_l0.shape)# 預測下面幾個字符
input_text = "In Beijing Sarah bought a basket of"  # re
to_be_pre_len = 20for i in range(to_be_pre_len):chars = [char for char in input_text]# print(chars)character = np.array([[char2int[c] for c in chars]])character = one_hot_encode(character, 1, character.shape[1], 23)character = torch.tensor(character, dtype=torch.float32)out, hidden = model(character)char_index = torch.argmax(out[-1]).item()input_text += int2char[char_index]
print("預測到的:", input_text)

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

U盤掛載Linux

在 只能使用 Telnet 的情況下,如果希望通過 U盤 傳輸文件到 Linux 系統,可以按照以下步驟操作: 📌 前提條件 U盤已插入 Linux 主機的 USB 接口。Linux 主機支持自動掛載 U盤(大多數現代發行版默認支持)。T…

QuickBASIC QB64 支持 64 位系統和跨平臺Linux/MAC OS

QuickBASIC 的現代繼任者 QB64 已發展成為一個功能強大的開源項目,支持 64 位系統和跨平臺開發。以下是詳細介紹: 項目首頁 - QB64pe:The QB64 Phoenix Edition Repository - GitCode https://gitcode.com/gh_mirrors/qb/QB64pe 1. QB64 概述 官網&am…

【C++高級主題】命令空間(五):類、命名空間和作用域

目錄 一、實參相關的查找(ADL):函數調用的 “智能搜索” 1.1 ADL 的核心規則 1.2 ADL 的觸發條件 1.3 ADL 的典型應用場景 1.4 ADL 的潛在風險與規避 二、隱式友元聲明:類與命名空間的 “私密通道” 2.1 友元聲明的基本規則…

免費開源Umi-OCR,離線使用,批量精準!

Umi-OCR(Windows端) Umi-OCR 是一款在 GitHub 上開源的免費 OCR 識別軟件,它最大的亮點就是免費、開源、支持批量處理,而且識別準確度很高。這款軟件不需要聯網就能用,非常值得推薦! 在 OCR 識別功能方面&…

深入剖析 Docker 容器化原理與實戰應用,開啟技術新征程!

文章目錄 前言一、為什么 是Docker ?二、Docker 容器化原理分析2.1 鏡像(Image)2.2 容器(Container)2.3 倉庫(Registry) 三、Docker 容器化實踐3.1 Docker安裝3.2 創建一個 Docker 鏡像3.3 運行…

黑馬程序員TypeScript課程筆記—class篇

class的基本使用 class的構造函數(實現實例屬性的初始化) 在使用構造函數的時候,小括號的后面不要指定類型,否則就會報錯,因為構造函數沒有返回值 class實例方法 class繼承(extends) class繼承…

PDF.js無法顯示數字簽名

問題 pdfjs加載pdf文件時無法顯示數字簽名 PDF.js 從 v2.9.359 版本開始正式支持數字簽名的渲染與顯示,此前版本需通過修改源代碼實現基礎兼容。 建議升級pdfjs組件大于等于v2.9.359 pdfjs歷史版本:https://github.com/mozilla/pdf.js/releases pdfjs…

解決VS Code誤報Java問題的終極方法

使用vscode寫java,發現很多Problems,如下圖,實際上并沒有問題,是誤報,怎么解決? 解決方案:disable下面這個插件,它和vscode-java插件沖突了導致。

【WPF】從普通 ItemsControl 到支持篩選的 ItemsControl:深入掌握 CollectionViewSource 用法

? 從普通 ItemsControl 到支持篩選的 ItemsControl:深入掌握 CollectionViewSource 用法 在日常 WPF 開發中,我們經常需要對數據進行篩選、排序、分組等操作,而原生的 ItemsControl 并不直接支持這些功能。本文將介紹如何通過 CollectionVi…

Mybatis Plus JSqlParser解析sql語句及JSqlParser安裝步驟

MyBatis Plus與JSqlParser:SQL語句解析與實戰指南 在現代Java開發中,SQL解析和動態SQL生成是數據庫操作中不可或缺的一部分。MyBatis Plus作為MyBatis的增強工具,通過JSqlParser庫實現了對SQL語句的深度解析和修改能力。本文將詳細介紹如何在…

學習路之PHP--easyswoole使用視圖和模板

學習路之PHP--easyswoole使用視圖和模板 一、安裝依賴插件二、 實現渲染引擎三、注冊渲染引擎四、測試調用寫的模板五、優化六、最后補充 一、安裝依賴插件 composer require easyswoole/template:1.1.* composer require topthink/think-template相關版本: "…

設計模式——享元設計模式(結構型)

摘要 享元設計模式是一種結構型設計模式,旨在通過共享對象減少內存占用和提升性能。其核心思想是將對象狀態分為內部狀態(可共享)和外部狀態(不可共享),并通過享元工廠管理共享對象池。享元模式包含抽象享…

互聯網大廠Java求職面試:云原生微服務架構設計與AI大模型集成實戰

互聯網大廠Java求職面試:云原生微服務架構設計與AI大模型集成實戰 面試場景設定 人物設定: 李明(技術總監):擁有15年分布式系統架構經驗,主導過多個億級用戶系統的重構,對云原生和AI融合有深…

nginx+tomcat動靜分離、負載均衡

一、理論 nginx用于處理靜態頁面以及做調度器,tomcat用于處理動態頁面 lvs(四層) 輪詢(rr) 加權輪詢(wrr) 最小連接(lc) 加權最小連接(wlc) ngi…

什么是AI芯片?

首先,我們要了解一下:什么是芯片?芯片的本質就是在半導體襯底上制作能實現一系列特定功能的集成電路。 其次,來看一下AI的概念。AI是研究如何使計算機能夠模擬和執行人類智能任務的科學和技術領域,致力于開發能夠感知…

PostgreSQL數據庫配置SSL操作說明書

背景: 因為postgresql或者mysql目前通過docker安裝,只需要輸入主機IP、用戶名、密碼即可訪問成功,這樣其實是不安全的,可能會通過一些手段獲取到用戶名密碼導致數據被竊取。而ES、kafka等也是通過用戶名/密碼方式連接,…

k8s更新證書

[rootk8s-master01 ~]# sudo kubeadm certs renew all [renew] Reading configuration from the cluster… [renew] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -o yaml’ certificate embedded in the kubeconfig file for…

正點原子lwIP協議的學習筆記

正點原子lwIP協議的學習筆記 正點原子lwIP學習筆記——lwIP入門 正點原子lwIP學習筆記——MAC簡介 正點原子lwIP學習筆記——PHY芯片簡介 正點原子lwIP學習筆記——以太網DMA描述符 正點原子lwIP學習筆記——裸機移植lwIP 正點原子lwIP學習筆記——裸機lwIP啟動流程 正點…

MongoTemplate常用api學習

本文只介紹常用的api,盡量以最簡單的形式學會mongoTemplate基礎api的使用 一、新增 主要包含三個api:insert(一個或遍歷插多個)、insertAll(批量多個)、save(插入或更新) //這里簡…

006網上訂餐系統技術解析:打造高效便捷的餐飲服務平臺

網上訂餐系統技術解析:打造高效便捷的餐飲服務平臺 在數字化生活方式普及的當下,網上訂餐系統成為連接餐飲商家與消費者的重要橋梁。該系統以菜品分類、訂單管理等模塊為核心,通過前臺展示與后臺錄入的分工協作,為管理員和會員提…