python - RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu on transormer
问题描述
def nopeak_mask(size, opt):
np_mask = np.triu(np.ones((1, size, size)),k=1).astype('uint8')
np_mask =Variable(torch.from_numpy(np_mask) == 0)
if opt.device == 0:
np_mask = np_mask.cuda()
return np_mask
def create_masks(src, trg, opt):
src_mask = (src != opt.src_pad).unsqueeze(-2)
if trg is not None:
trg_mask = (trg != opt.trg_pad).unsqueeze(-2)
size = trg.size(1) # get seq_len for matrix
np_mask = nopeak_mask(size, opt)
#if trg.is_cuda:
# np_mask.cuda()
print(np_mask)
print(trg_mask)
trg_mask = trg_mask & np_mask
else:
trg_mask = None
return src_mask, trg_mask
这段代码在这一行有问题trg_mask = trg_mask & np_mask
我检查了两个张量我确信在不同的设备中可以找到源代码here。
解决方案
听起来 trg_mask 和 np_mask 是存储在两个不同设备(cpu 和 cuda:0)上的张量。如果你想对它们执行操作,它们都需要在任何一个 cpu 上,或者它们都需要在 cuda:0 上。
根据给出的信息,我不确定哪个变量在哪个设备上,但如果你想将变量从 cuda:0 移动到 cpu,你可以这样做。
var = var.detach().cpu().numpy()
推荐阅读
- r - 如何在 R 中获取非常大的文本文件中的确切行数?
- c# - 如何检测我提取的电子邮件是否被退回
- spring-cloud-dataflow - 如何在任何时候存储有效负载以供以后使用
- excel - Excel:用于识别一列中的文本(基于正则表达式)的脚本,并在找到后将其粘贴到下一列
- c# - 在 WPF 中排序期间,应在 Datagrid 视图中修复第一行
- python - 在 ROS 中安装 imutils
- r - 在 tidyeval 中将单个参数作为点传递
- java - 通过 Advapi32 (JNA API) 在 Java 中更改现有 Windows 服务的用户名和密码
- nodes - 从 LightGBM 模型访问树和节点
- javascript - 如何将文本行拆分为 JavaScript 数组,其中一些元素用引号括起来并包含逗号?