Pytorch Pyrotch LSTM的损耗不会减少

Pytorch Pyrotch LSTM的损耗不会减少,pytorch,lstm,recurrent-neural-network,Pytorch,Lstm,Recurrent Neural Network,我是Pytork的新手,正在寻求您对lstm实施的帮助。我有一个单层LSTM,后面是一个完全连接的层和sigmoid(实现深度知识跟踪) 示例输入输出对如下所示:, 输入= [1,0,0,0], [0,1,0,0] [0,0,1,0] [0,0,0,1]] 输出= [1,0], [0,0], [0,1], [-1,-1]] 我有下面的LSTM代码,希望计算二进制交叉熵作为损失。然而,损失并没有随着时代的推移而减少。我关注了几个博客来实现这一点,我认为这是正确的。我的代码有什么问题吗?如果您能花几

我是Pytork的新手,正在寻求您对lstm实施的帮助。我有一个单层LSTM,后面是一个完全连接的层和sigmoid(实现深度知识跟踪)

示例输入输出对如下所示:, 输入=

[1,0,0,0],

[0,1,0,0]

[0,0,1,0]

[0,0,0,1]]

输出= [1,0],

[0,0],

[0,1],

[-1,-1]]

我有下面的LSTM代码,希望计算二进制交叉熵作为损失。然而,损失并没有随着时代的推移而减少。我关注了几个博客来实现这一点,我认为这是正确的。我的代码有什么问题吗?如果您能花几分钟的时间查看代码,并帮助建议代码是否有问题,那就太好了


类构建模型(nn.Module):
on\gpu=错误
定义初始单位(自我,数量技能,批量大小=2,lstm单位=200):
super(BuildModel,self)。\uuuu init\uuuuu()
self.lstm_单位=lstm_单位
self.batch\u size=批次大小
self.output\u dim=num\u技能
self.input\u dim=num\u skills*2
self.seq_len=seq_len
self.\u构建\u模型()
定义构建模型(自):
self.lstm=nn.lstm(
输入尺寸=自输入尺寸,
隐藏大小=self.lstm\u单位,
层数=1,
批次_first=True,
)
self.hidden_to_skills=nn.Linear(self.lstm_单位,self.output_dim)
def init_隐藏(自):
hidden_a=torch.randn(1,自我批量大小,自我lstm单位)
隐藏\u b=火炬.randn(1,自我批量大小,自我lstm单位)
如果self.onGPU:
hidden_a=hidden_a.cuda()
hidden_b=hidden_b.cuda()
hidden_a=变量(hidden_a,需要_grad=True)
hidden_b=变量(hidden_b,需要_grad=True)
返回(隐藏的\u a、隐藏的\u b)
def前进(自身、X、X_长度):
self.hidden=self.init_hidden()
批量大小,顺序长度,=X.大小()
##X为形状批次大小、序列长度、数量*2
X=torch.nn.utils.rnn.pack\U padded\U序列(X,X\U长度,批次\U first=True,强制\U排序=False)
十、 self.hidden=self.lstm(X,self.hidden)
十、 =火炬.nn.utils.rnn.pad\u包装顺序(X,批次\u第一=真)
#从(批量大小、顺序+长度、lstm单位)传输数据-->(批量大小*顺序长度、lstm单位)
X=X.continuous()
X=X.view(-1,X.shape[2])
X=自我隐藏技能(X)
X=火炬。nn。功能性。乙状结肠(X)
#返回预测
返回X
def损失(自我、帽子、阈值、序列):
#展平标签
Y=Y.视图(-1)
Y_hat=Y_hat.视图(-1,序列长度*自输出尺寸*自批大小)
掩码=(Y>-1).float()
掩码长度=(Y>-1).long()
nb_tokens=int(torch.sum(mask.item())
Y_帽子=Y_帽子[范围(Y_帽子形状[0])]*遮罩
Y_帽子=Y_帽子。重塑(-1)
Y=Y[范围(Y.形状[0])]*遮罩长
Y=Y.float()
Y_hat=(Y_hat>0.0).float()*1.0
损耗=torch.nn.BCELoss()
ce_损失=损失(Y_hat,Y)
返回变量(ce_损失,需要_梯度=真)
###训练
学习率=.1
总步进=长度(装载机)
model=BuildModel(num_skills,2200)
optimizer=torch.optim.Adam(model.parameters(),lr=learning\u rate)
对于范围内的历元(num_历元):
总损失=0.0
对于枚举(加载器)中的i,(X,y,长度,序号):
X=火炬。从_numpy(X)。浮动()
y=火炬。从_numpy(y).long()
输出=型号(X,长度)
损耗=模型损耗(输出,y,0.5,序号)
optimizer.zero_grad()
loss.backward()
optimizer.step()

能否显示训练循环代码?感谢您的查看。我已经用训练循环代码更新了这个问题。