Преобразовать тензор Pytorch в NumPy и изменить форму - PullRequest
0 голосов
/ 12 октября 2019

У меня есть тензор Pytorch [100, 1, 32, 32], соответствующий размеру пакета 100 изображений, 1 канал, высота 32 и ширина 32. Я хочу изменить этот тензор, чтобы иметь размер [32 * 10, 32 * 10], чтобыизображения представлены в виде сетки 10x10 с первыми 10 изображениями в строке 1 и т. д. Как этого добиться?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Я не совсем понял ваш вопрос, но пытался решить некоторые из проблем.

У вас есть тензор формы [100, 1, 32, 32], который представляет 100 изображений формы [1, 32, 32], где num_channels = 1, width = 32, height = 32.

Во-первых, поскольку у изображений есть только один канал, мы можем сжать размер канала.

# image_tensor is of shape [100, 1, 32, 32]
image_tensor = image_tensor.squeeze(1) # [100, 32, 32]

Мы можем организовать результирующие тензоры в 10 строк по 10 изображений, как вы описали.

image_tensor = image_tensor.reshape(10, 10, 32, 32)

Теперь, преобразование полученного тензора в тензор формы [32*10, 32*10] звучит как-то не так. Но давайте сделаем это неправильно и посмотрим, чем мы закончим.

image_tensor = image_tensor.permute(2, 0, 3, 1) # [32, 10, 32, 10]

После перестановки мы получим тензор формы [width, num_rows, height, num_img_in_a_row]. Затем, наконец, мы можем изменить форму, чтобы получить нужный тензор.

image_tensor = image_tensor.reshape(32*10, 32*10)

Итак, конечный тензор имеет форму [width * num_rows, height * num_img_in_a_row]. Вы действительно этого хотите? Я не уверен, как интерпретировать полученный тензор !!

2 голосов
/ 14 октября 2019

Обновление

Более эффективная и короткая версия. Чтобы избежать использования цикла for, мы можем сначала переставить a.

import torch
a = torch.arange(9*2*2).view(9,1,2,2)
b = a.permute([0,1,3,2])
torch.cat(torch.split(b, 3),-1).view(6,6).t()
# tensor([[ 0,  1,  4,  5,  8,  9],
#         [ 2,  3,  6,  7, 10, 11],
#         [12, 13, 16, 17, 20, 21],
#         [14, 15, 18, 19, 22, 23],
#         [24, 25, 28, 29, 32, 33],
#         [26, 27, 30, 31, 34, 35]])

Оригинальный ответ

Вы можете использовать torch.split и torch.cat для реализацииЭто.

import torch
a = torch.arange(9*2*2).view(9,1,2,2)

Предполагается, что у нас есть тензор a, который является мини-версией вашего оригинального тензора. И, похоже,

tensor([[[[ 0,  1],
          [ 2,  3]]],
        [[[ 4,  5],
          [ 6,  7]]],
        [[[ 8,  9],
          [10, 11]]],
        [[[12, 13],
          [14, 15]]],
        [[[16, 17],
          [18, 19]]],
        [[[20, 21],
          [22, 23]]],
        [[[24, 25],
          [26, 27]]],
        [[[28, 29],
          [30, 31]]],
        [[[32, 33],
          [34, 35]]]])

Каждая подматрица 2x2 может рассматриваться как одно изображение. То, что вы хотите сделать, это сложить первые три изображения в один ряд, следующие три изображения во второй ряд и последние три изображения в третий ряд. «Строка» на самом деле имеет два затемнения из-за подматрицы 2x2.

three_parts = torch.split(a,3)

torch.cat(torch.split(three_parts[0],1), dim=-1)

#tensor([[[[ 0,  1,  4,  5,  8,  9],
#          [ 2,  3,  6,  7, 10, 11]]]])

Здесь мы берем только первую часть.

torch.cat([torch.cat(torch.split(three_parts[i],1),-1) for i in range(3)],0).view(6,6)
# tensor([[ 0,  1,  4,  5,  8,  9],
#         [ 2,  3,  6,  7, 10, 11],
#         [12, 13, 16, 17, 20, 21],
#         [14, 15, 18, 19, 22, 23],
#         [24, 25, 28, 29, 32, 33],
#         [26, 27, 30, 31, 34, 35]])
1 голос
/ 12 октября 2019

Вы можете использовать make_grid():

x = torchvision.utils.make_grid(x, nrow=10, padding=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...