Как объединить / сложить тензоры и объединить измерения в PyTorch? - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно объединить 4 тензора, представляющих изображения в оттенках серого, размером [1,84,84], в стопку формы [4,84,84], представляющую четыре изображения в оттенках серого, причем каждое изображение представлено в виде «канала»в тензорном стиле CxWxH.

Я использую PyTorch.

Я пытался использовать torch.stack и torch.cat, но если один из них является решением, мне не удастся выяснить,правильная подготовка / методология для получения моих результатов.

Спасибо за любую помощь.

import torchvision.transforms as T

class ReplayBuffer:
    def __init__(self, buffersize, batchsize, framestack, device, nS):
        self.buffer = deque(maxlen=buffersize)
        self.phi = deque(maxlen=framestack)
        self.batchsize = batchsize
        self.device = device

        self._initialize_stack(nS)

    def get_stack(self):
        #t =  torch.cat(tuple(self.phi),dim=0)
        t =  torch.stack(tuple(self.phi),dim=0)
        return t

    def _initialize_stack(self, nS):
        while len(self.phi) < self.phi.maxlen:
            self.phi.append(torch.tensor([1,nS[1], nS[2]]))

a = ReplayBuffer(buffersize=50000, batchsize=64, framestack=4, device='cuda', nS=[1,84,84])
print(a.phi)
s = a.get_stack()
print(s, s.shape)

Приведенный выше код возвращает:

print(a.phi)

deque([tensor([ 1, 84, 84]), tensor([ 1, 84, 84]), tensor([ 1, 84, 84]), tensor([ 1, 84, 84])], maxlen=4)

print(s, s.shape)

tensor([[ 1, 84, 84],
        [ 1, 84, 84],
        [ 1, 84, 84],
        [ 1, 84, 84]]) torch.Size([4, 3])

Но то, что я хотел быэто возвращение просто быть [4, 84, 84].Я подозреваю, что это довольно просто, но это ускользает от меня.

1 Ответ

0 голосов
/ 12 февраля 2019

Кажется, вы неправильно поняли, что делает torch.tensor([1, 84, 84]).Давайте посмотрим:

torch.tensor([1, 84, 84])
print(x, x.shape) #tensor([ 1, 84, 84]) torch.Size([3])

Как видно из приведенного выше примера, он дает тензор только с одним измерением.

Из постановки задачи вам нужен тензор формы [1,84,84].Вот как это выглядит:

from collections import deque
import torch
import torchvision.transforms as T

class ReplayBuffer:
    def __init__(self, buffersize, batchsize, framestack, device, nS):
        self.buffer = deque(maxlen=buffersize)
        self.phi = deque(maxlen=framestack)
        self.batchsize = batchsize
        self.device = device

        self._initialize_stack(nS)

    def get_stack(self):
        t =  torch.cat(tuple(self.phi),dim=0)
#         t =  torch.stack(tuple(self.phi),dim=0)
        return t

    def _initialize_stack(self, nS):
        while len(self.phi) < self.phi.maxlen:
#             self.phi.append(torch.tensor([1,nS[1], nS[2]]))
            self.phi.append(torch.zeros([1,nS[1], nS[2]]))

a = ReplayBuffer(buffersize=50000, batchsize=64, framestack=4, device='cuda', nS=[1,84,84])
print(a.phi)
s = a.get_stack()
print(s, s.shape)

Обратите внимание, что torch.cat дает вам тензор формы [4, 84, 84], а torch.stack дает вам тензор формы [4, 1, 84,84].Их различие можно найти в В чем разница между функциями torch.stack () и torch.cat ()?

...