Python Pytork在评估模式下输入时崩溃
我的模型训练得非常好,但当我将其切换到评估模式时,它不喜欢输入样本的数据类型:Python Pytork在评估模式下输入时崩溃,python,deep-learning,neural-network,pytorch,transformer,Python,Deep Learning,Neural Network,Pytorch,Transformer,我的模型训练得非常好,但当我将其切换到评估模式时,它不喜欢输入样本的数据类型: Traceback (most recent call last): File "model.py", line 558, in <module> main_function(train_sequicity=args.train) File "model.py", line 542, in main_function out = model(user, bspan, respons
Traceback (most recent call last):
File "model.py", line 558, in <module>
main_function(train_sequicity=args.train)
File "model.py", line 542, in main_function
out = model(user, bspan, response_, degree)
File "/home/memduh/git/project/venv/lib/python3.6/site-packages/torch/nn/modules/module.py", line 541, in __call__
result = self.forward(*input, **kwargs)
File "model.py", line 336, in forward
self.params['bspan_size'])
File "model.py", line 283, in _greedy_decode_output
out = decoder(input_, encoder_output)
File "/home/memduh/git/project/venv/lib/python3.6/site-packages/torch/nn/modules/module.py", line 541, in __call__
result = self.forward(*input, **kwargs)
File "model.py", line 142, in forward
tgt = torch.cat([go_tokens, tgt], dim=0) # concat GO_2 token along sequence lenght axis
RuntimeError: Expected object of scalar type Long but got scalar type Float for sequence element 1 in sequence argument at position #1 'tensors'
回溯(最近一次呼叫最后一次):
文件“model.py”,第558行,在
主功能(序列号=参数序列号)
文件“model.py”,第542行,在主函数中
out=模型(用户、bspan、响应、度)
文件“/home/memduh/git/project/venv/lib/python3.6/site packages/torch/nn/modules/module.py”,第541行,在__
结果=自我转发(*输入,**kwargs)
文件“model.py”,第336行,向前
self.params['bspan_size'])
文件“model.py”,第283行,在解码输出中
输出=解码器(输入、编码器、输出)
文件“/home/memduh/git/project/venv/lib/python3.6/site packages/torch/nn/modules/module.py”,第541行,在__
结果=自我转发(*输入,**kwargs)
文件“model.py”,第142行,向前
tgt=火炬。cat([go_标记,tgt],dim=0)#沿序列长度轴的concat go_2标记
RuntimeError:应为标量类型Long的对象,但在位置#1'张量处的序列参数中,序列元素1的标量类型浮点
这似乎发生在发生串联的代码部分。这是一个类似于pytorch transformer的架构,只是修改为有两个解码器:
def forward(self, tgt, memory):
""" Call decoder
the decoder should be called repeatedly
Args:
tgt: input to transformer_decoder, shape: (seq, batch)
memory: output from the encoder
Returns:
output from linear layer, (vocab size), pre softmax
"""
go_tokens = torch.zeros((1, tgt.size(1)), dtype=torch.int64) + 3 # GO_2 token has index 3
tgt = torch.cat([go_tokens, tgt], dim=0) # concat GO_2 token along sequence lenght axis
+
mask = tgt.eq(0).transpose(0,1) # 0 corresponds to <pad>
tgt = self.embedding(tgt) * self.ninp
tgt = self.pos_encoder(tgt)
tgt_mask = self._generate_square_subsequent_mask(tgt.size(0))
output = self.transformer_decoder(tgt, memory, tgt_mask=tgt_mask, tgt_key_padding_mask=mask)
output = self.linear(output)
return output
def转发(自身、tgt、内存):
“”“呼叫解码器
应该重复调用解码器
Args:
tgt:输入到transformer_解码器,形状:(顺序,批次)
内存:编码器的输出
返回:
线性层输出(vocab大小),预softmax
"""
go#u令牌=torch.zeros((1,tgt.size(1)),dtype=torch.int64)+3#go#u 2令牌具有索引3
tgt=火炬。cat([go_标记,tgt],dim=0)#沿序列长度轴的concat go_2标记
+
mask=tgt.eq(0)。转置(0,1)#0对应于
tgt=自嵌入(tgt)*self.ninp
tgt=自身位置编码器(tgt)
tgt\u mask=self.\u生成\u正方形\u后续\u mask(tgt.size(0))
输出=self.transformer\u解码器(tgt、内存、tgt\u掩码=tgt\u掩码、tgt\u键\u填充\u掩码=掩码)
输出=自线性(输出)
返回输出
连接块中间的级联位是问题发生的地方。奇怪的是,它工作得非常好,可以在列车模式下运行,损耗也会下降。此问题仅在评估模式下出现。问题可能是什么?
错误似乎很清楚:tgt
是Float
,但它希望它是长的。为什么?
在您的代码中,您定义go_令牌
为torch.int64
(即Long
):
def转发(自身、tgt、内存):
go#u令牌=torch.zeros((1,tgt.size(1)),dtype=torch.int64)+3#go#u 2令牌具有索引3
tgt=火炬。cat([go_标记,tgt],dim=0)#沿序列长度轴的concat go_2标记
# [...]
您可以说go_令牌
应该与tgt
具有相同的数据类型,从而避免该错误:
def转发(自身、tgt、内存):
go#u令牌=火炬。零((1,tgt.size(1)),dtype=tgt.dtype)+3#go#u 2令牌具有索引3
tgt=火炬。cat([go_标记,tgt],dim=0)#沿序列长度轴的concat go_2标记
# [...]
现在,如果代码的其余部分依赖于tgt
是torch.int64
,那么您应该确定为什么tgt
在训练时是torch.int64
,在测试时是torch.float32
,否则将引发另一个错误