我的 weight matrix 有几 G,feed 不进去,需要怎样才能解决这个问题呢?
kaede1993 2018-7-22 23:08:50
我的 weight matrix 有几 G,feed 不进去,需要怎样才能解决这个问题呢?
kaede1993 2018-7-22 23:08:50
1)简单的方案 使用 tf.Variable 的 load 函数,先初始化 variable,然后调用 load;
例如加载一个很大的外部变量
import tensorflow as tf
from gensim import models
model = models.KeyedVectors.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 = tf.Session ()
sess.run (tf.global_variables_initializer ())
embeddings.load (model.syn0, sess)
尽量少用大的 constant 内容,这部分尽量抽离出来,constant 内容会被打包进到整个 tensorflow 的图结构体中
bigfundamental 发表于 2018-7-23 11:20:55
谢谢您,我刚开始用 tf 所以不太懂,我是否可以理解为在定义 Variable 的时候不能传入一个很大的数据,但是在定义好这个 Variable 之后就可以随便对它进行处理。
比如:
我想将我的 Weight matrix 初始化为一个 (2^22, 2^8) 的矩阵 A,我不能直接用 W = tf.Variable (A)。但是可以通过先定义一个 W1 = tf.Variable ([1, 2^8]) 的变量和一个 (2^22, 1) 的矩阵 B,然后再利用 W = tf.matmul (B, W1) 得到我想要的 W?
kaede1993 发表于 2018-7-23 19:29:59
这个问题比较底层,假如要理解,就得理解 tensorflow 的设计机制,包括 Graph/Operation 以及序列化的一些 GraphDef/OpDef/NodeDef 这些 protobuf 的序列化数据结构;我个人建议你直接自己写代码试验下,你上述讲的 mat,也是一样的,会触发 2G 的限制,本质上跟赋值没什么太大的区别
其实记住一点就行了,就是在所有 tf 的操作中,尽量避免它的参数为大的 constant 常数
你用两个小常量的方式可以在某些时候绕过单个 tensor 2G 的问题,也就是说静态的两个小数组常量数据量比你相乘的 constant 少,可以 work;
但是这种方式你编程得多麻烦啊,而且当你这种小变量积累很多之后,整个 graph 还会有 2G 的限制检查,就是 GraphDef 2G 的错误报警
所以我不是特别推荐这种方式
bigfundamental 发表于 2018-7-24 09:37:10
tf.Variable 函数
cloump 发表于 2018-7-27 10:03:21