Предупреждение о трассировке: преобразование тензора в индекс Python может привести к неправильной трассировке

#python #pytorch #torch

#python #pytorch #факел

Вопрос:

Я пытаюсь создать файл трассировки. Связанная часть кода здесь:

 def center_crop(self, layer, target_size):
    _, _, layer_height, layer_width = layer.size()

    diff_y = (layer_height - target_size[0]) // 2
    diff_x = (layer_width - target_size[1]) // 2
    return layer[:, :, diff_y:(diff_y   target_size[0]), diff_x:(diff_x   target_size[1])]

def forward(self, x, bridge):

    up = self.up(x)
    crop1 = self.center_crop(bridge, up.shape[2:])
    out = torch.cat([up, crop1], 1)
    out = self.conv_block(out)
  

В этой строке выдается предупреждение:

 return layer[:, :, diff_y:(diff_y   target_size[0]), diff_x:(diff_x   target_size[1])]
  

Затем я загрузил этот файл трассировки на C и сделал прогноз для тестового изображения. Затем я сравнил результат с выводом в python. Я заметил, что результаты сильно отличаются. Я предполагаю, что причина кроется в этом предупреждении.

Комментарии:

1. Вы правы: layer.size() имеет тип torch.Size (который будет отслеживаться правильно), но его деструктурирование _, _, layer_height, layer_width приводит к тому, что эти переменные становятся обычными python int s, которые не отслеживаются, и, таким образом, строка индексации работает так, как если бы индексы были постоянными. Это приведет к ошибкам в C , если ваш ввод приведет к тому, что эти переменные будут принимать другие значения, чем при создании трассировки. Теперь, в чем ваш вопрос?

2. @Jatentaki Я изменил эти строки: diff_y = (layer_height - target_size[0]) // 2 diff_x = (layer_width - target_size[1]) // 2 into diff_y = (layer.size()[2] - target_size[0]) // 2 diff_x = (layer.size()[3] - target_size[1]) // 2 Он по-прежнему выдает предупреждение в той же строке

3. Потому layer.size()[i] что также преобразуется в обычный int . В чем ваш вопрос? Вы пытаетесь заставить этот код работать на c ?

4. @Jatentaki Позвольте мне объяснить. Я пытаюсь сегментировать объекты, используя архитектуру Unet. Я получил хорошие результаты в Python. Я хотел бы сделать то же предсказание на C . Поэтому я создал файл трассировки. Я написал код на C для проверки изображения путем загрузки этого файла трассировки. Однако это дало другой результат.