Инструмент отладки кода Pytorch --torchsnooper

компьютерное зрение

предисловие:

"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.

Другие статьи

Ши Байсинь из Пекинского университета: С точки зрения рецензента расскажите о том, как написать статью CVPR.

Siamese networkСводка

Краткое изложение терминологии компьютерного зрения (1) Создание системы знаний для компьютерного зрения

Краткое изложение методов недообучения и переобучения

Резюме методов нормализации

Краткое изложение общих идей бумажных инноваций

Резюме методов эффективного чтения англоязычной литературы по направлению CV

Обзор непродолжительного обучения компьютерному зрению

Краткий обзор дистилляции знаний

Оптимизировать скорость чтения видео OpenCV

Сводка NMS

Краткое изложение методов функции потерь

Техническое резюме механизма внимания

Краткое изложение технологии пирамиды функций

Краткое изложение технологии объединения

Краткое изложение методов увеличения данных

Резюме эволюции структуры CNN (1) Классическая модель

Резюме эволюции структуры CNN (2) Облегченная модель

Резюме эволюции структуры CNN (3) Принципы проектирования

Как увидеть будущее направление компьютерного зрения

Краткое изложение технологии визуализации CNN (1) - визуализация карты функций

Краткое изложение технологии визуализации CNN (2) - визуализация ядра свертки

Краткое изложение технологии визуализации CNN (3) - визуализация класса

Краткое описание технологии визуализации CNN (4) - инструменты и проекты визуализации