我最近需要在tensorflow中初始化一个大的嵌入矩阵(大于2GB),并且大小达到协议缓冲区的2GB限制。
我在stackoverflow上寻求帮助,并能够对此出色的answer进行说明,以解释在这种情况下使用占位符的情况。尽管占位符解决方案效果很好,但我发现以下使用tf初始化程序的解决方案也可以工作,但是我不明白为什么该解决方案在2GB的限制内不会成为问题。
import tensorflow as tf
mb = 2 ** 20
gb = 2 ** 30
tf.reset_default_graph()
with tf.Session() as sess:
value = tf.random_uniform([2 * gb]) # using np.random.randn will break the limit
v = tf.get_variable("v", initializer=value, dtype=tf.float32)
sess.run(tf.global_variables_initializer())
print(sess.run(v[:10]))
graph = tf.get_default_graph()
print(graph.as_graph_def().ByteSize() / mb) # 0.0012083053588867188
这项工作是因为tf.random*
初始化程序在内部检查要生成的张量的形状并相应地切换到占位符实现?但是,如果在张量板上查看该图,则在该图上将看不到任何占位符节点。
谢谢!