在训练过程中吧,有的时候会出现训练到一半的时候内存不够,或者其他报错,程序中断,或者先训练一小会,之后有时间继续训练,这时候就需要断点续训操作。
概念:断点续训的意思是因为某些原因还没有训练完成就被中断,下一次训练可以在上一次的训练基础上继续进行。这种方式对于需要长时间训练的模型而言非常友好
在代码实现上,前面内容不变,还是老三样,导入,构建,compile
import tensorflow as tf
import os
from tensorflow import keras
mnist = keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train,x_test = x_train/255,x_test/255
model = keras.models.Sequential([
keras.layers.Flatten(),
keras.layers.Dense(128,activation='relu'),
keras.layers.Dense(10,activation='softmax')
])
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
之后你想知道中断时候的参数啥样,就得先定义一个文件保存你的参数对吧
checkpoint_save_path = './临时文件/mnist.ckpt'
这个ckpt文件就是中断时候保存参数的一个文件,在生成ckpt文件的时候同时会自动生成一个索引文件,以.index后缀结尾
cp_callback = keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True)
keras.callbacks.ModelCheckpoint就是生成目标文件的一个函数,里面参数第一个是文件路径,其他参数设置的为只保存权重,只保存最优参数
然后运行一下,会生成相应文件
import tensorflow as tf
import os
from tensorflow import keras
mnist = keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train,x_test = x_train/255,x_test/255
model = keras.models.Sequential([
keras.layers.Flatten(),
keras.layers.Dense(128,activation='relu'),
keras.layers.Dense(10,activation='softmax')
])
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
checkpoint_save_path = './临时文件/mnist.ckpt'
# 生成ckpt的同时会生成索引文件
if os.path.exists(checkpoint_save_path+'.index'):
print('-----------load the model----------------')
model.load_weights(checkpoint_save_path)
cp_callback = keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True)
history = model.fit(x_train,y_train,batch_size=32,epochs=5,validation_data=(x_test,y_test),validation_freq=1,callbacks=[cp_callback])
model.summary()
其中------load the model--------那个部分,如果你生成过一次ckpt文件,下次直接读取里面的参数,不用重新训练,这次训练是在上次训练的基础上进行的