2016-02-14 21 views
14

Tôi đang cố gắng khởi tạo một lưu lượng hàng chục Variable với các lần nhúng trước khi được đào tạo word2vec.Khởi tạo biến tensorflow với một mảng lớn hơn 2GB

Tôi đã đoạn mã sau:

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

Và tôi nhận được lỗi sau:

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

Mảng (X) Tôi cố gắng để gán được hình dạng (3000000, 300) và kích thước của nó là 3.6 GB.

Tôi cũng gặp lỗi tương tự nếu tôi thử tf.convert_to_tensor(X).

Tôi biết rằng nó không thành công do thực tế là mảng lớn hơn 2GB. Tuy nhiên, tôi không biết cách chỉ định một mảng lớn hơn 2GB cho một chuỗi lưu lượng là Variable

Trả lời

6

Giải pháp đơn giản nhất là đưa dữ liệu đó vào nút giữ chỗ mà bạn sử dụng để tf.assign vào biến.

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

Như Joshua ít lưu ý trong một câu trả lời riêng biệt, bạn cũng có thể sử dụng nó trong initializer:

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

'X.đăng ký (vị trí)' cần phải là 'tf.assign (X, place, validate_shape = False)', hoặc TensorFlow sẽ khiếu nại rằng bạn đang thay đổi hình dạng của tensor. Khác hơn thế, công trình này. –

+0

Cảm ơn bạn - đã cập nhật câu trả lời để bao gồm nhận xét của + mrry bên dưới, bằng cách đặt hình dạng của trình giữ chỗ. – dga

+3

để biết thêm thông tin về cách thực hiện điều này trong tài liệu dưới [dữ liệu được tải trước] (https://www.tensorflow.org/versions/r0.7/how_tos/reading_data/index.html#preloaded-data) và một ví dụ làm việc đầy đủ về cách sử dụng trình giữ chỗ và biến để tải trước các đầu vào đào tạo MNIST [tại đây] (https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/how_tos/reading_data/ global_connected_preloaded_var.py) – stefano

10

Nó có vẻ như lựa chọn duy nhất là sử dụng một trình giữ chỗ. Cách tốt nhất tôi có thể tìm là khởi tạo trực tiếp đến trình giữ chỗ:

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

Lưu ý rằng bạn cũng có thể đặt đối số hình dạng tùy chọn khi bạn gọi 'tf.placeholder()' và sau đó bạn không cần 'validate_shape = False' (và bạn có suy luận hình dạng tốt hơn trong phần còn lại của chương trình!). – mrry

+0

@mrry, Ồ, đúng vậy. Cảm ơn. Tôi đã thêm nó vào câu trả lời. –

+0

Giải pháp sạch, đẹp. Được thăng hạng. – dga

Các vấn đề liên quan