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

Fil*_*lip 21 tensorflow

我正在尝试Variable使用预先训练的word2vec嵌入来初始化张量流.

我有以下代码:

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))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValueError: Cannot create an Operation with a NodeDef larger than 2GB.
Run Code Online (Sandbox Code Playgroud)

X我试图分配的数组()是形状(3000000, 300),其大小为3.6GB.

如果我也尝试tf.convert_to_tensor(X),我会得到同样的错误.

我知道它由于阵列大于2GB而失败.但是,我不知道如何将大于2GB的数组分配给张量流Variable

Jos*_*tle 19

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

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})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当您调用`tf.placeholder()`时,您还可以设置可选的shape参数,然后您不需要`validate_shape = False`(并且您可以在程序的其余部分中获得更好的形状推断!). (3认同)

dga*_*dga 11

最简单的解决方案是将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})
Run Code Online (Sandbox Code Playgroud)

正如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})
Run Code Online (Sandbox Code Playgroud)

  • `X.assign(place)`需要`tf.assign(X,place,validate_shape = False)`,否则TensorFlow会抱怨你正在改变张量的形状.除此之外,这是有效的. (3认同)
  • 有关更多信息,请在[预加载数据](https://www.tensorflow.org/versions/r0.7/how_tos/reading_data/index.html#preloaded-data)下的文档中详细说明如何执行此操作以及如何使用占位符和变量来预加载MNIST训练输入的完整工作示例[这里](https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/how_tos/reading_data/fully_connected_preloaded_var的.py) (3认同)