Conv2d dengan kernel 1x1 tidak berfungsi pada GPU, meskipun berfungsi dengan baik pada CPU:
net = nn.Conv2d(1, 6, kernel_size=(1,1))
net.cuda()
x = Variable(torch.randn(1, 1, 100, 100))
x.cuda()
net(x)
Pesan eror:
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)
Saya mencoba menonaktifkan cudnn dengan torch.backends.cudnn.enabled = False
tetapi masih mendapatkan pesan kesalahan yang sama.
Saya menggunakan Ubuntu 14.04, Cuda 7.5, Cudnn 5.1.5, Python 3.5.2, dan Pytorch diinstal dari binari.
Jika Anda melihat lebih dekat pada tipe argumen yang diberikan ke conv, Anda akan melihat bahwa beberapa tensor adalah torch.cuda.FloatTensor
s, sementara yang lain adalah torch.FloatTensor
s. Anda mungkin lupa mengirim input ke GPU.
Untuk memperjelas, alih-alih:
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
Anda harus menulis:
x = Variable(torch.randn(1, 1, 100, 100).cuda())
Saya pikir lebih baik membuat model.cuda()
dan x.cuda()
berperilaku secara konsisten untuk menghindari kebingungan.
Komentar yang paling membantu
Untuk memperjelas, alih-alih:
Anda harus menulis: