gpt4 book ai didi

python - Theano 中比 T.eye 更好的方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:08 26 4
gpt4 key购买 nike

问题是,给定任意一维向量y,将其扩展为具有n维度的d基向量。

展开的规则是:y中的每个元素是n*n单位矩阵中列的索引。

例如:

 y = [3, 0, 1]
n = 4

由于n = 4,我们有4*4单位矩阵:

[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]

使用规则扩展每个元素y,我们有:

[0, 1, 0]
[0, 0, 1]
[0, 0, 0]
[1, 0, 0]

我想使用 theano 来解决这个问题,n (>50k) 非常大,y (>10k) 非常长,所以效率很重要。

使用 numpy 的解决方案很简单,但是 numpy.eye 函数可能成本太大,我们可以使用另一种方法来使其更快。比较以下方法:

import numpy as np
import theano
import theano.tensor as T

n = 25500
y_value = np.asarray([2, 0, 10, 4], dtype='int32')

# method 1
%timeit np.eye(n)[y_value]
# 10 loops, best of 3: 56.9 ms per loop

# method 2
def vec(i):
e = np.zeros(n)
e[i] = 1
return e
%timeit np.vstack([vec(i) for i in y_value])
# 100 loops, best of 3: 16.3 ms per loop

但是,第二种方法在 theano 中可能不起作用,因为符号变量中的循环可能并不简单。有没有办法可以避免使用T.eye?

y_value 可以是任意一维向量。

最佳答案

您可以尝试另一种方法。在我的电脑中:

>>> %timeit np.eye(n)[y_value]
1 loops, best of 3: 544 ms per loop

但是,如果您事先知道所需的行,则无需创建整个数组。你可以这样做:

>>> n = 25500
>>> n_rows = y_value.size
>>> r = np.zeros((n_rows, n))
>>> r[range(n_rows), y_value] = 1

您创建了一个更小的数组,只有y x n,其中y是索引向量的大小,并将其填充到每一行中。我电脑上的时间是:

>>> %%timeit 
..: r = np.zeros((n_rows, n))
..: r[range(n_rows), y_value] = 1

100 loops, best of 3: 3.8 ms per loop

x151 在我的笔记本电脑中加速。

此外,如果您不想要后面(x 轴)充满零的数组,您可以这样做:

>>> %%timeit 
..: r = np.zeros((n_rows, y_value.max()+1))
..: r[range(n_rows), y_value] = 1

100000 loops, best of 3: 16 µs per loop

这甚至更快,但生成的数组是 y x ymax,在本例中为 99 x 100,这可能不是您想要的。

关于python - Theano 中比 T.eye 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27816788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com