pytorch重塑以修改forward()中的批处理大小

时间:2020-10-15 13:15:36

标签: machine-learning deep-learning pytorch

我有一个张量形状,例如:[4,10]其中4是批处理大小,而10是我的输入样本缓冲区的长度。现在,我知道它的确是[4,5 + 5],即输入样本缓冲区由两个长度为5的窗口组成,可以独立处理,最好并行处理。我正在做的是,在模型的forward()内部,首先将张量重塑为[8,5],在其上运行各层,然后将其重塑为[4,-1]并返回。我希望从中得到的是Pytorch可以在每个窗口(各种子批处理)上并行运行我的模型,从而有效地产生并行for循环。它运行正常,Pytorch没有抱怨或其他任何东西,但是我得到了奇怪的结果。我想知道Pytorch是否可以以这种方式工作,然后再进行模型调试。

1 个答案:

答案 0 :(得分:0)

好吧,它没有。原因是 pytorch 用于张量整形的排序。这可以通过运行下面的小复制代码看到。 如果在 pytorch 中有一个类似于“rebatch”的函数,它会处理适当的内存布局,作为并行结构的基础(假设它甚至可以在一般情况下以内存效率方式完成)。

import torch

conv = torch.nn.Conv1d(1,3,1)

def conv_batch(t, conv, window):
    batch = t.shape[0]
    t = t.view(-1, t.shape[1], window)
    t = conv(t)
    t = t.view(batch, t.shape[1], -1)
    return t

batch = 1
channels = 1
width = 4

window = 2

x = torch.arange(batch*channels*width)
x = x.view(batch,channels,width).float()

r1 = conv(x)
r2 = conv_batch(x, conv, window)

print(r1)
print(r2)
print(r1==r2)