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
,否则将引发另一个错误