使用大于2GB的数组初始化tensorflow变量
tensorflow
6
0

我正在尝试使用预训练的word2vec嵌入初始化tensorflow Variable

我有以下代码:

import tensorflow as tf
from gensim import models

model = models.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
X = model.syn0

embeddings = tf.Variable(tf.random_uniform(X.shape, minval=-0.1, maxval=0.1), trainable=False)

sess.run(tf.initialize_all_variables())

sess.run(embeddings.assign(X))

我收到以下错误:

ValueError: Cannot create an Operation with a NodeDef larger than 2GB.

我要分配的数组( X )的形状为(3000000, 300) ,其大小为3.6GB。

如果我也尝试tf.convert_to_tensor(X) ,也会遇到相同的错误。

我知道由于阵列大于2GB而导致失败。但是,我不知道如何为张量流Variable分配大于2GB的数组

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

最简单的解决方案是将其feed_dict'放入用于tf.assign变量的占位符节点。

X = tf.Variable([0.0])
place = tf.placeholder(tf.float32, shape=(3000000, 300))
set_x = X.assign(place)
# set up your session here....
sess.run(set_x, feed_dict={place: model.syn0})

正如Joshua Little在一个单独的答案中指出的那样,您也可以在初始化程序中使用它:

X = tf.Variable(place)    # place as defined above
...
init = tf.initialize_all_variables()
... create sess ...
sess.run(init, feed_dict={place: model.syn0})
收藏
评论

似乎唯一的选择是使用占位符。我能找到的最干净的方法是直接初始化为占位符:

X_init = tf.placeholder(tf.float32, shape=(3000000, 300))
X = tf.Variable(X_init)
# The rest of the setup...
sess.run(tf.initialize_all_variables(), feed_dict={X_init: model.syn0})
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号