Инициализация тензорного потока Переменная с массивом размером более 2 ГБ

Я пытаюсь инициализировать тензорный поток 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))

И я получаю следующую ошибку:

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

Массив (X), который я пытаюсь назначить, имеет форму (3000000, 300) и его размер составляет 3,6 ГБ.

Я получаю ту же ошибку, если я попробую tf.convert_to_tensor(X).

Я знаю, что это не удается из-за того, что массив больше 2 ГБ. Тем не менее, я не знаю, как назначить массив размером более 2 ГБ для тензорного потока Variable

Ответ 1

Самое простое решение - передать его в местозаполнитель node, который вы используете для 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})

Как отметил Джошуа Литтл в отдельном ответе, вы также можете использовать его в инициализаторе:

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

Ответ 2

Кажется, единственный вариант - использовать заполнитель. Самый чистый способ, который я могу найти, - это напрямую инициализировать местозаполнитель:

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})