【tensorflow】TF1.x保存.pb模型 解决模型越训练越大问题

这篇具有很好参考价值的文章主要介绍了【tensorflow】TF1.x保存.pb模型 解决模型越训练越大问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  在上一篇博客【tensorflow】TF1.x保存与读取.pb模型写法介绍介绍的保存.pb模型方法中,保存的是模型训练过程中所有的参数,而且训练越久,最终保存的模型就越大。我的模型只有几千参数,可是最终保存的文件有1GB。。。。

  但是其实我只想要保存参数去部署模型,然后预测。网上有一些解决方案但都不是我需要的,因为我要用Java部署模型,python这里必须要用builder.add_meta_graph_and_variables来保存参数。以下是解决方案:

举例:模型定义如下

# 定义模型
with tf.name_scope("Model"):
    """MLP"""
    # 13个连续特征数据(13列)
    x = tf.placeholder(tf.float32, [None,13], name='X') 
    # 正则化
    x_norm = tf.layers.batch_normalization(inputs=x)
    # 定义一层Dense
    dense_1 = tf.layers.Dense(64, activation="relu")(x_norm)
    
    """EMBED"""
    # 离散输入
    y = tf.placeholder(tf.int32, [None,2], name='Y')
    # 创建嵌入矩阵变量
    embedding_matrix = tf.Variable(tf.random_uniform([len(vocab_dict) + 1, 8], -1.0, 1.0))
    # 使用tf.nn.embedding_lookup函数获取嵌入向量
    embeddings = tf.nn.embedding_lookup(embedding_matrix, y)
    # 创建 LSTM 层
    lstm_cell = tf.nn.rnn_cell.LSTMCell(64)
    # 初始化 LSTM 单元状态
    initial_state = lstm_cell.zero_state(tf.shape(embeddings)[0], tf.float32)
    # 将输入数据传递给 LSTM 层
    lstm_out, _ = tf.nn.dynamic_rnn(lstm_cell, embeddings, initial_state=initial_state)
    # 定义一层Dense
    dense_2 = tf.layers.Dense(64, activation="relu")(lstm_out[:, -1, :])
    
    """MERGE"""
    combined = tf.concat([dense_1, dense_2], axis = -1)
    pred = tf.layers.Dense(2, activation="relu")(combined)
    pred = tf.layers.Dense(1, activation="linear", name='P')(pred)
    
    z = tf.placeholder(tf.float32, [None, 1], name='Z')

  虽然写这么多,但是上面模型的输入只有xyz,输出只有pred。所以我们保存、加载模型时,只用考虑这几个变量就可以。

模型保存代码

  这里的保存方法建议对比上一篇博客【tensorflow】TF1.x保存与读取.pb模型写法介绍介绍的保存.pb模型方法来看。

import tensorflow as tf
from tensorflow import saved_model as sm
from tensorflow.tools.graph_transforms import TransformGraph
from tensorflow.core.framework import graph_pb2

def get_node_names(name_list, nodes_list):
    name_list.extend([n.name.split(":")[0] for _, n in nodes_list.items() if n.name.split(":")[0] != ''])

# 创建 Saver 对象
saver = tf.train.Saver()

# 生成会话,训练STEPS轮
with tf.Session() as sess:
    # 初始化参数
    sess.run(tf.global_variables_initializer())
    
    ...... # 模型训练逻辑
            
   # 准备存储模型
    path = 'pb_model/'
    # 创建 Saver 对象,用于保存和加载模型的变量
    pb_saver = tf.train.Saver(var_list=None)
    # 将 Saver 对象转换为 SaverDef 对象
    saver_def = pb_saver.as_saver_def()
    # 从会话的图定义中提取包含恢复操作的子图
    saver_def_ingraph = tf.graph_util.extract_sub_graph(sess.graph.as_graph_def(), [saver_def.restore_op_name])
    
    # 构建需要在新会话中恢复的变量的 TensorInfo protobuf
    # 自定义 根据自己的模型来写
    inputs = {
        'x' : sm.utils.build_tensor_info(x),
        'y' : sm.utils.build_tensor_info(y),
        'z' : sm.utils.build_tensor_info(z)
    }
    outputs = {
        'p' : sm.utils.build_tensor_info(pred)
    }

    # 获取节点的名称
    input_node_names = []
    get_node_names(input_node_names, inputs)
    output_node_names = []
    get_node_names(output_node_names, outputs)
    
    # 获取当前会话的图定义
    input_graph_def = sess.graph.as_graph_def()
    
    # 定义需要应用的图转换操作列表
    transforms = ['add_default_attributes',
                  'fold_constants(ignore_errors=true)',
                  'fold_batch_norms',
                  'fold_old_batch_norms',
                  'sort_by_execution_order',
                  'strip_unused_nodes']
    
    # 应用图转换操作,并获取优化后的图定义
    opt_graph_def = TransformGraph(input_graph_def,
                                   input_node_names,
                                   output_node_names,
                                   transforms)
    
    # 创建新的默认图并导入优化后的图定义
    with tf.Graph().as_default() as graph:
    
        all_names = set([node.name for node in opt_graph_def.node])
        saver_def_ingraph_nodes = [node for node in saver_def_ingraph.node if not node.name in all_names]
        merged_graph_def = graph_pb2.GraphDef()
        merged_graph_def.node.extend(opt_graph_def.node)
        merged_graph_def.node.extend(saver_def_ingraph_nodes)

        # 导入合并后的图定义到新的默认图中
        tf.graph_util.import_graph_def(merged_graph_def, name="")

        builder = sm.builder.SavedModelBuilder(path)


        # 将 graph 和变量等信息写入 MetaGraphDef protobuf
        # 这里的 tags 里面的参数和 signature_def_map 字典里面的键都可以是自定义字符串,也可用tf里预设好的方便统一
        builder.add_meta_graph_and_variables(
            sess, tags=[sm.tag_constants.SERVING],
            signature_def_map={sm.signature_constants.PREDICT_METHOD_NAME: SignatureDef},
            saver=pb_saver,
            main_op=tf.local_variables_initializer()
        )

        # 将 MetaGraphDef 写入磁盘
        builder.save()

  这样之后你会发现模型的大小从GB锐减到几十KB。文章来源地址https://www.toymoban.com/news/detail-523195.html

