在Theano中将索引向量转换为零和1的矩阵的最佳(优雅和有效)方法是什么,其中每一行都是索引的一个N表示?
v = t.ivector() # the vector of indices
n = t.scalar() # the width of the matrix
convert = <your code here>
f = theano.function(inputs=[v, n], outputs=convert)
示例:
n_val = 4
v_val = [1,0,3]
f(v_val, n_val) = [[0,1,0,0],[1,0,0,0],[0,0,0,1]]
答案 0 :(得分:5)
我没有比较不同的选项,但你也可以这样做。它不要求额外的内存。
import numpy as np
import theano
n_val = 4
v_val = np.asarray([1,0,3])
idx = theano.tensor.lvector()
z = theano.tensor.zeros((idx.shape[0], n_val))
one_hot = theano.tensor.set_subtensor(z[theano.tensor.arange(idx.shape[0]), idx], 1)
f = theano.function([idx], one_hot)
print f(v_val)[[ 0. 1. 0. 0.]
[ 1. 0. 0. 0.]
[ 0. 0. 0. 1.]]
答案 1 :(得分:1)
它很简单:
convert = t.eye(n,n)[v]
仍然可能有一个更有效的解决方案,不需要构建整个单一矩阵。对于大n和短v,这可能会有问题。
答案 2 :(得分:0)
现在有一个内置函数theano.tensor.extra_ops.to_one_hot
。
return