2017-09-04 4 views
1

私は大きなプリトリガされた埋め込みを持っていると想像してください。これは、形状が[3000000、200]のようにnumpy配列として読み込むことができます。この行列のサイズはので、このコードで、2ギガバイト以上である:テンソルフローグラフの分割変数として大きな数値の行列を読み込む

data = np.zeros(shape=(3000000, 200)) 
variable = tf.get_variable(
    "weigths", 
    [3000000, 200], 
    initializer=tf.constant_initializer(data)) 

session = tf.Session() 
session.run(tf.global_variables_initializer()) 

私が持っているエラーValueError: Cannot create a tensor proto whose content is larger than 2GB.

私はtf.assignとプレースホルダでそれを読み込むことができますが、いくつかの理由のために私が使用したいですこの埋め込みウェイトの分割バージョンです。 assignとplaceholderの方法が閉じられているため、パーティション化された変数はop:NotImplementedError: assign() has not been implemented for PartitionedVariable.を割り当てても機能しません。

このようなことはできますか?

答えて

2

SOLUTION

これは醜いですが、それは動作します:

def init_partitioned(session, var_name, data): 
    partitioned_var = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=var_name + "/part_\d+:0") 
    print("For {} founded {} parts".format(var_name, len(partitioned_var))) 

    dtype = partitioned_var[0].dtype 
    part_shape = partitioned_var[0].get_shape().as_list() 
    part_shape[0] = None 

    init = tf.placeholder(dtype, part_shape) 
    offset = 0 
    for idx, part in enumerate(partitioned_var): 
     init_op = tf.assign(part, init) 
     numRowsInPart = int(part.get_shape()[0]) 
     session.run(init_op, feed_dict={init: data[offset:offset + numRowsInPart]}) 
     offset += numRowsInPart 
0

試してみてください。

import numpy as np 
import tensorflow as tf 

data = np.zeros(shape=(3000000, 200)) 

ph = tf.placeholder(tf.float32, shape=(3000000, 200)) 
variable = tf.Variable(ph) 

session = tf.Session() 
session.run(tf.global_variables_initializer(), feed_dict={ph:data}) 
+0

主な目標は、パーティション変数にデータをロードすることです – svetlovva

関連する問題