原文:https://www.tensorflow.org/get_started/checkpoints
TensorFlow 提供两种模型格式:
Estimator自动将这些写入硬盘:
要将值分配给任何Estimator的构造函数的可选model_dir参数以指定Estimator存储其信息的顶级目录。 例如,以下代码将model_dir参数设置为models / iris目录:
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
n_classes=3,
model_dir='models/iris')
假设调用评估器的训练方法。例如:
classifier.train(
input_fn=lambda:train_input_fn(train_x, train_y, batch_size=100),
steps=200)
如下图所示,第一次训练调用将检查点和其他文件添加到model_dir目录中:
如果没有在构造函数里指定 model_dir,Estimator将检查点文件写入由Python的tempfile.mkdtemp函数选择的临时目录。
默认规则:
也可以通过以下步骤修改:
例如以下代码:
my_checkpointing_config = tf.estimator.RunConfig(
save_checkpoints_secs = 20*60, # Save checkpoints every 20 minutes.
keep_checkpoint_max = 10, # Retain the 10 most recent checkpoints.
)
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
n_classes=3,
model_dir='models/iris',
config=my_checkpointing_config)
第一次调用Estimator的train方法时,TensorFlow将检查点保存到model_dir。随后每次调用Estimator的train,eval或predict方法都会导致以下情况:
也就是说,一旦存在检查点,TensorFlow会在每次调用train(),evaluate()或predict()时重建模型。
从检查点恢复模型的状态只适用于模型和检查点是兼容的。例如,假设训练了一个包含两个隐藏层的DNNClassifier评估器,每个层都有10个节点:
classifier = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[10, 10],
n_classes=3,
model_dir='models/iris')
classifier.train(
input_fn=lambda:train_input_fn(train_x, train_y, batch_size=100),
steps=200)
在训练之后(并且因此在models/iris中创建检查点之后),将每个隐藏层中的神经元数量从10更改为20,然后尝试重新训练模型:
classifier2 = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[20, 20], # Change the number of neurons in the model.
n_classes=3,
model_dir='models/iris')
classifier.train(
input_fn=lambda:train_input_fn(train_x, train_y, batch_size=100),
steps=200)
由于检查点中的状态与classifier2中描述的模型不兼容,重新训练失败,并出现以下错误:
...
InvalidArgumentError (see above for traceback): tensor_name =
dnn/hiddenlayer_1/bias/t_0/Adagrad; shape in shape_and_slice spec [10]
does not match the shape stored in checkpoint: [20]
要运行训练和比较稍有不同版本的模型的实验,保存创建每个model-dir的代码副本,可能需要为每个版本创建一个单独的git分支。 这种分离将保持检查点的可恢复性。