关于0^n 1^n序列的上下文无关序列(PyTorch)

news/2025/12/4 10:21:48/文章来源:https://www.cnblogs.com/lwclwc/p/19305652

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

====================== 1. 配置参数(初学者友好版) ======================

设备配置:优先使用GPU,没有则用CPU

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

序列参数:n的取值范围(生成0n1n,n从1到5)

n_list = [1, 2, 3, 4, 5]

字符到数字的映射(编码)

char2idx = {'0': 0, '1': 1}
idx2char = {0: '0', 1: '1'}
vocab_size = len(char2idx) # 词汇表大小(0和1)

RNN参数

input_size = vocab_size # 输入维度(one-hot编码)
hidden_size = 16 # 隐藏层维度(初学者可先固定)
num_layers = 1 # RNN层数(单层更简单)
learning_rate = 0.01 # 学习率
num_epochs = 1000 # 训练轮数
print_every = 200 # 每200轮打印一次训练结果

====================== 2. 生成训练数据 ======================

def generate_data(n_list):
"""生成0n1n形式的序列数据"""
data = []
for n in n_list:
# 生成序列:n个0 + n个1
seq = '0' * n + '1' * n
data.append(seq)
return data

生成训练数据

train_data = generate_data(n_list)
print("训练序列样本:", train_data)

====================== 3. 数据预处理(编码+转换为张量) ======================

def encode_sequence(seq):
"""将字符序列转换为数字编码的张量(one-hot)"""
# 第一步:字符转数字索引
idx_seq = [char2idx[char] for char in seq]
# 第二步:转换为one-hot编码(模型输入需要)
one_hot_seq = torch.zeros(len(seq), vocab_size).to(device)
for i, idx in enumerate(idx_seq):
one_hot_seq[i, idx] = 1.0
return one_hot_seq, torch.tensor(idx_seq).to(device)

====================== 4. 构建简单的RNN模型 ======================

class SimpleRNN(nn.Module):
def init(self, input_size, hidden_size, vocab_size, num_layers):
super(SimpleRNN, self).init()
self.hidden_size = hidden_size # 隐藏层维度
self.num_layers = num_layers # RNN层数
# 定义RNN层:输入维度=词汇表大小,隐藏层维度=hidden_size,层数=num_layers
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
# 全连接层:将隐藏层输出映射到词汇表大小(预测0或1)
self.fc = nn.Linear(hidden_size, vocab_size)

def forward(self, x, hidden):"""前向传播x: 输入张量 (batch_size, seq_len, input_size)hidden: 隐藏状态张量 (num_layers, batch_size, hidden_size)"""# RNN前向传播out, hidden = self.rnn(x, hidden)# 调整形状:(batch_size*seq_len, hidden_size),方便全连接层处理out = out.reshape(out.size(0)*out.size(1), out.size(2))# 全连接层预测out = self.fc(out)return out, hiddendef init_hidden(self, batch_size):"""初始化隐藏状态(全0)"""return torch.zeros(self.num_layers, batch_size, self.hidden_size).to(device)

====================== 5. 初始化模型、损失函数、优化器 ======================

model = SimpleRNN(input_size, hidden_size, vocab_size, num_layers).to(device)
criterion = nn.CrossEntropyLoss() # 交叉熵损失(分类任务)
optimizer = optim.Adam(model.parameters(), lr=learning_rate) # Adam优化器

====================== 6. 训练模型 ======================

print("\n开始训练模型...")
for epoch in range(num_epochs):
total_loss = 0
# 遍历所有训练序列
for seq in train_data:
# 编码序列:获取one-hot输入和数字标签
input_one_hot, target_idx = encode_sequence(seq)
# 调整输入形状:(batch_size=1, seq_len, input_size)
input_one_hot = input_one_hot.unsqueeze(0)

    # 初始化隐藏状态hidden = model.init_hidden(batch_size=1)# 梯度清零(避免累积)optimizer.zero_grad()# 前向传播:逐个字符预测(除了最后一个字符)loss = 0for i in range(len(seq)-1):# 取第i个字符作为输入,预测第i+1个字符input_char = input_one_hot[:, i:i+1, :]output, hidden = model(input_char, hidden)# 计算损失:预测值 vs 第i+1个字符的标签loss += criterion(output, target_idx[i+1:i+2])# 反向传播+参数更新loss.backward()optimizer.step()total_loss += loss.item()# 打印训练进度
if (epoch+1) % print_every == 0:avg_loss = total_loss / len(train_data)print(f'Epoch [{epoch+1}/{num_epochs}], 平均损失: {avg_loss:.4f}')

====================== 7. 测试模型:生成0^n 1^n序列 ======================

