TensorFlow新手求助:用训练钩子在tf.estimator.DNNRegressor实现MNIST早停
实现tf.estimator.DNNRegressor的早停功能(针对MNIST数据集)
嘿,刚接触TensorFlow的话,确实容易在找特定钩子的时候懵——官方文档里Logging Hook的例子确实多,但早停的需求其实有现成的工具可以用!咱们直接上代码和解释,一步步来:
1. 先准备MNIST数据和基础设置
首先得加载MNIST数据集,用TensorFlow自带的工具就行,顺便做下数据预处理适配estimator的输入要求:
import tensorflow as tf from tensorflow.estimator import DNNRegressor from tensorflow.estimator.experimental import stop_if_no_decrease_hook # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 数据归一化+调整形状(把28*28的图像转成784维的特征向量) x_train = x_train.reshape(-1, 784) / 255.0 x_test = x_test.reshape(-1, 784) / 255.0 y_train = y_train.astype(float) y_test = y_test.astype(float) # 定义训练/评估用的输入函数 def train_input_fn(): dataset = tf.data.Dataset.from_tensor_slices(({"x": x_train}, y_train)) dataset = dataset.shuffle(1000).batch(32).repeat() return dataset def eval_input_fn(): dataset = tf.data.Dataset.from_tensor_slices(({"x": x_test}, y_test)) dataset = dataset.batch(32) return dataset
2. 设置早停钩子
这里用tf.estimator.experimental.stop_if_no_decrease_hook,这个钩子专门用来监控指定指标,一旦在设定步数内没有下降(也就是没有提升),就自动停止训练。关键参数我给你标注清楚:
metric_name:要监控的指标,对于DNNRegressor,默认的损失指标是'average_loss'max_steps_without_decrease:允许损失没提升的最大步数,这里设成500,你可以根据自己的任务调整min_steps:至少先训练多少步再开始检查早停,避免训练初期损失波动导致过早停止
# 定义特征列(DNNRegressor必须的输入格式) feature_columns = [tf.feature_column.numeric_column('x', shape=[784])] # 构建DNNRegressor实例 estimator = DNNRegressor( feature_columns=feature_columns, hidden_units=[256, 128, 64], # 三层隐藏层的结构 model_dir='./mnist_regressor_model' # 模型保存路径 ) # 创建早停钩子 early_stopping_hook = stop_if_no_decrease_hook( estimator=estimator, metric_name='average_loss', max_steps_without_decrease=500, min_steps=1000, # 先训练1000步再启动早停检查 run_every_steps=100 # 每100步检查一次指标状态 )
3. 启动训练(带上早停钩子)
训练的时候把早停钩子传入hooks参数就好,钩子会在训练过程中自动监控损失,满足条件就停止:
# 开始训练,同时传入早停钩子 estimator.train( input_fn=train_input_fn, hooks=[early_stopping_hook], max_steps=10000 # 设置一个最大步数兜底,防止极端情况无限训练 ) # 训练结束后可以评估模型效果 eval_results = estimator.evaluate(input_fn=eval_input_fn) print("模型评估结果:", eval_results)
小提示
- 你可以加个LoggingHook来实时打印损失,确认早停钩子的触发时机是否符合预期
- 如果想监控自定义评估指标,只需要把
metric_name改成你自定义指标的名称就行
内容的提问来源于stack exchange,提问作者abhishek jha
相关产品推荐
相关产品推荐

