- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
该问题涉及基本矩阵运算。在下面的代码中,c1 本质上等于 c2。然而,第一种计算方式比第二种方式快得多。其实一开始我以为第一种方式需要分配一个比a矩阵大两倍的b矩阵,因此可能会更慢。结果恰恰相反。为什么?
import time
import numpy as np
a = np.random.rand(20000,100)+np.random.rand(20000,100)*1j
tic = time.time()
b = np.vstack((a.real,a.imag))
c1 = b.T @ b
t1 = time.time()-tic
tic = time.time()
c2 = a.real.T @ a.real+a.imag.T@a.imag
t2 = time.time()-tic
print('t1=%f. t2=%f.'%(t1,t2))
t1=0.037965. t2=4.375873.
最佳答案
a.real
和 a.imag
就地访问,而 np.vstack
创建一个新副本。方式@
运算符 ( matmul()
) 处理 a.real
和 a.imag
需要更长的时间。为了使其更快,您可以创建每个副本,然后将其传递给 @
或使用 np.dot(a.real.T, a.real)
和 np.dot(a.imag.T, a.imag)
(我不确定 BLAS 中的每个实现)。
对于大型矩阵,以下代码中的第一种方法应该仍然稍微快一点:
a = np.random.rand(20000,100)+np.random.rand(20000,100)*1j
tic = time.time()
b = np.vstack((a.real,a.imag))
c1 = b.T @ b
t1 = time.time()-tic
tic = time.time()
b = a.real.copy()
c = a.imag.copy()
c2 = b.T @ b + c.T @ c
t2 = time.time()-tic
print('t1=%f. t2=%f.'%(t1,t2))
t1=0.031620. t2=0.021769.
a = np.random.rand(20000,100)+np.random.rand(20000,100)*1j
print('a.flags\n', a.flags)
print('a.real flags\n', a.real.flags)
a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
a.real flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
a
是
C_CONTIGUOUS
和
a.real
不是。我不知道如何
@
实现计算,但我的猜测是缓存技巧和步幅以及展开的循环不同。我将把它留给专家来解释。现在,
array.copy()
默认为
C_CONTIGUOUS
(小心:
np.copy()
默认情况下不是
C_CONTIGUOUS
。)这就是为什么上面的第二种方法和第一种方法一样快(其中
b
也是
C_CONTIGUOUS
)。
np.vstack
创建一个新的
C_CONTIGUOUS
可以在一个地方利用缓存技巧的对象,而在第二种方法中
a.real.T @ a.real
的输出和
a.imag.T@a.imag
位于不同的内存位置,需要额外的努力来计算。
Here is a link to more explanation.
关于python - 为什么一个代码(matmul)比另一个(Python)快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61263922/
代码: x = tf.constant([1.,2.,3.], shape = (3,2,4)) y = tf.constant([1.,2.,3.], shape = (3,21,4)) tf.ma
有人可以解释一下,TensorFlow 的 eager 模式是如何工作的吗?我正在尝试构建一个简单的回归,如下所示: import tensorflow as tf tfe = tf.contrib.
我对 Tensorflow 很陌生。我已经在搜索相同的问题,但我不明白。有代码。希望你能帮助我。 代码: import tensorflow as tf w1 = tf.Variable(tf.ran
我对使用 * 和 matmul 的两个张量之间的乘法感到困惑。下面是我的代码 import torch torch.manual_seed(7) features = torch.randn((2,
我有 3 个张量 X 形状(1, c, h, w),假设(1, 20, 40, 50) Fx 形状(num, w, N),假设(1000, 50, 10) Fy shape (num, N, h),假
我已经计算了 Fortran 的 MATMUL 函数使用不同乘法大小(32 × 32、64 × 64,...)花费的时间,我对结果有疑问。 这些是结果: SIZE ----- TIME IN SECO
a = [1, 2, 3] b = [10, 10, 10] np.matmul(a, b) 结果是 60。 numpy 如何乘以 (3,) 和 (3,) 维度并返回点积而不是外积(3 * 3)或抛出
我看到许多机器学习教程通过构造两个矩阵、权重矩阵和输入(或激活)矩阵来解释全连接网络,并执行矩阵到矩阵乘法(matmul)以形成线性方程。 我看到的所有示例都将输入作为 matmul 的第一个参数,将
当我在代码中的某行调用 np.matmul 时出现此错误。这是我在解决 python 调试器错误时得到的信息: > /home/marcos/Desktop/Machine_Learning_for_
我想在等级 2 和等级 3 的两个张量之间广播 tf.matmul 运算,其中一个包含“未知”形状的维度(基本上是特定维度中的“无”值) )。 问题是动态尺寸 tf.reshape 和 tf.broa
我尝试在 tensorflow 中编写和(逻辑运算),有两个输入和两个权重将它们相乘得到一个数字并将这个数字加到偏差中,我在 matmul 中的问题是发送 X(输入)和 W(权重) 以方法形。[[1]
我正在研究并行编程概念并尝试优化单核上的矩阵乘法示例。到目前为止,我想出的最快的实现如下: /* This routine performs a dgemm operation * C := C
我有一些由 input_x 表示的数据。它是一个未知大小的张量(应该批量输入),每个项目的大小为 n。 input_x 经历 tf.nn.embedding_lookup,因此 embed 现在具有维
在 Python 中,@ 运算符传递给元素的 __matmul__ 属性。当实现一个与实际后端无关的方法时,这会派上用场。例如 def inner(x, y): return x @ y
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 2 年前。 Improve
我正在尝试使用 tf.matmul() 执行稀疏矩阵乘法。 但是,推理速度比密集矩阵乘法慢得多。 根据 tf.sparse_matmul() 中的描述: 在一个平台上使用此乘法与密集矩阵相乘的盈亏平衡
我有一个我一直在努力解决的问题。与 tf.matmul() 相关并且没有广播。 我在 https://github.com/tensorflow/tensorflow/issues/216 上发现了类
我有许多带有形状的矩阵 w1、w2、w3...wn (k*n1 、k*n2、k*n3...k*nn) 和 x1、x2、x3...xn 具有形状(n1*m、n2*m、n3*m...nn*m >). 我想
我阅读了tf.matmul的官方文档我理解第一个例子。这是一个简单的 [2,3] x [3,2] 操作: a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3
我正在尝试使用 4D-numpy 数组数据在 TensorFlow 中实现多层感知器我在 MatMul 函数上遇到了这个问题。我希望有人能在这里帮助我,非常感谢。 ValueError: Shape
我是一名优秀的程序员,十分优秀!