Сохранить размер при изменении формы - PullRequest
0 голосов
/ 09 июля 2019

Допустим, у нас есть тензор размером B x C x W x H (как обычно для пакетов изображений), и мы хотим изменить его на B x M, где M = C*W*H. Есть ли встроенный способ сделать это без явного упоминания B?

Если мы знаем B заранее, мы можем выполнить следующее, даже не зная явно ни одного из трех C,W,H:

a = torch.randn(20,3,512,512)
b = a.reshape((20, -1)) #we can use -1 to infer the dimension `M`

Но можем ли мы сделать это, не зная B?

(я знаю, что мы, очевидно, могли бы найти B, используя B = a.shape[0], но у меня вопрос, возможно ли это и без знания B.)

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

В принципе, вы можете сделать ее универсальной функцией, работающей с любым размером пакета, просто используя первое измерение ввода, например:

a = torch.randn(20, 3, 512, 512)
b = a.reshape((a.shape[0], -1))

Вы можете заключить ее в функцию и просто вызывать ее при необходимости.

0 голосов
/ 09 июля 2019

Единственным способом будет вычисление второго измерения и использование -1 для первого.

a = torch.randn(20,3,512,512)
print(a.shape)
b = a.reshape((20, -1)) 
print(b.shape)
b = a.reshape((-1, 786432)) # 3*512*512
print(b.shape)

torch.Size([20, 3, 512, 512])
torch.Size([20, 786432])
torch.Size([20, 786432])

Потому что при изменении формы может быть только один -1.

...