Объединить относительно 1-го измерения - PullRequest
0 голосов
/ 07 февраля 2020

В следующем коде, что действительно делает torch.cat. Я знаю, что он объединяет партию, которая содержится в образце, но почему мы должны это делать и что в действительности означает конкатенация.

 # memory is just a list of events
 def sample(self, batch_size):
    samples = zip(*random.sample(self.memory, batch_size))
    return map(lambda x: Variable(torch.cat(x,0)))

1 Ответ

1 голос
/ 07 февраля 2020

torch.cat объединяется, как следует из названия, в указанном измерении.

Пример из документации расскажет вам все, что вам нужно знать:

x = torch.randn(2, 3) # shape (2, 3)
catted = torch.cat((x, x, x), dim=0) # shape (6, 3), e.g. 3 x stacked on each other

Помните, что составные тензоры должны иметь одинаковые измерение за исключением того, вдоль которого вы объединяете .

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

Предположим, что вместо этого вы сделаете это отображение:

map(lambda x: Variable(torch.cat(x,0)), samples)

Это создаст новый тензор формы [len(samples), x_dim_1, x_dim_2, ...] при условии, что все samples имеют такую ​​же размерность за исключением 0.

Тем не менее, это довольно запутанный пример, и определенно не следует так делать (torch.autograd.Variable устарело, см. здесь ), это должно быть достаточно:

# assuming random.sample returns either `list` or `tuple`
def sample(self, batch_size):
   return torch.cat(random.sample(self.memory, batch_size), dim=0) 
...