【发布时间】:2021-08-20 09:52:40
【问题描述】:
我在 pytorch 中,我有一个大小为 batch_size x d x S 的张量 x。它必须作为一批长度为S 的序列,其中每个序列元素都是d 维的。每个序列实际上是多个子序列的重叠,在以下意义上:
- 每个子序列的大小为
past_size + present_size,即我们有past_sized维元素,后跟其他present_size元素 - 重叠的工作方式如下:
present_size部分的开头由present_size元素等间距,它们被放置在最右边的位置
以batch_size=1, d=1 为例,考虑x = [1,2,3,4,5,6,7,8,9],其中present_size = 2, past_size = 3。生成的子序列将是:
[1,2,3,4,5][3,4,5,6,7][5,6,7,8,9]
最终目标是将每个序列拆分为 N 子序列,以获得形状为 batch_size*N x d x past_size+present_size 的张量。
我的第二次尝试如下:
def seq(x, present_size, total_size=present_size+past_size, N):
z = x.unfold(-1, total_size, present_size)
v = torch.flatten(z, start_dim=2)
s = torch.cat(torch.chunk(v, N, -1), 0)
return s
有没有更有效的方法?是否可以通过这样的函数进行反向传播?
编辑
在上面的例子中,N = 3。
此外,我们有以下关系:N*present_size + past_size = S
输入-输出
这是N=4, present_size = 1, past_size = 2 的示例。
x = torch.rand(4,8,6) # d=8, batch_size = 4, 6 = N*present_size + past_size
>>> tensor([[[0.5667, 0.5300, 0.2460, 0.4327, 0.4727, 0.5649],
[0.0360, 0.6687, 0.0167, 0.5359, 0.9804, 0.8778],
[0.3703, 0.4884, 0.1505, 0.5463, 0.8114, 0.3270],
[0.2932, 0.4928, 0.3933, 0.2433, 0.7053, 0.5222],
[0.6667, 0.2014, 0.7107, 0.7535, 0.2816, 0.6515],
[0.5285, 0.4150, 0.2557, 0.2144, 0.8317, 0.5448],
[0.7971, 0.6609, 0.1811, 0.7788, 0.6649, 0.1848],
[0.6902, 0.3999, 0.8719, 0.7624, 0.5216, 0.3494]],
[[0.0196, 0.7850, 0.2796, 0.4173, 0.8076, 0.5709],
[0.4566, 0.4814, 0.0568, 0.8568, 0.9119, 0.4030],
[0.4031, 0.8887, 0.3782, 0.8015, 0.9835, 0.6043],
[0.3557, 0.5960, 0.2102, 0.8165, 0.1938, 0.4948],
[0.8163, 0.7907, 0.3711, 0.6835, 0.8021, 0.1897],
[0.7790, 0.2621, 0.3769, 0.3830, 0.7140, 0.2309],
[0.5831, 0.0246, 0.6548, 0.8694, 0.1988, 0.5470],
[0.1192, 0.2928, 0.4240, 0.2624, 0.7959, 0.4091]],
[[0.7959, 0.7144, 0.4523, 0.5090, 0.6053, 0.4071],
[0.4742, 0.0224, 0.9939, 0.9757, 0.0732, 0.6213],
[0.5211, 0.1149, 0.8218, 0.7061, 0.1807, 0.2822],
[0.1456, 0.7331, 0.9107, 0.9533, 0.2438, 0.4031],
[0.0958, 0.2623, 0.0828, 0.2861, 0.0474, 0.8349],
[0.1740, 0.3658, 0.2416, 0.6735, 0.4013, 0.8896],
[0.6934, 0.8709, 0.4017, 0.6121, 0.5824, 0.5803],
[0.4811, 0.1036, 0.4356, 0.6441, 0.5859, 0.4683]],
[[0.2479, 0.9247, 0.3216, 0.6844, 0.1701, 0.4609],
[0.3320, 0.4908, 0.0458, 0.9887, 0.4725, 0.7511],
[0.0594, 0.1978, 0.8830, 0.9126, 0.4821, 0.7731],
[0.3729, 0.4921, 0.9266, 0.7827, 0.8101, 0.6258],
[0.4998, 0.7596, 0.1160, 0.3928, 0.4773, 0.7892],
[0.0215, 0.1325, 0.5940, 0.2094, 0.3109, 0.9281],
[0.7960, 0.1707, 0.1793, 0.7335, 0.2065, 0.6204],
[0.6350, 0.9696, 0.5099, 0.7375, 0.7601, 0.1405]]])
r = seq(x, 1, 2+1, 4)
>>> tensor([[[0.5667, 0.5300, 0.2460],
[0.0360, 0.6687, 0.0167],
[0.3703, 0.4884, 0.1505],
[0.2932, 0.4928, 0.3933],
[0.6667, 0.2014, 0.7107],
[0.5285, 0.4150, 0.2557],
[0.7971, 0.6609, 0.1811],
[0.6902, 0.3999, 0.8719]],
[[0.0196, 0.7850, 0.2796],
[0.4566, 0.4814, 0.0568],
[0.4031, 0.8887, 0.3782],
[0.3557, 0.5960, 0.2102],
[0.8163, 0.7907, 0.3711],
[0.7790, 0.2621, 0.3769],
[0.5831, 0.0246, 0.6548],
[0.1192, 0.2928, 0.4240]],
[[0.7959, 0.7144, 0.4523],
[0.4742, 0.0224, 0.9939],
[0.5211, 0.1149, 0.8218],
[0.1456, 0.7331, 0.9107],
[0.0958, 0.2623, 0.0828],
[0.1740, 0.3658, 0.2416],
[0.6934, 0.8709, 0.4017],
[0.4811, 0.1036, 0.4356]],
[[0.2479, 0.9247, 0.3216],
[0.3320, 0.4908, 0.0458],
[0.0594, 0.1978, 0.8830],
[0.3729, 0.4921, 0.9266],
[0.4998, 0.7596, 0.1160],
[0.0215, 0.1325, 0.5940],
[0.7960, 0.1707, 0.1793],
[0.6350, 0.9696, 0.5099]],
[[0.5300, 0.2460, 0.4327],
[0.6687, 0.0167, 0.5359],
[0.4884, 0.1505, 0.5463],
[0.4928, 0.3933, 0.2433],
[0.2014, 0.7107, 0.7535],
[0.4150, 0.2557, 0.2144],
[0.6609, 0.1811, 0.7788],
[0.3999, 0.8719, 0.7624]],
[[0.7850, 0.2796, 0.4173],
[0.4814, 0.0568, 0.8568],
[0.8887, 0.3782, 0.8015],
[0.5960, 0.2102, 0.8165],
[0.7907, 0.3711, 0.6835],
[0.2621, 0.3769, 0.3830],
[0.0246, 0.6548, 0.8694],
[0.2928, 0.4240, 0.2624]],
[[0.7144, 0.4523, 0.5090],
[0.0224, 0.9939, 0.9757],
[0.1149, 0.8218, 0.7061],
[0.7331, 0.9107, 0.9533],
[0.2623, 0.0828, 0.2861],
[0.3658, 0.2416, 0.6735],
[0.8709, 0.4017, 0.6121],
[0.1036, 0.4356, 0.6441]],
[[0.9247, 0.3216, 0.6844],
[0.4908, 0.0458, 0.9887],
[0.1978, 0.8830, 0.9126],
[0.4921, 0.9266, 0.7827],
[0.7596, 0.1160, 0.3928],
[0.1325, 0.5940, 0.2094],
[0.1707, 0.1793, 0.7335],
[0.9696, 0.5099, 0.7375]],
[[0.2460, 0.4327, 0.4727],
[0.0167, 0.5359, 0.9804],
[0.1505, 0.5463, 0.8114],
[0.3933, 0.2433, 0.7053],
[0.7107, 0.7535, 0.2816],
[0.2557, 0.2144, 0.8317],
[0.1811, 0.7788, 0.6649],
[0.8719, 0.7624, 0.5216]],
[[0.2796, 0.4173, 0.8076],
[0.0568, 0.8568, 0.9119],
[0.3782, 0.8015, 0.9835],
[0.2102, 0.8165, 0.1938],
[0.3711, 0.6835, 0.8021],
[0.3769, 0.3830, 0.7140],
[0.6548, 0.8694, 0.1988],
[0.4240, 0.2624, 0.7959]],
[[0.4523, 0.5090, 0.6053],
[0.9939, 0.9757, 0.0732],
[0.8218, 0.7061, 0.1807],
[0.9107, 0.9533, 0.2438],
[0.0828, 0.2861, 0.0474],
[0.2416, 0.6735, 0.4013],
[0.4017, 0.6121, 0.5824],
[0.4356, 0.6441, 0.5859]],
[[0.3216, 0.6844, 0.1701],
[0.0458, 0.9887, 0.4725],
[0.8830, 0.9126, 0.4821],
[0.9266, 0.7827, 0.8101],
[0.1160, 0.3928, 0.4773],
[0.5940, 0.2094, 0.3109],
[0.1793, 0.7335, 0.2065],
[0.5099, 0.7375, 0.7601]],
[[0.4327, 0.4727, 0.5649],
[0.5359, 0.9804, 0.8778],
[0.5463, 0.8114, 0.3270],
[0.2433, 0.7053, 0.5222],
[0.7535, 0.2816, 0.6515],
[0.2144, 0.8317, 0.5448],
[0.7788, 0.6649, 0.1848],
[0.7624, 0.5216, 0.3494]],
[[0.4173, 0.8076, 0.5709],
[0.8568, 0.9119, 0.4030],
[0.8015, 0.9835, 0.6043],
[0.8165, 0.1938, 0.4948],
[0.6835, 0.8021, 0.1897],
[0.3830, 0.7140, 0.2309],
[0.8694, 0.1988, 0.5470],
[0.2624, 0.7959, 0.4091]],
[[0.5090, 0.6053, 0.4071],
[0.9757, 0.0732, 0.6213],
[0.7061, 0.1807, 0.2822],
[0.9533, 0.2438, 0.4031],
[0.2861, 0.0474, 0.8349],
[0.6735, 0.4013, 0.8896],
[0.6121, 0.5824, 0.5803],
[0.6441, 0.5859, 0.4683]],
[[0.6844, 0.1701, 0.4609],
[0.9887, 0.4725, 0.7511],
[0.9126, 0.4821, 0.7731],
[0.7827, 0.8101, 0.6258],
[0.3928, 0.4773, 0.7892],
[0.2094, 0.3109, 0.9281],
[0.7335, 0.2065, 0.6204],
[0.7375, 0.7601, 0.1405]]])
【问题讨论】:
-
在您的示例中,
N是什么?您当前的实现不起作用,请修复它或提供完整示例:这包括输入和所需的输出。 -
@Ivan 我已经写了 N 是什么,更多地指定了输出,并且还修复了我的示例。我删除了初始零,我可以假设我的应用程序中没有“剩余”
-
您能否提供一个额外的(具有不同输入的)示例?
-
@Ivan 在这里
-
@Ivan 我已经创建了脚本的第二个版本,我的第一个版本过于复杂
标签: python deep-learning pytorch