cpu运行下报错:IndexError: index out of range in self;GPU上运行时报错:CUDA error: CUBLAS_STATUS_NOT_INITIALIZED

 前提:代码中包含nn.Embedding()语句,且发生如下情况:

1.cpu运行下报错:IndexError: index out of range in self

cpu运行下报错:IndexError: index out of range in self;GPU上运行时报错:CUDA error: CUBLAS_STATUS_NOT_INITIALIZED_第1张图片

 2.GPU运行下报错:RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublasCreate(handle)

cpu运行下报错:IndexError: index out of range in self;GPU上运行时报错:CUDA error: CUBLAS_STATUS_NOT_INITIALIZED_第2张图片

cpu运行下报错:IndexError: index out of range in self;GPU上运行时报错:CUDA error: CUBLAS_STATUS_NOT_INITIALIZED_第3张图片

 究其原因:全是nn.Embedding(num_embeddings ,embedding_dim)层的问题。num_embeddings代表编码库中一共有多少个选项,而其中的每一个选项都是长度为embedding_dim的向量表示的。

 nn.Embedding就是先生成一些嵌入向量,然后调用它对自己的输入进行编码时,通过索引来取值编码。

解决方法:

增大num_embedding的取值。

实例:

a=torch.tensor([[2,3,9],[5,6,8],[8,8,11]]

self.emd=nn.Embedding(10,16)

此时,如果直接使用:self.emd(x)会报上述错误,原因就是编码库中只包含索引值为0,1,2,3,4,5,6,7,8,9对应的编码向量,而a中前面八个在其中,唯有最后一个11不在,故报错“index out of range in self”

解决办法:增大num_embedding的取值。

将self.emd换为:self.emd=nn.EMbedding(12,16)即可,其实只要num_embeddings>11即可(万一不行,继续增大)

你可能感兴趣的:(大数据,pytorch,python)