從代碼學習深度學習 - RNN PyTorch版

文章目錄

  • 前言
  • 一、數據預處理
  • 二、輔助訓練工具函數
  • 三、繪圖工具函數
  • 四、模型定義
  • 五、模型訓練與預測
  • 六、實例化模型并訓練
    • 訓練結果可視化
  • 總結


前言

循環神經網絡(RNN)是深度學習中處理序列數據的重要模型,尤其在自然語言處理和時間序列分析中有著廣泛應用。本篇博客將通過一個基于 PyTorch 的 RNN 實現,結合《The Time Machine》數據集,帶你從零開始理解 RNN 的構建、訓練和預測過程。我們將逐步剖析代碼,展示如何加載數據、定義工具函數、構建模型、繪制訓練過程圖表,并最終訓練一個字符級別的 RNN 模型。代碼中包含了數據預處理、模型定義、梯度裁剪、困惑度計算等關鍵步驟,適合希望深入理解 RNN 的初學者和進階者。

本文基于 PyTorch 實現,所有代碼均來自附件,并輔以詳細注釋和圖表說明。讓我們開始吧!


一、數據預處理

首先,我們需要加載和預處理《The Time Machine》數據集,將其轉化為適合 RNN 輸入的格式。以下是數據預處理的完整代碼:

import random
import re
import torch
from collections import Counterdef read_time_machine():"""將時間機器數據集加載到文本行的列表中"""with open('timemachine.txt', 'r') as f:lines = f.readlines()# 去除非字母字符并將每行轉換為小寫return [re.sub('[^A-Za-z]+', ' ', line).strip().lower() for line in lines]def tokenize(lines, token='word'):"""將文本行拆分為單詞或字符詞元"""if token == 'word':return [line.split() for line in lines]elif token == 'char':return [list(line) for line in lines]else:print(f'錯誤:未知詞元類型:{token}')def count_corpus(tokens):"""統計詞元的頻率"""if not tokens:return Counter()if isinstance(tokens[0], list):flattened_tokens = [token for sublist in tokens for token in sublist]else:flattened_tokens = tokensreturn Counter(flattened_tokens)class Vocab:"""文本詞表類,用于管理詞元及其索引的映射關系"""def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):self.tokens = tokens if tokens is not None else []self.reserved_tokens = reserved_tokens if reserved_tokens is not None else []counter = self._count_corpus(self.tokens)self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)self.idx_to_token = ['<unk>'] + self.reserved_tokensself.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}for token, freq in self._token_freqs:if freq < min_freq:breakif token not in self.token_to_idx:self.idx_to_token.append(token)self.token_to_idx[token] = len(self.idx_to_token) - 1@staticmethoddef _count_corpus(tokens):if not tokens:return Counter()if isinstance(tokens[0], list):tokens = [token for sublist in tokens for token in sublist]return Counter(tokens)def __len__(self):return len(self.idx_to_token)def __getitem__(self, tokens):if not isinstance(tokens, (list, tuple)):return self.token_to_idx.get(tokens, self.unk)return [self[token] for token in tokens]def to_tokens(self, indices):if not isinstance(indices, (list, tuple)):return self.idx_to_token[indices]return [self.idx_to_token[index] for index in indices]@propertydef unk(self):return 0@propertydef token_freqs(self):return self._token_freqsdef load_corpus_time_machine(max_tokens=-1):"""返回時光機器數據集的詞元索引列表和詞表"""lines = read_time_machine()tokens = tokenize(lines, 'char')vocab = Vocab(tokens)corpus = [vocab[token] for line in tokens for token in line]if max_tokens > 0:corpus = corpus

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

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

相關文章

JS DOM節點增刪改查

增加節點 通過document.createNode()函數創建對象 // 創建節點 const div document.createElement(div) // 追加節點 document.body.appendChild(div) 克隆節點 刪除節點

IMX6ULL學習整理篇——Linux使用更現代的GPIO操作簡單設備

