You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存TensorFlow模型?基于官方CNN教程的模型保存问询

嘿,我看你跟着官方的CNN教程搭建模型,现在想要保存它对吧?这里给你两种适配你代码风格的实用方法,都是TensorFlow里常用的保存方式:

方法1:保存为SavedModel格式(推荐,官方标准格式)

这种格式是TensorFlow的标准导出格式,既可以用来加载继续训练,也能直接部署到TensorFlow Serving或者其他平台。

首先,我们需要先完善你的模型函数,在预测模式下添加导出签名(这样TensorFlow能识别模型的输入输出),然后训练完成后调用导出方法:

完善后的模型函数

import numpy as np
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.INFO)

def cnn_model_fn(features, labels, mode):
    # 你的基础CNN层(补全你没写完的部分)
    input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])
    conv1 = tf.layers.conv2d(
        inputs=input_layer,
        filters=32,
        kernel_size=[5, 5],
        padding="same",
        activation=tf.nn.relu)
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
    
    # 后续的卷积、池化、全连接层(按教程补全)
    conv2 = tf.layers.conv2d(
        inputs=pool1,
        filters=64,
        kernel_size=[5, 5],
        padding="same",
        activation=tf.nn.relu)
    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
    
    pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
    dropout = tf.layers.dropout(
        inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
    
    logits = tf.layers.dense(inputs=dropout, units=10)
    
    # 定义预测输出
    predictions = {
        "classes": tf.argmax(input=logits, axis=1),
        "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
    }
    
    # 关键:添加导出签名,让SavedModel知道如何接收输入
    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(
            mode=mode, 
            predictions=predictions,
            export_outputs={
                'predict': tf.estimator.export.PredictOutput(predictions)
            })
    
    # 损失、训练、评估逻辑(和教程一致)
    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
    
    if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
        train_op = optimizer.minimize(
            loss=loss,
            global_step=tf.train.get_global_step())
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
    
    eval_metric_ops = {
        "accuracy": tf.metrics.accuracy(
            labels=labels, predictions=predictions["classes"])}
    return tf.estimator.EstimatorSpec(
        mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

训练后导出模型

当你完成模型训练后,执行下面的代码就能把模型保存成SavedModel:

# 创建Estimator实例(指定model_dir用来存检查点)
mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_checkpoints")

# 这里是你的训练代码(按教程写的训练逻辑,比如train_input_fn等)
# ...(省略训练步骤)

# 导出SavedModel到指定目录
export_dir = "/tmp/saved_mnist_cnn_model"
saved_model_path = mnist_classifier.export_saved_model(
    export_dir,
    # 定义服务时的输入格式,和你的输入特征匹配
    serving_input_receiver_fn=lambda: tf.estimator.export.build_parsing_serving_input_receiver_fn(
        tf.feature_column.make_parse_example_spec([tf.feature_column.numeric_column("x", shape=[28,28])]))()
)

print(f"模型已成功保存到: {saved_model_path}")
方法2:自动保存检查点(用于断点续训)

如果你只是想保存训练过程中的权重,方便后续继续训练,那tf.estimator其实会自动帮你做这件事——只要你在创建Estimator时指定了model_dir,训练过程中它会定期把检查点(.ckpt文件)保存到这个目录里。

下次要继续训练时,只需要用同一个model_dir创建Estimator实例,它会自动加载之前保存的权重,接着上次的进度训练。


内容的提问来源于stack exchange,提问作者Abin John Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:01