Если вы укажете аргумент initializer
для tf.get_variable()
, начальное значение GLOVE_MATRIX
будет сохранено в графе и превысит 2 Гб. Хороший ответ объясняет, как вообще загружать вложения.
Вот первый пример, где мы используем инициализатор, а определение графа составляет около 4 МБ, поскольку в нем хранится матрица (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
В оценщиках
Для оценщиков у нас нет прямого доступа к сеансу. Способом инициализации встраивания может быть использование 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
.
person
Olivier Moindrot
schedule
13.01.2018