IMX6ULL學習篇——實戰&#xff1a;使用設備樹/Pinctl-gpio子系統驅動LED 前言 ? 經過層層考驗&#xff0c;我們即將接近現代的LED驅動的解決方案了。那就是使用最現代的方式開發一個簡單的GPIO驅動外設。 ? 如果您忘記了設備樹的相關內容&#xff0c;請自行到筆者的上一篇…

2025-04-07 NO.3 Quest3 MR 配置

文章目錄 1 MR 介紹1.1 透視1.2 場景理解1.3 空間設置 2 配置 MR 環境2.1 場景配置2.2 MR 配置 3 運行測試 配置環境&#xff1a; Windows 11Unity 6000.0.42f1Meta SDK v74.0.2Quest3 1 MR 介紹 1.1 透視 ? 透視&#xff08;Passthrough&#xff09;是將應用的背景從虛擬的…

如何在 GitHub 上開源一個小項目:從創建到長期維護的完整指南

如何在 GitHub 上開源一個小項目&#xff1a;從創建到長期維護的完整指南 適用于 個人開發者、團隊合作、企業開源&#xff0c;涵蓋 Git 基礎、GitHub 配置、最佳實踐、社區互動、自動化 CI/CD 及長期維護策略。 &#x1f4cc; 1. 注冊 GitHub 賬戶 如果你還沒有 GitHub 賬戶&…

【技術報告】GPT-4o 原生圖像生成的應用與分析

【技術報告】GPT-4o 原生圖像生成的應用與分析 1. GPT-4o 原生圖像生成簡介1.1 文本渲染能力1.2 多輪對話迭代1.3 指令遵循能力1.4 上下文學習能力1.5 跨模態知識調用1.6 逼真畫質與多元風格1.7 局限性與安全性 2. GPT-4o 技術報告2.1 引言2.2 安全挑戰、評估與緩解措施2.2.1 安…

React中的跨組件通信

在React中&#xff0c;跨組件通信有幾種常見的方式。每種方式適用于不同的場景&#xff0c;下面是幾種常見的跨組件通信方法&#xff1a; 1. 通過父子組件傳遞 Props 父組件可以通過 props 將數據傳遞給子組件&#xff0c;子組件只能接收和使用這些數據。 父組件&#xff08…

系統與網絡安全------Windows系統安全(8)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 DNS DNS概述 為什么需要DNS系統 www.baidu.com與119.75.217.56&#xff0c;哪個更好記&#xff1f; 互聯網中的114查號臺/導航員 DNS&#xff08;Domian Name System&#xff0c;域名系統&#xff09;的功…

[ctfshow web入門] web16

信息收集 提示&#xff1a;對于測試用的探針&#xff0c;使用完畢后要及時刪除&#xff0c;可能會造成信息泄露 試試url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 點擊phpinfo&#xff0c;查看phpinfo信息&#xff0c;搜索flag&#xff0c;發現flag被保存為變量…

Go基礎一(Maps Functions 可變參數 閉包 遞歸 Range 指針 字符串和符文 結構體)

Maps 1.創建map make(map[鍵類型]值類型) 2.設置鍵值對 name[key]value; 3. name[key]獲取鍵值 3.1 key不存在 則返回 0 4.len()方法 返回 map 上 鍵值對數量 len(name) 5.delete()方法 從map中刪除 鍵值對 delete(name,key) 6.clear()方法 map中刪除所有鍵值對 clear(name) 7…

? 2025最新 | YOLO 獲取 COCO 指標終極指南 | 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋【B 站教程詳解】

? YOLO 輕松獲取論文 COCO 指標&#xff1a;AP&#xff08;small&#xff0c;medium&#xff0c;large &#xff09;| 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋 文章目錄 一、摘要二、為什么需要 COCO 指標評估 YOLO 模型&#xff1f;三、核心挑戰與解決方案 (視頻教程核…

ResNet改進(18):添加 CPCA通道先驗卷積注意力機制

1. CPCA 模塊 CPCA(Channel Prior Convolutional Attention)是一種結合通道先驗信息的卷積注意力機制,旨在通過顯式建模通道間關系來增強特征表示能力。 核心思想 CPCA的核心思想是將通道注意力機制與卷積操作相結合,同時引入通道先驗知識,通過以下方式優化特征學習: 通…

