如果将initializer
参数指定为tf.get_variable()
,则初始值GLOVE_MATRIX
将存储在图形中并超过 2Gb。一个好的答案解释了如何加载嵌入。
这是我们使用初始化程序的第一个示例,并且图形 def 大约为 4Mb,因为它将(1000, 1000)
矩阵存储在其中。
size = 1000
initial_value = np.random.randn(size, size)
x = tf.get_variable("x", [size, size], initializer=tf.constant_initializer(initial_value))
sess = tf.Session()
sess.run(x.initializer)
assert np.allclose(sess.run(x), initial_value)
graph = tf.get_default_graph()
print(graph.as_graph_def().ByteSize()) # should be 4000394
这是一个更好的版本,我们不存储它:
size = 1000
initial_value = np.random.randn(size, size)
x = tf.get_variable("x", [size, size])
sess = tf.Session()
sess.run(x.initializer, {x.initial_value: initial_value})
assert np.allclose(sess.run(x), initial_value)
graph = tf.get_default_graph()
print(graph.as_graph_def().ByteSize()) # should be 1203
在估算器中
对于 Estimators,我们无法直接访问 Session。初始化嵌入的一种方法是使用tf.train.Scaffold
. 您可以将其传递init_fn
给初始化嵌入变量的参数,而无需将实际值保存在图形 def 中。
def model_fn(features, labels, mode):
size = 10
initial_value = np.random.randn(size, size).astype(np.float32)
x = tf.get_variable("x", [size, size])
def init_fn(scaffold, sess):
sess.run(x.initializer, {x.initial_value: initial_value})
scaffold = tf.train.Scaffold(init_fn=init_fn)
loss = ...
train_op = ...
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op, scaffold=scaffold)
使用内置 Scaffold 的一个好处是它只会在您第一次调用时初始化嵌入train_input_fn
。对于以后的调用,它不会再次运行init_fn
。