2016-12-06 140 views
1

处理大小约(大约)30 000的稀疏向量的最佳方式是什么?除了一个索引值为1(1-HOT向量)之外,所有索引都为零?如何在Tensorflow中处理非常稀疏的向量

在我的数据集中,我有一个值序列,我将其转换为每个值的一个1-HOT向量。这是我目前做的事情:

# Create some queues to read data from .csv files 
... 
# Parse example(/line) from the data file 
example = tf.decode_csv(value, record_defaults=record_defaults) 

# example now looks like (e.g) [[5], [1], [4], [38], [571], [9]] 
# [5] indicates the length of the sequence 
# 1, 4, 38, 571 is the input sequence 
# 4, 38, 571, 9 is the target sequence 
# Create 1-HOT vectors for each value in the sequence 
sequence_length = example[0] 
one_hots = example[1:] 
one_hots = tf.reshape(one_hots, [-1]) 
one_hots = tf.one_hot(one_hots, depth=n_classes) 

# Grab the first values as the input features and the last values as target 
features = one_hots[:-1] 
targets = one_hots[1:] 

... 
# The sequence_length, features and targets are added to a list 
# and the list is sent into a batch with tf.train_batch_join(...). 
# So now I can get batches and feed into my RNN 
... 

这是有效的,但我相信它可以以更有效的方式完成。我看着SparseTensor,但我无法弄清楚如何从example张量中创建SparseTensors,我从tf.decode_csv得到张量。而且我读到somwhere,最好是在批量检索数据后解析数据,这是否仍然正确?

Here是完整代码的pastebin。第32行是我创建1-HOT向量的最新方式。

+0

或者:我怎样才能创建1-HOT载体在**之后的例子** **我拉了一批例子(如果我只是将例子直接传入批处理) –

回答

0

而不是处理转换您的输入稀疏1热向量,它被优先使用tf.nn.embedding_lookup,它只是选择矩阵的相关行将乘以。这相当于矩阵乘以1热矢量的等效值。

下面是一个使用示例

embed_dim = 3; 
vocab_size = 10; 
E = np.random.rand(vocab_size, embed_dim) 
print E 
embeddings = tf.Variable(E) 
examples = tf.Variable(np.array([4,5, 2,9]).astype('int32')) 

examples_embedded = tf.nn.embedding_lookup(embeddings, examples) 

s = tf.InteractiveSession() 
s.run(tf.initialize_all_variables()) 
print '' 
print examples_embedded.eval() 

另请参阅该example在im2txt项目,如何养活这种对RNNs数据,(行话说seq_embeddings = tf.nn.embedding_lookup(embedding_map, self.input_seqs)

+0

我不确定我是否正确理解这一点。你的意思是我应该预先创建并存储所有可能的热点向量,然后使用tf.nn.embedding_lookup根据从数据集中读取的序列检索我需要的元素? –

+0

我的意思是说,你不需要1热媒。您可以直接使用索引。例如1-hot vector [00100,00001,01000]的序列将被替换为[2,4,1] – yuval

+0

的序列啊,我明白了!但是,我如何将此内容加入RNN?如果1-hot与矩阵相乘以获得嵌入,然后将其发送到RNN,那么我明白如何使用'tf.nn.embedding_lookup'来完成,但我不明白该怎么做当1-hot应该直接进入RNN。 –