到了这里,关于【tensorflow】TF1.x保存.pb模型 解决模型越训练越大问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 请描述TensorFlow中的Saver对象及其用途。在TensorFlow中,如何保存和加载训练好的模型?

    请描述TensorFlow中的Saver对象及其用途。 TensorFlow中的Saver对象是一个用于保存和加载模型参数的类。Saver对象在TensorFlow中扮演着至关重要的角色,尤其是在模型训练和部署的过程中。 Saver对象的主要用途如下: 模型保存:在训练神经网络模型的过程中,我们通常需要保存模型

    2024年04月15日
    浏览(13)
  • 基于TF-IDF+Tensorflow+PyQt+孪生神经网络的智能聊天机器人(深度学习)含全部Python工程源码及模型+训练数据集

    基于TF-IDF+Tensorflow+PyQt+孪生神经网络的智能聊天机器人(深度学习)含全部Python工程源码及模型+训练数据集

    本项目利用TF-IDF(Term Frequency-Inverse Document Frequency 词频-逆文档频率)检索模型和CNN(卷积神经网络)精排模型构建了一个聊天机器人,旨在实现一个能够进行日常对话和情感陪伴的聊天机器人。 首先,我们使用TF-IDF技术构建了一个检索模型。TF-IDF可以衡量一个词语在文档中

    2024年02月13日
    浏览(35)
  • tensorflow2 tf.train.Checkpoint :变量的保存与恢复

    Checkpoint 只保存模型的参数,不保存模型的计算过程,因此一般用于在具有模型源代码的时候恢复之前训练好的模型参数。如果需要导出模型(无需源代码也能运行模型),可以使用SavedModel。 首先声明一个 Checkpoint 当模型训练完成需要保存的时候,使用 当在其他地方需要为模

    2024年02月11日
    浏览(4)
  • 时间步长问题。tensorflow训练lstm时序模型,输出层实际输出维度和期待维度不一致

    时间步长问题。tensorflow训练lstm时序模型,输出层实际输出维度和期待维度不一致

    设置输出维度为1. Dense(1) 但结果跑出来的输出维度每次都是三维的。 模型设置: 输入x维度(2250,48,2) 输入y 维度(2250,) 和 (2250,1) 但模型预测出的结果维度都是(2250,48,1) 我就很纳闷= = ! 后来对比了以前跑过的文件。发现LSTM少定义一个参数。 input_shape填两个

    2024年04月28日
    浏览(14)
  • 基于TF-IDF+TensorFlow+词云+LDA 新闻自动文摘推荐系统—深度学习算法应用(含ipynb源码)+训练数据集

    基于TF-IDF+TensorFlow+词云+LDA 新闻自动文摘推荐系统—深度学习算法应用(含ipynb源码)+训练数据集

    本项目运用了TF-IDF提取技术,结合词云数据可视化、LDA (Latent Dirichlet Allocation)模型训练以及语音转换系统,来实现一个基于TensorFlow的文本摘要程序。 首先,我们利用TF-IDF(Term Frequency-Inverse Document Frequency)技术来提取文本中的。这有助于找出文本中最具代表性的

    2024年02月13日
    浏览(11)
  • 解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

    解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

    deepspeed存在一个bug,即在训练时不保存调度器状态,因此如果训练中断后再重新开始训练,调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出:https://github.com/microsoft/DeepSpeed/issues/3875 因此我们需要写一个保存调度器

    2024年02月09日
    浏览(9)
  • tensorflow2模型保存和恢复

    tensorflow2模型保存和恢复

    有两种方法可以保存模型: ·使用检查点,一种简单的在硬盘上保存变量的方法 ·使用SavedModel,模型结构及检查点 检查点不包含任何关于模型自身的描述:它们只是一种简单的存储参数并能让开发者正确恢复它的方法。 SavedModel格式在保存参数值的基础上加上了计算过程的序

    2024年02月11日
    浏览(9)
  • 解决 vue 项目开发越久 node_modules包越大的问题

    vue 每次编译都会将编译后的文件缓存在 node_modules /.cache 里面,因此需要在 vue.config.js 配置取消缓存

    2024年02月08日
    浏览(9)
  • tensorflow2 模型建立与训练

    模型的构建:  tf.keras.Model  和  tf.keras.layers 模型的损失函数:  tf.keras.losses 模型的优化器:  tf.keras.optimizer 模型的评估:  tf.keras.metrics Keras 有两个重要的概念:  模型(Model)  和  层(Layer)  。层将各种计算流程和变量进行了封装(例如基本的全连接层,CNN 的卷积层

    2024年02月10日
    浏览(15)
  • 使用TensorFlow训练深度学习模型实战(下)

    使用TensorFlow训练深度学习模型实战(下)

    大家好,本文接TensorFlow训练深度学习模型的上半部分继续进行讲述,下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。 定义深度学习模型 数据准备完成后,下一步是使用TensorFlow搭建神经网络模型,搭建模型有两个选项: 可以使用各种层,包括Dense、Conv2D和

    2024年02月15日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包