【发布时间】:2019-06-24 19:34:14
【问题描述】:
操作:我有尺寸为[n x m x c] 的pytorch 张量A 和尺寸为[1 x 1 x c] 的B。我想从A 和B 中获取每个1 x 1 x c 向量的内积,从而生成一个维度为[n x m] 的张量C。
在我的网络的内部前向函数中,在特定步骤中,我收到尺寸为 [N, channels, Height, Width] 的张量,其中 N 是图像数,通道是特征图中的通道数,高度和宽度是当前特征图的。我还有一个来自其他子网的[N x channels] 特征图。下一步我要进行上述操作。
有人可以解释 pytorch 中实现这一步骤的最佳方法和功能吗?
我是 pytorch 的新手,找不到合适的方法。 Tensorflow 支持 NHWC 格式,但我认为 pytorch 不支持,因此其中一种方法是将其重塑为[N, Height, Width, channels],然后像这样迭代:
# if img is reshaped to [N, H, W, C]
img
# tensor of dimension [N, C]
aud
ans = torch.empty(N, H, W, dtype=torch.double)
for batches in range(img.shape[0]):
for i in range(img.shape[1]):
for j in range(img.shape[2]):
ans[batches][i][j] = torch.dot(img[batches][i][j], aud[batches])
还有其他更简洁的 API 吗?
PS : 这一步是 DeepMind 的论文“Object That Sound”中要求的声音定位步骤。
【问题讨论】:
-
只需将您的 [n x m x c] 与最后一个轴上的 B 相乘,然后将最后一个轴相加,有效地产生 [n x m]。
-
执行独立操作很容易,但主要问题是当我在前进步骤中有 [N, C, H, W] 和 [N, C] 形式的张量时。
-
PyTorch 允许您置换索引,记住在此操作后使用 contiguous。
-
我会检查torch.permute,看起来它可以帮助重塑,你能解释更多关于“连续”的事情吗?
-
Permutation 创建张量的视图。如果你把它放在神经网络中,分配的内存将不会以连续的方式访问(例如你会跳转到分开的内存地址)并且操作会慢得多。
标签: python deep-learning pytorch