Нужна помощь в масштабировании многомерных тензоров Pytorch

#python-3.x #deep-learning #pytorch #tensor

Вопрос:

У меня есть несколько тензоров Pytorch в диапазоне от 1-мерного (например torch.Size([128] ) до 4-мерного (например torch.Size([256, 128, 3, 3]) . Каждый тензор представляет собой вес в нейронной сети.

Для каждого из этих тензоров мне нужно увеличить 1 или 2 измерения, например

  • torch.Size([128]) Для torch.Size([256]) ,
  • torch.Size([256, 128, 3, 3]) Для torch.Size([512, 256, 3, 3]) ,
  • torch.Size([3, 256, 1, 1]) Для torch.Size([3, 512, 1, 1]) .

Я посмотрел на torch.nn.Upsample or nn.functional.interpolate и аналогичные функции, но я не могу найти хорошего способа сделать это комплексно для каждой из моих проблем, кроме как жестко ее закодировать.

В случае простого примера 1D я ищу масштабированную версию моего исходного тензора, что-то вроде этого:

  torch.arange(0, 9, dtype=torch.float32)
 t = torch.arange(0, 9, dtype=torch.float32)
 # = tensor([0., 1., 2., 3., 4., 5., 6., 7., 8.])
 t_up = upsample(factor=2)
 # = tensor([0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5 7., 7.5, 8.])
 

Любая помощь будет признательна.

Ответ №1:

Ваш шаблон очень нерегулярен, так как:

  • torch.Size([128]) к torch.Size([256]) — 1D и интерполировать все
  • torch.Size([256, 128, 3, 3]) для torch.Size([512, 256, 3, 3]) 4D и масштабирования первых двух измерений
  • torch.Size([3, 256, 1, 1]) к torch.Size([3, 512, 1, 1]) 3D и масштабировать только второе измерение без первого

В этом случае нет четкого способа обойти «жесткое кодирование», и «умные» подходы, вероятно, только поднимут брови, когда кто-то просматривает ваш код.

  • В вашем 1D примере используется linear режим с align_corners=False , не уверен в 4D примерах, но для них потребуется bilinear , по крайней мере, режим.
  • size для torch.nn.functional.interpolate выравнивания 1 размеров по какой-то причине, следовательно, только scale_factor один вариант.
  • Некоторые данные должны быть изменены для интерполяции

В целом, жесткое кодирование и некоторые комментарии являются лучшим вариантом в этом случае, поскольку нет четкого способа сгруппировать различные способы расширения заданных вам тензоров (и попытка быть умным в этом случае, вероятно, является тупиком).

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

1. спасибо, первые 2 действительно выполнимы Upsample . Однако я не нашел правильного решения третьей проблемы, когда любое из первых 2 измерений нуждается в дополнительной дискретизации.