运行 交叉验证时,Tensorflow 保存的模型会变大
Tensorflow saved models get bigger when running cross-validation
在 Tensorflow 上 运行 交叉验证的正确方法是什么?
以下是我的代码片段:
class TextCNN:
...
def train(self):
saver = tf.train.Saver(tf.all_variables())
with tf.Session() as sess:
...
# training loop
...
# training finished
path = saver.save(sess, "{:s}/model.{:d}".format(self.checkpoint_dir, self.test_fold))
if __name__ == "__main__":
for i in range(CV_SIZE):
cnn = TextCNN(i)
cnn.train()
fold 0 保存的模型大小约为 2M。但是对于4M左右的fold 1,6M左右的fold 2等等。
我的猜测是 TextCNN
构造函数和 train()
方法正在将节点添加到默认图 (tf.get_default_graph()
) 并且保存的模型包括所有以前的图,所以它是 "accidentally quadratic" 并随着 __main__
循环的每次迭代而增长。
幸运的是,解决方法很简单。只需按如下方式重写主循环:
if __name__ == "__main__":
for i in range(CV_SIZE):
with tf.Graph().as_default(): # Performs training in a new, empty graph.
cnn = TextCNN(i)
cnn.train()
这将为循环的每次迭代创建一个新的空图。因此保存的模型将不包含上一次迭代的节点(和变量),模型大小应保持不变。
请注意,如果可能,您应该尝试在所有迭代中重复使用同一个图。但是,我意识到如果图形的结构从一次迭代更改为下一次迭代,这可能是不可能的。
在 Tensorflow 上 运行 交叉验证的正确方法是什么?
以下是我的代码片段:
class TextCNN:
...
def train(self):
saver = tf.train.Saver(tf.all_variables())
with tf.Session() as sess:
...
# training loop
...
# training finished
path = saver.save(sess, "{:s}/model.{:d}".format(self.checkpoint_dir, self.test_fold))
if __name__ == "__main__":
for i in range(CV_SIZE):
cnn = TextCNN(i)
cnn.train()
fold 0 保存的模型大小约为 2M。但是对于4M左右的fold 1,6M左右的fold 2等等。
我的猜测是 TextCNN
构造函数和 train()
方法正在将节点添加到默认图 (tf.get_default_graph()
) 并且保存的模型包括所有以前的图,所以它是 "accidentally quadratic" 并随着 __main__
循环的每次迭代而增长。
幸运的是,解决方法很简单。只需按如下方式重写主循环:
if __name__ == "__main__":
for i in range(CV_SIZE):
with tf.Graph().as_default(): # Performs training in a new, empty graph.
cnn = TextCNN(i)
cnn.train()
这将为循环的每次迭代创建一个新的空图。因此保存的模型将不包含上一次迭代的节点(和变量),模型大小应保持不变。
请注意,如果可能,您应该尝试在所有迭代中重复使用同一个图。但是,我意识到如果图形的结构从一次迭代更改为下一次迭代,这可能是不可能的。