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
相关产品推荐
相关产品推荐

