You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch实例化自定义LSTM模型时参数未定义的报错求助

解决PyTorch代码中的NameError及参数定义问题

1. 直接解决NameError:定义缺失的模型参数

你需要在实例化模型前,明确定义input_size、hidden_size、num_layers、output_size这四个参数,每个参数的含义结合字符生成场景解释如下:

  • input_size:LSTM的输入特征维度。如果直接用字符索引输入(未做嵌入处理),可设为1;如果后续添加嵌入层,需设为嵌入向量的维度(比如64、128)。
  • hidden_size:LSTM隐藏层的特征维度,可根据任务复杂度设置,常用值为64、128、256。
  • num_layers:LSTM的堆叠层数,一般设置1-3层即可。
  • output_size:输出类别数,等于你的字符集总个数,对应生成时的候选字符数量。

示例定义代码:

# 假设字符集包含50个不同字符,按需调整
input_size = 1
hidden_size = 128
num_layers = 2
output_size = 50

2. 修正代码中的缩进错误

你的代码存在两处缩进问题,会导致模型无法正常初始化和前向传播:

  • self.fc = nn.Linear(...) 需缩进在__init__方法内部,与self.lstm同级
  • forward方法必须缩进在YourModelClass类内部,作为类的成员方法

修正后的模型类代码:

class YourModelClass(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
        self.fc = nn.Linear(hidden_size, output_size)  # 修正缩进

    def forward(self, x):  # 修正缩进,归属类方法
        out, (h_n, c_n) = self.lstm(x)
        out = self.fc(out[:, -1, :])
        return out

3. 补充缺失的字符-索引映射

代码中用到的char2int和int2char未定义,需根据你的字符集创建这两个映射,示例如下:

# 示例字符集:小写字母+数字+常用标点
chars = 'abcdefghijklmnopqrstuvwxyz0123456789!?'
char2int = {char: idx for idx, char in enumerate(chars)}
int2char = {idx: char for idx, char in enumerate(chars)}

4. 修正起始索引的处理逻辑

answer是输入的字符串,直接赋值给start_index后调用.item()会报错(非tensor类型),修正如下:

start_index = char2int.get(answer, 0)  # 获取输入字符对应索引,默认用0兜底
generated_text = int2char[start_index]

完整修正后的代码示例

import torch
import torch.nn as nn
import torch.optim as optim

# 定义字符-索引映射
chars = 'abcdefghijklmnopqrstuvwxyz0123456789!?'
char2int = {char: idx for idx, char in enumerate(chars)}
int2char = {idx: char for idx, char in enumerate(chars)}

# 定义模型参数
input_size = 1
hidden_size = 128
num_layers = 2
output_size = len(chars)  # 输出大小等于字符集总数

# 修正后的模型类
class YourModelClass(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        # 调整输入形状适配LSTM要求:(seq_len, batch_size, input_size)
        x = x.unsqueeze(-1).float()
        out, (h_n, c_n) = self.lstm(x)
        out = self.fc(out[:, -1, :])
        return out

answer = input("请输入起始字符: ")

# 实例化模型并加载权重
model = YourModelClass(input_size, hidden_size, num_layers, output_size)
model.load_state_dict(torch.load('model.ckpt'))
model.eval()

# 生成起始文本
start_index = char2int.get(answer, 0)
generated_text = int2char[start_index]

num_generated = 10

with torch.no_grad():
    for i in range(num_generated):
        input_seq = torch.tensor([char2int[generated_text[-1]]]).unsqueeze(0)
        output = model(input_seq)
        output_idx = torch.argmax(output.squeeze()).item()
        generated_text += int2char[output_idx]

print(generated_text)

内容的提问来源于stack exchange,提问作者rtyrtyrtyqa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:01:10