print("\n测试模型生成序列...")
def generate_sequence(n):
"""
生成0^n 1^n序列
n: 0和1的个数
"""
# 初始输入:第一个字符是0(one-hot编码)
input_char = torch.tensor([[char2idx['0']]]).to(device)
input_one_hot = torch.zeros(1, 1, vocab_size).to(device)
input_one_hot[0, 0, input_char] = 1.0

# 初始化隐藏状态
hidden = model.init_hidden(batch_size=1)
# 存储生成的序列
generated_seq = ['0']# 第一步:生成前n-1个0
for _ in range(n-1):output, hidden = model(input_one_hot, hidden)# 预测下一个字符(取概率最大的)_, predicted_idx = torch.max(output, 1)generated_seq.append(idx2char[predicted_idx.item()])# 更新输入为当前预测的字符input_one_hot = torch.zeros(1, 1, vocab_size).to(device)input_one_hot[0, 0, predicted_idx] = 1.0# 第二步:生成n个1
for _ in range(n):output, hidden = model(input_one_hot, hidden)_, predicted_idx = torch.max(output, 1)generated_seq.append(idx2char[predicted_idx.item()])return ''.join(generated_seq)

测试生成不同n的序列

for test_n in [1, 2, 3, 4, 5]:
generated_seq = generate_sequence(test_n)
expected_seq = '0'test_n + '1'test_n
print(f'n={test_n}: 预期序列={expected_seq}, 生成序列={generated_seq}, 匹配: {generated_seq == expected_seq}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年质量好的低温电伴热带/恒功率电伴热带行业内口碑厂家排行榜

2025年质量好的低温电伴热带/恒功率电伴热带行业内口碑厂家排行榜行业背景与市场趋势随着全球工业自动化水平的不断提升和环保要求的日益严格,电伴热系统作为高效、节能的管道保温解决方案,在石油化工、建筑供暖、太…

2025 年空压机厂家最新推荐榜,技术实力与市场口碑深度解析,挖掘行业优质品牌核心优势空压机维修/空压机配件/空压机设备/螺杆式空压机/磁悬浮空压机/永磁变频空压机/涡旋式空压机公司推荐

引言 在工业生产智能化转型进程中,空压机作为关键动力设备,其性能与服务对企业生产效率和运营成本影响深远。为精准筛选优质空压机品牌,本次推荐榜测评依托行业协会最新发布的《2025 年工业动力设备性能测评报告》,…

pbootcms模板如何调用当前站点网址和当前页面网址(PbootCMS 网站路径与页面地址标签使用指南)

在 PbootCMS 中,{pboot:httpurl} 和 {pboot:pageurl} 是两个常用的系统标签,分别用于获取当前站点的完整网址和当前页面的访问地址。以下是它们的详细说明和使用方法。1. 当前站点网址:{pboot:httpurl} 功能说明自适…

2025年口碑好的集肤发热电缆/串联发热电缆最新TOP品牌厂家排行

2025年口碑好的集肤发热电缆/串联发热电缆TOP品牌厂家排行行业背景与市场趋势随着全球能源结构调整和环保意识提升,电伴热技术作为高效节能的解决方案在各行业应用日益广泛。集肤发热电缆和串联发热电缆作为电伴热系统…

2025 年压缩空气设备厂家最新推荐榜,技术实力与市场口碑深度解析,精选高品质服务与创新能力突出品牌压缩空气干燥设备/压缩空气过滤设备/压缩空气节能设备/压缩空气后处理设备/压缩空气设备保养公司推荐

引言 在工业生产持续向高效、节能方向升级的进程中,压缩空气设备作为关键动力支撑,其性能与服务水平对企业生产效益影响显著。为精准筛选优质品牌,本次推荐榜依托行业权威协会近一年测评数据制定评选标准,协会通过…

2025年热门的钱币收购/钱币热度飙升榜

2025年热门的钱币收购/钱币热度飙升榜钱币收藏市场的新机遇随着全球经济的波动和投资渠道的多元化,钱币收藏市场在2025年迎来了前所未有的繁荣。根据国际收藏品市场研究机构的报告,全球钱币交易量在过去三年中增长了…

选对国产FTP服务器,筑牢数据传输安全防线,合规高效双达标

在信创产业全面推进与数字化转型深度融合的当下,企业对数据传输的安全性、合规性与高效性提出了前所未有的高要求。传统FTP服务器普遍存在明文传输、安全漏洞频发、缺乏合规审计能力、难以适配国产软硬件等致命缺陷,…

深圳小软件公司双线运营的-clickup explore with chatgpt5 on edge

好的,那我来为你设计一个 深圳小软件公司双线运营的 ClickUp 模板配置方案,让你在同一个工作区里同时跑“产品线”和“项目线”:🏗️ 整体架构Workspace(工作区):公司统一空间 Space(空间):分为两条线产品线…

V型滤池的“恒水位”控制具体是如何通过PLC和出水调节阀实现的

这是一个非常核心的技术问题。V型滤池的“恒水位”控制是保证其恒速过滤、运行稳定的关键,其本质是一个闭环自动控制系统。下面详细解析其工作原理、控制逻辑和实现方式。 一、 系统组成被控对象:滤池内的水位。 设定…

网站后台图片上传提示:”上传失败:存储目录创建失败!“

错误描述: 在后台上传图片时,提示:上传失败:存储目录创建失败!问题原因: 此错误通常是由于文件夹权限不足导致的。PbootCMS 需要对静态资源目录(/static 文件夹)具有写入权限。 解决方法:找到网站根目录下的 …

2025比较好的澳洲留学中介

2025比较好的澳洲留学中介一、2025年如何选择澳洲留学中介?作为一位从业12年的国际教育规划师,我经常遇到学生和家长询问:2025年申请澳洲留学,哪家中介更可靠?选择中介时应注意哪些方面?根据《2025留学中介行业白…

WTAPI框架微信个人号接口:微信机器人开发的安全高效之选

WTAPI框架微信个人号接口:微信机器人开发的安全高效之选 作为专注企业数字化微信管理服务的技术团队,我们依托WTAPI框架为SCRM系统、智能机器人、营销工具、社群小助手等场景提供高可靠的微信个人号接口开发服务。针…

对于深圳小软件公司而言,哪一个模板更适合做产品,哪一个模板更适合接项目。-clickUp explore with chatgpt5 on edge

在你打开的 ClickUp 模板库里,其实已经把不同场景的模板分成了两类:偏向 自研产品 和偏向 客户项目交付。结合深圳小软件公司的常见情况(既要孵化自己的产品,又要承接外部项目),可以这样区分:🚀 更适合做产品…

2025北京留学中介排名

2025北京留学中介排名一、2025北京留学中介排名解析作为从业15年的国际教育规划师,笔者经常被北京学生和家长询问如何选择留学中介。2025年,北京留学市场竞争日趋激烈,家长和学生普遍关注中介的本地化服务能力和成功…

2025年靠谱的自动打印发卡机厂家推荐及选购参考榜

2025年靠谱的自动打印发卡机厂家推荐及选购参考榜行业背景与市场趋势随着数字化进程的加速和智能制造的普及,自动打印发卡机作为智能识别与自动化生产的重要设备,在各行各业的应用日益广泛。2025年,全球自动打印发卡…

0329-Chip8-俄罗斯方块

环境Time 2023-07-27 Zig 0.11.0-dev.4191+1bf16b172 SLD2 2.28.1前言 说明 参考资料:https://en.wikipedia.org/wiki/CHIP-8 https://austinmorlan.com/posts/chip8_emulator/ https://rsj217.github.io/chip8-py/ h…

大城县农村自建房找谁好?河北省廊坊市大城县自建房公司 / 机构深度评测口碑推荐榜​

大城县农村自建房找谁好?河北省廊坊市大城县自建房公司 / 机构深度评测口碑推荐榜​ 一、引言:大城县自建房的 “合规升级” 与选择困境​ 在子牙河下游的华北平原上,大城县 10 个乡镇 —— 平舒镇的城关聚居区、旺…

2025电商 CRM TOP榜单:南讯客道全域数智运营,以全域能力领跑行业

序言 在消费升级与数字化浪潮的双重驱动下,电商CRM已从“客户管理工具”升级为品牌全域用户资产沉淀、精准营销转化的核心引擎。尤其在全渠道融合、AI智能运营成为主流需求的当下,一款适配场景广、技术实力硬、服务保…

2025年实训汽轮机模型制造厂权威推荐榜单:火力发电站教学模型‌/电力系统模型‌/太阳能发电教学模型‌源头制造厂精选

在现代电力工程与能源动力专业教学中,实训汽轮机模型作为将抽象原理具象化、复杂系统可视化的关键教具,其重要性日益凸显。一套高保真、可动态演示的汽轮机模型,能够将课本中关于蒸汽膨胀做功、叶片受力、转子动力学…

2025CRM靠谱品牌推荐:南讯客道凭 15年实力领跑数智运营,全场景适配+AI 驱动

序言:CRM成增长核心引擎,南讯客道凭全域能力突围 2025年,企业数字化转型迈入深水区,CRM(客户关系管理)系统已从“辅助工具”升级为驱动生意增长的“核心引擎”。随着AI技术深度渗透与全渠道经营成为常态,市场对…