Word2vec的约束优化给出了TypeError

时间:2017-10-17 17:28:53

标签: python-3.x tensorflow mathematical-optimization word2vec word-embedding

我希望在tensorflow中运行word2vec model并使用嵌入的边界,以便它们与原点的单位距离。这适用于目标和上下文矩阵x中的每个坐标-1 <= x <= 1

我发现这个nice interface允许人们这样做。但是,当我对原始代码进行更改时,出现以下错误。

File "/home/sivanov/PycharmProjects/hypemb/tf_word2vec/word2vec_original.py", line 379, in build_graph
    self.optimize(loss)   
File "/home/sivanov/PycharmProjects/hypemb/tf_word2vec/word2vec_original.py", line 297, in optimize
    method = 'SLSQP')
File "/home/sivanov/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/opt/python/training/external_optimizer.py", line 126, in __init__
    self._packed_var = self._pack(self._vars)   
File "/home/sivanov/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/opt/python/training/external_optimizer.py", line 259, in _pack
    return array_ops.concat(flattened, 0)   
File "/home/sivanov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 1066, in concat
    name=name)
File "/home/sivanov/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py", line 493, in _concat_v2
    name=name)
File "/home/sivanov/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 463, in apply_op
    raise TypeError("%s that don't all match." % prefix) TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [float32, float32, float32, int32] that don't all match.

所以,我expect我试图绑定的矩阵在类型上不匹配。但是,我使用统一分布初始化它们,所以我不确定在哪里可以获得int32类型。

emb = tf.Variable(
    tf.random_uniform(
        [opts.vocab_size, opts.emb_dim], -init_width, init_width),
    name="emb")
self._emb = emb

sm_w_t = tf.Variable(
    tf.random_uniform(
        [opts.vocab_size, opts.emb_dim], -init_width, init_width),
    name="sm_w_t", dtype=tf.float32)
self._sm_w_t = sm_w_t

除上述内容外,我还添加了以下片段:

optimize函数中:

optimizer = tf.contrib.opt.ScipyOptimizerInterface(loss, options={'max_iter': 5}, 
                                                    var_to_bounds = {self._emb: (-1., 1.), self._sm_w_t: (-1., 1.)},
                                                    method = 'SLSQP')
self._optimizer = optimizer

_thrain_thread_body函数中:

self._optimizer.minimize(self._session)

可以找到完整的代码,可以找到word2vec代码here,我通过运行python word2vec_test.py来调用此代码(使用第一个预编译的word2vec_o​​ps.so文件;可以找到指令{{3} })。

如何使用坐标约束来执行word2vec嵌入的优化?

0 个答案:

没有答案