首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在tensorflow上将3D矩阵的每一行与另一个3D矩阵的每个元素相乘?

如何在tensorflow上将3D矩阵的每一行与另一个3D矩阵的每个元素相乘?
EN

Stack Overflow用户
提问于 2019-05-02 02:14:11
回答 1查看 205关注 0票数 2

我有两个三维张量,张量A的维数为[32,1024,128],张量B的维数为[32,1024,1024],其中32是批大小。对于某个样本,我想用矩阵B的每个元素乘以矩阵A的每一行,这样输出的张量维数将是[32,1024,1024,128]。我尝试使用tf.tile将两个张量转换为4D,并使用元素乘法。但这让我的记忆错误消失了。我试着将批处理大小缩小到4,但问题是相同的。如对此有任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-02 06:58:50

您的问题确实需要很大一部分内存。下面是一个演示,我使用了2个示例,而不是batch_size = 32中的所有示例,

代码语言:javascript
复制
# input arrays to work with
In [2]: A = np.random.random_sample([32,1024,128])
In [3]: B = np.random.random_sample([32,1024,1024])

# inspect their memory usage

In [12]: A.nbytes/1000000
Out[12]: 33.554432   # ~ 33.5 Mb

In [13]: B.nbytes/1000000
Out[13]: 268.435456  # ~ 268 Mb

# your desired multiplication
In [14]: res = B[:2, ..., np.newaxis] * A[:2, :, np.newaxis, ...]

# desired shape of the output
In [15]: res.shape
Out[15]: (2, 1024, 1024, 128)

# inspect memory usage
In [16]: res.nbytes/1000000
Out[16]: 2147.483648  # ~ 2.1 GB

我对这些数组使用了float64。如果您不能满足这样的内存需求,降低内存使用率从而避免Out Of Memory错误的一个想法是降低数组并使用单个精度(即float32)数组。

不用使用tf.tile (实际上通过多次复制原始张量来创建一个新张量),您可以使用在内存方面性能更好的tf.expand_dims

这是我首先要研究的两行优化。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55944874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档