предисловие:
"RuntimeError: Ожидаемый объект скалярного типа Double, но получил скалярный тип Float", такая ошибка должна была возникать бесчисленное количество раз во время выполнения, отладка кода - это очень головная боль, и это головная боль, но ее нужно решить. Некоторые ошибки видны из подсказки, где есть проблема, но для решения этой проблемы не обязательно менять код в подсказке.
Лучший способ решить проблему такого рода — вывести весь процесс и увидеть тип, форму и т. д. параметров в каждой строке кода во время выполнения. Тем самым быстро и точно определить место, которое необходимо изменить.
Обратите внимание и обновляйте две статьи о компьютерном зрении каждый день
torch snooper
В Pytorch есть очень полезный инструмент — torchsnooper, который может выводить всю информацию о каждой строке кода этой функции во время запущенного процесса, добавляя объявление перед функцией, которая может содержать ошибки.
Установить:
pip install torchsnooper
Есть еще один такой же инструмент — snoop.
pip install snoop
Пример:
import torch
def myfunc(mask, x):
y = torch.zeros(6)
y.masked_scatter_(mask, x)
return y
mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')
source = torch.tensor([1.0, 2.0, 3.0], device='cuda')
y = myfunc(mask, source)
После запуска возникает следующая проблема:
RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'mask'
Решение: используйте torchsnooper, добавьте import torchsnooper и @torchsnooper.snoop() перед кодом.
import torch
import torchsnooper
@torchsnooper.snoop()
def myfunc(mask, x):
y = torch.zeros(6)
y.masked_scatter_(mask, x)
return y
mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')
source = torch.tensor([1.0, 2.0, 3.0], device='cuda')
y = myfunc(mask, source)
Запустив его, вы увидите следующее:
Starting var:.. mask = tensor<(6,), int64, cuda:0>
Starting var:.. x = tensor<(3,), float32, cuda:0>
21:41:42.941668 call 5 def myfunc(mask, x):
21:41:42.941834 line 6 y = torch.zeros(6)
New var:....... y = tensor<(6,), float32, cpu>
21:41:42.943443 line 7 y.masked_scatter_(mask, x)
21:41:42.944404 exception 7 y.masked_scatter_(mask, x)
Из подсказки видно, что Y — это тензор ЦП, поэтому вы можете изменить y на
y = torch.zeros(6, device='cuda')
Повторный запуск вызовет новые проблемы:
RuntimeError: Expected object of scalar type Byte but got scalar type Long for argument #2 'mask'
Тип скаляра должен быть int, но использовался long. В подсказке от torchsnooper выше видно, что тип маски - int64, значит, проблема именно здесь, и ее можно изменить на uint8.
mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda', dtype=torch.uint8)
snooper
Вот еще один метод, который я использовал.
Используйте объявление @snoop перед функцией, в которой могут быть ошибки, и при выполнении функции будет отображаться вся информация о функции.
import torch
import torchsnooper
import snoop
torchsnooper.register_snoop()#在文件前面调用这个函数
@snoop #把这个声明放在想要输出的函数前
def myfunc(mask, x):
y = torch.zeros(6)
y.masked_scatter_(mask, x)
return y
mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')
source = torch.tensor([1.0, 2.0, 3.0], device='cuda')
y = myfunc(mask, source)
Другое использование snoop: используйте с torchsnooper.snoop()
with torchsnooper.snoop():
for _ in range(100):
optimizer.zero_grad()
pred = model(x)
squared_diff = (y - pred) ** 2
loss = squared_diff.mean()
print(loss.item())
loss.backward()
optimizer.step()
Результат выглядит следующим образом:
New var:....... x = tensor<(4, 2), float32, cpu>
New var:....... y = tensor<(4,), float32, cpu>
New var:....... model = Model( (layer): Linear(in_features=2, out_features=1, bias=True))
New var:....... optimizer = SGD (Parameter Group 0 dampening: 0 lr: 0....omentum: 0 nesterov: False weight_decay: 0)
22:27:01.024233 line 21 for _ in range(100):
New var:....... _ = 0
22:27:01.024439 line 22 optimizer.zero_grad()
22:27:01.024574 line 23 pred = model(x)
New var:....... pred = tensor<(4, 1), float32, cpu, grad>
22:27:01.026442 line 24 squared_diff = (y - pred) ** 2
New var:....... squared_diff = tensor<(4, 4), float32, cpu, grad>
22:27:01.027369 line 25 loss = squared_diff.mean()
New var:....... loss = tensor<(), float32, cpu, grad>
22:27:01.027616 line 26 print(loss.item())
22:27:01.027793 line 27 loss.backward()
22:27:01.050189 line 28 optimizer.step()
Форма y — (4,), а форма pred — (4,1). Следовательно, проблема в том, что в pred есть еще одно измерение, и для решения проблемы в код можно добавить строку pred = model(x).squeeze().
Цитировать:GitHub.com/Variegated Styles Not So/T…
Эта статья взята из серии технических сводок Технического руководства CV для общедоступных аккаунтов.
Добро пожаловать в техническое руководство CV для общедоступной учетной записи, в котором основное внимание уделяется техническому обзору компьютерного зрения, отслеживанию новейших технологий и интерпретации классических статей.
Ответьте на ключевое слово «Техническое резюме» в официальном аккаунте, чтобы получить резюме следующих статей в формате pdf.
Другие статьи
Краткое изложение методов недообучения и переобучения
Краткое изложение общих идей бумажных инноваций
Резюме методов эффективного чтения англоязычной литературы по направлению CV
Обзор непродолжительного обучения компьютерному зрению
Краткий обзор дистилляции знаний
Оптимизировать скорость чтения видео OpenCV
Краткое изложение методов функции потерь
Техническое резюме механизма внимания
Краткое изложение технологии пирамиды функций
Краткое изложение технологии объединения
Краткое изложение методов увеличения данных
Резюме эволюции структуры CNN (1) Классическая модель
Резюме эволюции структуры CNN (2) Облегченная модель
Резюме эволюции структуры CNN (3) Принципы проектирования
Как увидеть будущее направление компьютерного зрения
Краткое изложение технологии визуализации CNN (1) - визуализация карты функций
Краткое изложение технологии визуализации CNN (2) - визуализация ядра свертки
Краткое изложение технологии визуализации CNN (3) - визуализация класса
Краткое описание технологии визуализации CNN (4) - инструменты и проекты визуализации