在自定义LearnerCallb中尝试应用\-tfms时如何修复'Expected object of backend CUDA'

2024-10-04 09:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

对机器学习、fastai、pytorch和python非常陌生,我试图在手动修改图像之后调整LearnerCallback来进行转换。当我开始工作的时候学习。适应一个周期,立即中断,如下所示:

我试着把.to(torch.device('cuda'))粘到我能想到的任何地方

    #...
    def on_batch_begin(self, last_input, last_target, train, **kwargs):
        if not train: return

        #Get new input
        new_input = last_input.clone()
        new_target = last_target.clone()
        tfms = get_transforms(max_zoom=1.5)

        # modify the images here in some other way

        # apply_tfms
        for i in range(len(new_input)):            
            new_input[i] = Image(new_input[i]).apply_tfms(tfms[0]).data
            new_target[i] = Image(new_target[i]).apply_tfms(tfms[0], do_resolve=False).data
    #...

倒数第二行中的“apply \tfms”是回溯的罪魁祸首,结尾是:

    553     m[1,0] *= w/h
    554     c.flow = c.flow.view(-1,2)
--> 555     c.flow = torch.addmm(m[:2,2], c.flow,  m[:2,:2].t()).view(size)
    556     return c
    557 

RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1'

有没有一种方法可以在LearnerCallback中应用转换而不出现错误,或者有没有另一种方法可以让我的LearnerCallback添加learn.callback_fns.append以在apply之前运行,tfms在修改的输入和目标图像上运行相同的转换?我需要从目标图像的像素信息来修改输入图像。我也需要这个过程中应用的培训和验证。你知道吗

如果有什么不同,我会得到相同的错误,即使我没有修改克隆的图像之前,应用\-tfms。你知道吗


Tags: in图像targetnewforinputreturnclone
1条回答
网友
1楼 · 发布于 2024-10-04 09:30:46

这里的问题是,有些张量在CPU上,有些在GPU上。你知道吗

您必须确保所有的张量都在同一个设备上(根据情况而定,可以是GPU或CPU)才能消除这个错误。如果我没记错的话,fastai get_transforms将创建应该在数据加载期间应用的转换(以及CPU),因此您可能需要查看get\u转换的源代码,并对其进行调整,以便可以在GPU上的张量上调用它(如果您正在GPU上进行培训,则最后一个\u输入应该在GPU上)。你知道吗

另一个解决方案是在数据加载期间应用这些转换,在这种情况下,您的数据张量将位于CPU上。你知道吗

相关问题 更多 >