高效实现带重复元素的矩阵乘法:避免显式重复的张量重塑与广播技巧

夏芳吖_1678

夏芳吖_1678

2026-08-01

733人浏览

原创

高效实现带重复元素的矩阵乘法:避免显式重复的张量重塑与广播技巧

本文介绍如何通过张量重塑(reshape)与隐式广播(broadcasting)替代显式 tf.repeat,在保持计算正确性的同时显著降低内存开销,适用于大规模分块矩阵乘场景。

本文介绍如何通过张量重塑(reshape)与隐式广播(broadcasting)替代显式 `tf.repeat`,在保持计算正确性的同时显著降低内存开销,适用于大规模分块矩阵乘场景。

在深度学习与科学计算中,常遇到一类结构化矩阵乘需求:张量 a 形状为 (n//f, c, c),需作用于 b(形状 (n, c, c)),其中 a 的每个 slice 实际对应 b 中连续 f 行的共享变换。朴素做法是用 tf.repeat(a, f, axis=0) 构造 (n, c, c) 的 a_prime 再执行 a_prime @ b,但该操作会复制 f 倍内存,当 n 和 f 较大时极易触发 OOM。

更优解法是规避显式复制,转而利用 TensorFlow 的广播机制与批量矩阵乘(tf.matmul)的维度对齐能力。核心思想是将 a 与 b 分别升维并错位对齐,使广播自动完成“每块 a[i] 作用于对应 f 行 b”的逻辑,再通过 tf.reduce_sum 聚合结果。

具体步骤如下:

  1. 重塑张量以启用广播

    PopShort.AI
    PopShort.AI

    一款面向短剧内容创作的AI视频平台,帮助用户利用人工智能完成短剧相关内容制作。

    下载
    • 将 a 从 (n//f, c, c) 变形为 (1, n//f, c, c),引入 batch 维度 1;
    • 将 b 从 (n, c, c) 变形为 (n, 1, c, c),引入 broadcast 维度 1;
      此时 a_reshaped 与 b_reshaped 在前两维上形成 (1, n//f) × (n, 1) 广播关系,等效于对每个 i ∈ [0, n//f) 和 j ∈ [i*f, (i+1)*f) 自动匹配 a[i] 与 b[j]。
  2. 执行批处理矩阵乘
    tf.matmul(a_reshaped, b_reshaped) 输出形状为 (n, n//f, c, c),其中第 (j, i) 项即 a[i] @ b[j](注意 j 与 i 的映射需满足 j ∈ [i*f, (i+1)*f))。

  3. 按组聚合结果
    由于 a[i] 应统一作用于 b 的第 i 组 f 行(即索引 i*f 到 (i+1)*f−1),我们需沿 axis=1(即 n//f 维)求和——但直接 reduce_sum(axis=1) 会错误地跨组累加。关键修正:实际应先将 b 按 f 分组 reshape,再与 a 对齐。更鲁棒的实现如下:

import tensorflow as tf
import numpy as np

n, c, f = 100, 5, 10
a = tf.constant(np.random.rand(n // f, c, c))  # shape: (10, 5, 5)
b = tf.constant(np.random.rand(n, c, c))        # shape: (100, 5, 5)

# Step 1: Reshape b into (n//f, f, c, c) — group rows by f
b_grouped = tf.reshape(b, (n // f, f, c, c))    # shape: (10, 10, 5, 5)

# Step 2: Expand a to (n//f, 1, c, c) for broadcasting over f-dim
a_expanded = tf.expand_dims(a, axis=1)         # shape: (10, 1, 5, 5)

# Step 3: Broadcast-matmul → (n//f, f, c, c)
intermediate = tf.matmul(a_expanded, b_grouped)  # a[i] @ b_grouped[i,j] for each j

# Step 4: Flatten first two dims → (n, c, c)
result = tf.reshape(intermediate, (n, c, c))

print("Result shape:", result.shape)  # (100, 5, 5)

优势总结

  • 零内存冗余:全程无 repeat 或 tile,仅通过 reshape 和 expand_dims 改变视图;
  • GPU友好:tf.matmul 充分利用硬件加速,远快于 Python 循环或逐行 tf.linalg.matvec;
  • 可扩展性强:支持任意 f(无需整除校验),且易于集成到 tf.function 图中。

⚠️ 注意事项

  • 确保 n % f == 0,否则 reshape 会报错;若不满足,需先截断或补零;
  • 该方法本质是分组广播矩阵乘,语义严格等价于 for i in range(n//f): result[i*f:(i+1)*f] = a[i] @ b[i*f:(i+1)*f];
  • 若 b 实际为 (n, c, 1)(如问题描述末尾所述),则 @ 应为 tf.linalg.matvec 或调整 b 的 c 维为 1,此时 result 形状为 (n, c, 1),逻辑不变。
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1549

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20697

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2023

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习