0

对机器学习、fastai、pytorch 和 python 来说非常陌生,我试图在手动修改图像后调整 LearnerCallback 来进行转换。当我开始我的 learn.fit_one_cycle 时,它​​会立即中断,如下所示:

我试过坚持.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 中应用转换而不会出现该错误,或​​者有一种替代方法可以在 apply_tfms 在修改后的输入和目标图像上运行相同的转换之前添加我的 LearnerCallbacklearn.callback_fns.append以运行?我需要来自目标图像的像素信息来修改输入图像。我还需要在培训和验证期间应用此过程。

如果它有任何区别,即使我没有在 apply_tfms 之前修改克隆的图像,我也会得到相同的错误。

4

1 回答 1

0

您在这里遇到的问题是您的一些张量在 CPU 上,而另一些在 GPU 上。

您必须确保所有张量都在同一设备上(GPU 或 CPU 取决于具体情况)才能消除此错误。如果我没记错的话,fastaiget_transforms将创建应该在数据加载期间应用的转换(等等 CPU),所以您可能需要查看 get_transforms 的源并对其进行调整,以便可以在您的张量上调用它GPU。(如果你在 GPU 上训练,last_input 应该在 GPU 上)。

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

于 2019-08-19T14:36:10.773 回答