Machine learning Pyrotch重塑以修改forward()中的批大小
我有一个形状张量,比如:Machine learning Pyrotch重塑以修改forward()中的批大小,machine-learning,deep-learning,pytorch,Machine Learning,Deep Learning,Pytorch,我有一个形状张量,比如:[4,10],其中4是批量大小,10是输入样本缓冲区的长度。现在,我知道它实际上是[4,5+5],即输入样本缓冲区由两个长度为5的窗口组成,可以独立处理,最好是并行处理。我所做的是,在模型的forward()内,我首先将张量重塑为[8,5],在其上运行我的层,然后将其重塑为[4,-1]并返回。我希望从中得到的是,Pytorch将在每个窗口(类似于子批处理)上并行运行我的模型,有效地生成并行for循环。它运行正常,Pytorch没有抱怨什么,但我得到了奇怪的结果。在我开始调
[4,10]
,其中4是批量大小,10是输入样本缓冲区的长度。现在,我知道它实际上是[4,5+5]
,即输入样本缓冲区由两个长度为5的窗口组成,可以独立处理,最好是并行处理。我所做的是,在模型的forward()内,我首先将张量重塑为[8,5],在其上运行我的层,然后将其重塑为[4,-1]并返回。我希望从中得到的是,Pytorch将在每个窗口(类似于子批处理)上并行运行我的模型,有效地生成并行for循环。它运行正常,Pytorch没有抱怨什么,但我得到了奇怪的结果。在我开始调试我的模型之前,我想知道Pytorch是否可以这样工作。嗯,它不能。原因是pytorch用于张量整形。这可以通过运行下面的小程序代码看到。
最好在PyTrk中有一个类似“重新批处理”的函数,它将处理正确的内存布局,作为并行构建的基础(前提是它甚至可以在一般情况下高效地完成内存)。
是的,你所描述的并没有什么荒谬之处,pytorch应该能够以这种方式工作。如果您提供一些带有输入和预期输出的代码示例,我们可以帮助您调试所有这些!请将此信息添加到您的问题(作为您已经尝试过的代码的一部分)并删除此答案(因为它不是您问题的真正答案)。干杯
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)