SpringMVC的簡單介紹

SpringMVC的簡單介紹 SpringMVC 是一個基于 Java 的 Web 框架&#xff0c;是 Spring Framework 中用于構建 Web 應用的一個核心模塊。它采用了 模型-視圖-控制器 (MVC) 設計模式&#xff0c;能夠幫助開發者更加清晰地分離業務邏輯、用戶界面和請求處理&#xff0c;從而提高應用…

MES生產工單管理系統,Java+Vue,含源碼與文檔,實現生產工單全流程管理,提升制造執行效率與精準度

前言&#xff1a; MES生產工單管理系統是制造業數字化轉型的核心工具&#xff0c;通過集成生產、數據、庫存等模塊&#xff0c;實現全流程數字化管理。以下是對各核心功能的詳細解析&#xff1a; 一、生產管理 工單全生命周期管理 創建與派發&#xff1a;根據銷售訂單或生產計…

Redis常見問題排查與解決方案指南

Redis作為高性能的內存數據庫&#xff0c;廣泛應用于緩存、隊列、實時統計等場景。但在實際使用中&#xff0c;開發者和運維人員常會遇到性能下降、內存溢出、主從同步失敗等問題。本文將針對高頻問題進行詳細分析&#xff0c;并提供對應的解決方案和預防措施&#xff0c;助你快…

目標跟蹤Deepsort算法學習2025.4.7

一.DeepSORT概述 1.1 算法定義 DeepSORT(Deep Learning and Sorting)是一種先進的多目標跟蹤算法,它結合了深度學習和傳統的目標跟蹤技術,在復雜環境下實現了高精度和魯棒性的目標跟蹤。該算法的核心思想是通過融合目標的外觀特征和運動特征,實現對多個目標的持續跟蹤,…

從零開始開發HarmonyOS應用并上架

開發環境搭建&#xff08;1-2天&#xff09; 硬件準備 操作系統&#xff1a;Windows 10 64位 或 macOS 10.13 內存&#xff1a;8GB以上&#xff08;推薦16GB&#xff09; 硬盤&#xff1a;至少10GB可用空間 軟件安裝 下載 DevEco Studio 3.1&#xff08;官網&#xff1a;…

Linux | 無頭 Linux 服務器安裝和設置

注&#xff1a;本文為 “Headless Linux” 相關文章合輯。 機翻未校。 How to Install and Set Up Headless Linux Server 如何安裝和設置無頭 Linux 服務器 Winnie Ondara Last Updated: January 31, 2023 A vast majority of Linux users are familiar with a Linux desk…

AI賦能數據庫管理“最后一公里”,融合架構重塑數據庫承載成本效能——zCloud 6.7與zData X 3.3正式發布

點擊藍字 關注我們 在數據驅動的新時代&#xff0c;數據庫的多元化和智能化已成不可逆的趨勢。3月31日&#xff0c;云和恩墨以“奇點時刻數智躍遷”為主題舉辦線上發布會&#xff0c;云和恩墨創始人兼總經理蓋國強、公司數據庫和生態產品群總經理熊軍共同帶來 zCloud 6.7與 zD…

I have something to say about Vue Node.js

關于Vue Node.js&#xff0c;我真的說了很多次了&#xff0c;讓我難以理解為啥這么粗糙的東西能流行一起。真瘋狂的世界。 vue讓感覺就像玩貓德一樣的&#xff0c;如此的瘋狂&#xff0c;天哪。睡覺了 Node.js v13 window7_nodejsv13-CSDN博客

【橘子大模型】使用streamlit來構建自己的聊天機器人(下)

一、簡介 我們之前完成了一個簡易的聊天機器人&#xff0c;但是還留下了一些問題沒有解決&#xff0c;比如如何開啟新的會話。如何切換session_id&#xff0c;如何把對話做成流式的輸出。這些我們就會在今天來完成。 二、關于新的會話和session_id from dotenv import load_…