Pytorch:嵌入层后,无法获得<class'torch.Tensor'>的repr

问题描述

我是PyTorch的新手,正在尝试复制该项目:https://github.com/eXascaleInfolab/ActiveLink

但是,Feedforward()中出现了困扰我数天的错误,这是代码的一部分(有关模型的完整代码,请参见https://github.com/eXascaleInfolab/ActiveLink/blob/master/models.py):

def forward(self,e1,rel,batch_size=None,weights=None):
......
        e1_embedded = self.emb_e(e1).view(-1,1,10,20)
        rel_embedded = self.emb_rel(rel).view(-1,20)
        stacked_inputs = torch.cat([e1_embedded,rel_embedded],2)  # out: (128L,1L,20L,20L)

这给了我错误(我正在使用GPU):

THCudaCheck FAIL file=/pytorch/aten/src/THC/generic/THCTensorMath.cu line=196 error=710 : device-side assert triggered
Traceback (most recent call last):
  File "main.py",line 147,in <module>
    main()
  File "main.py",line 136,in main
    model = run_Meta_incremental(config,model,train_batcher,test_rank_batcher)
  File "/home/yonghui/yt/Meta_incr_training.py",line 158,in run_Meta_incremental
    g = run_inner(config,task)
  File "/home/yonghui/yt/Meta_incr_training.py",line 120,in run_inner
    pred = model.forward(e1,rel)
  File "/home/yonghui/yt/models.py",in forward
    stacked_inputs = torch.cat([e1_embedded,2)
RuntimeError: cuda runtime error (710) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorMath.cu:196
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T,IndexType>,TensorInfo<T,TensorInfo<long,int,IndexType,long) [with T = float,IndexType = unsigned int,DstDim = 2,SrcDim = 2,IdxDim = -2,IndexIsMajor = true]: block: [189,0],thread: [0,0] Assertion `srcIndex < srcSelectDimsize` Failed.
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T,thread: [1,thread: [2,thread: [3,thread: [4,thread: [5,thread: [6,thread: [7,0] Assertion `srcIndex < srcSelectDimsize` Failed.

我使用Debugger试图找出哪里出了问题: 在嵌入e1rel之前,它们都是int64中的张量,形状为torch.Size([128,1])

e1可以正常嵌入,并转换为torch.float32torch.Size([128,20])。但是,在rel通过emb_rel的嵌入层之后,调试器将所有Tenros显示Unable to get repr for <class 'torch.Tensor'>

这是怎么回事?我该如何解决?谢谢您的帮助!

解决方法

该错误出现在此错误消息被打印之前的某处,可能是在重塑中。

调用视图不会更改基础数据,它只会更改其“视图”,并且会延迟执行。如果无法使用张量的不同视图(例如,由于张量未连续存储在内存中,请参见PyTorch forum),则在第一次应使用张量的内容时,它会失败。您要调试打印张量时的情况。

要进行调试,请考虑将view替换为reshape(参见StackOverflow thread on the difference between view and reshape)。

,

使用调试器并检查输入张量即可解决此问题。

在嵌入之前检查张量后,我发现某些元素超出了范围,特别是对于索引从0开始的情况。