法布里奇奥正确地指出 https://stackoverflow.com/a/42401742/3574081协议缓冲区的大小有 2GB 的硬性限制,但您可能想知道why你的程序达到了这个限制。问题源于这些行:
for v in tf.trainable_variables():
embedding = np.random.uniform(-1, 1, (400000, 1024))
sess.run(v.assign(embedding))
当执行命中时v.assign(embedding)
,新节点将添加到 TensorFlow 图中。特别是,每个embedding
数组被转换为tf.constant() https://www.tensorflow.org/api_docs/python/tf/constant张量,会很大(我估计大约 328MB)。
避免这种情况的最佳方法是使用以下命令将先前模型中的变量直接加载到新模型中:tf.train.Saver https://www.tensorflow.org/api_docs/python/tf/train/Saver。由于模型可能具有不同的结构,因此您可能需要指定从旧模型中的变量名称到新模型的映射。tf.Variable
新模型中的对象。
解决问题的另一种方法是预先创建一个tf.placeholder() https://www.tensorflow.org/api_docs/python/tf/placeholderop 用于为每个变量分配一个值。这可能需要对实际代码进行更多重组,但以下内容对我有用:
v1 = tf.get_variable("L_enc", [400000, 1024])
v2 = tf.get_variable("L_dec", [400000, 1024])
# Define a separate placeholder and assign op for each variable, so
# that we can feed the initial value without adding it to the graph.
vars = [v1, v2]
placeholders = [tf.placeholder(tf.float32, shape=[400000, 1024]) for v in vars]
assign_ops = [v.assign(p) for (v, p) in zip(vars, placeholders)]
init_op = tf.global_variables_initializer()
saver = tf.train.Saver(tf.all_variables())
with tf.Session() as sess:
sess.run(init_op)
for p, assign_op in zip(placeholders, assign_ops):
embedding = np.random.uniform(-1, 1, (400000, 1024))
sess.run(assign_op, {p: embedding})
# Save the variables to disk.
save_path = saver.save(sess, "./model.ckpt")
print("Model saved in file: %s" % save_path)