لا يعمل Conv2d مع 1x1 kernel على وحدة معالجة الرسومات ، على الرغم من أنه يعمل بشكل جيد على وحدة المعالجة المركزية:
net = nn.Conv2d(1, 6, kernel_size=(1,1))
net.cuda()
x = Variable(torch.randn(1, 1, 100, 100))
x.cuda()
net(x)
رسالة خطأ:
TypeError: FloatSpatialConvolutionMM_updateOutput received an invalid combination of arguments - got (int, torch.FloatTensor, torch.FloatTensor, torch.cuda.FloatTensor, torch.cuda.FloatTensor, torch.FloatTensor, torch.FloatTensor, int, int, int, int, int, int), but expected (int state, torch.FloatTensor input, torch.FloatTensor output, torch.FloatTensor weight, [torch.FloatTensor bias or None], torch.FloatTensor finput, torch.FloatTensor fgradInput, int kW, int kH, int dW, int dH, int padW, int padH)
حاولت تعطيل cudnn باستخدام torch.backends.cudnn.enabled = False
ولكن ما زلت أتلقى نفس رسالة الخطأ.
أستخدم Ubuntu 14.04 و Cuda 7.5 و Cudnn 5.1.5 و Python 3.5.2 و Pytorch مثبتة من الثنائيات.
إذا نظرت عن كثب إلى أنواع الوسيطات التي تم منحها للتحويل ، فسترى أن بعض الموترات هي torch.cuda.FloatTensor
s ، في حين أن البعض الآخر هو torch.FloatTensor
s. ربما نسيت إرسال الإدخال إلى وحدة معالجة الرسومات.
للتوضيح ، بدلاً من:
x = Variable(torch.randn(1, 1, 100, 100))
x.cuda() # This creates a copy on the GPU and immediately discards it. "x" is still on the CPU
يجب ان تكتب:
x = Variable(torch.randn(1, 1, 100, 100).cuda())
أعتقد أنه من الأفضل جعل model.cuda()
و x.cuda()
يتصرفون باستمرار لتجنب الالتباس.
التعليق الأكثر فائدة
للتوضيح ، بدلاً من:
يجب ان تكتب: