Python 除非每次迭代都初始化torch.lstm,否则使用torch.lstm会引起NAN

Python 除非每次迭代都初始化torch.lstm,否则使用torch.lstm会引起NAN,python,pytorch,lstm,nan,Python,Pytorch,Lstm,Nan,我尝试使用torch.nn.lstm来预测未来的零售价格。随着时间的推移,我的数据涵盖了不同的存储。在每次迭代中,我绘制两个存储的批大小,然后在数据中涵盖的时间段内按顺序训练LSTM。 我的问题是——在每次迭代中,我创建一个month X 2-stores数据集(为了这篇文章),并在模型中运行它。 在开始之前,我使用init函数初始化它。在这种情况下,生成的张量充满了nan。另一方面,如果每次都使用init,结果就是实际数字。 lstm模型是 n_特征=68 n_步数=3 批量大小=2 seq_

我尝试使用
torch.nn.lstm
来预测未来的零售价格。随着时间的推移,我的数据涵盖了不同的存储。在每次迭代中,我绘制两个存储的批大小,然后在数据中涵盖的时间段内按顺序训练LSTM。
我的问题是——在每次迭代中,我创建一个
month X 2-stores
数据集(为了这篇文章),并在模型中运行它。
在开始之前,我使用
init
函数初始化它。在这种情况下,生成的张量充满了
nan
。另一方面,如果每次都使用
init
,结果就是实际数字。
lstm模型是

n_特征=68
n_步数=3
批量大小=2
seq_len=n_步数*批量大小
n_hidden=2#隐藏状态数
n_层=2#LSTM层数(堆叠)
# 2. 建立模型
SmallLSTM类(火炬nn模块):
定义初始(自、n个特征、顺序、n个隐藏、n个图层、n个步骤、批次大小):
super(smallsm,self)。\uuuu init\uuuuu()
self.n_特征=n_特征
self.seq_len=seq_len
self.n_hidden=n_hidden#隐藏状态数
self.n_层=n_层#LSTM层数(堆叠)
self.n_步数=n_步数
self.batch\u size=批次大小
self.l_lstm=torch.nn.lstm(输入尺寸=self.n_特征,
隐藏大小=self.n\u隐藏,
num_layers=self.n_layers,
批次_first=True,
辍学率=0.1)
#根据Pyrotch文档,LSTM输出为
#(批次大小、序列长度、数量方向*隐藏大小)
#首先考虑批次时=真
self.l\u linear=torch.nn.linear(self.n\u步长*self.batch\u大小*self.n\u隐藏,self.batch\u大小)
def初始隐藏(自身、批次大小):
#即使批处理_first=True,这仍然与文档相同
隐藏状态=火炬0(self.n\u层,1,self.n\u隐藏)
cell_state=torch.zero(self.n_层,1,self.n_隐藏)
self.hidden=(隐藏状态,单元格状态)
def前进(自身,x):
#批量大小,顺序长度,=x.大小()
lstm_out,self.hidden=self.l_lstm(x,self.hidden)
#lstm_out(批处理_first=True)为
#(批次大小、序列长度、数量方向*隐藏大小)
#对于下面的线性层,我们希望保持批量大小的尺寸,并合并其余部分
#.continuous()->解决张量兼容性错误
lstm_out=lstm_out.重塑((1,self.n_步骤*self.batch_大小*self.n_隐藏))
lstm_out=自线性(lstm_out)
#self.hidden=[self.hidden中元素的elem.detach_u2;()
返回lstm_
没有每次迭代的初始化,代码看起来是这样的

batch\u size=2
存储\u绘制\u idx=2
Stores\u train\u batch=Stores\u train.iloc[Stores\u drawing\u idx:Stores\u drawing\u idx+批量大小]
存储\u列\u批。重置\u索引(就地=真,下降=真)
存储\u绘制\u idx+=批量大小
月份=Xy['Month'].sort_values().unique()
n_步数=3
mv_net=SmallLSTM(n_特征=n_特征\
seq_len=seq_len\
n_hidden=n_hidden\
n_层=n_层\
n_步数=n_步数\
批次大小=批次大小)
mv_net.init_hidden(1)
序列批处理=pd.DataFrame(列=Xy.columns)
对于范围内的j(存储列批形状[0]):
X=Xy\U temp\u month.drop(['origin\u address'、'Retailer\u origin'、'month'、'target'],axis=1)。value.astype('float32'))
y=Xy临时月[Xy临时月['month']==months临时月[-1]['target']
X=焊炬从(X整形(1,n步*批量大小,X形状[1]))
X=火炬.张量(X,dtype=火炬.浮标32)
y=torch.tensor(y=torch.values.astype('float32'),dtype=torch.float32)。重塑([len(y)])
n_特征=68
seq_len=n_步数*批量大小
n_hidden=2#隐藏状态数
n_层=2#LSTM层数(堆叠)
标准=torch.nn.MSELoss(reduce='sum')
optimizer=torch.optim.Adam(mv_net.parameters(),lr=0.05,weight_decay=1500)
有效损耗最小值=1000
#mv_net.init_hidden(1)
输出=毫伏净功率(X)
损耗=标准(输出,y)
打印(loss.item())
在这种情况下,每次运行行
print(loss.item())
时,结果都是
nan
。 如果我加上那行
mv_net.init_hidden(1)
我就得到了损失值

我该怎么办?
谢谢

您能否确认在
forward()
中正确生成了
self.hidden
,并且具有您期望的类型?
nan
错误的一个常见来源是pytorch中的类型不匹配。另外,为什么每次迭代都要重新定义优化器和损失函数?这似乎可能会导致错误,因为Adam在迭代过程中维护一些运行平均参数