Tensorboard estimator export_savedmodel简单用法

本文详细介绍如何使用TensorFlow定义输入占位符,构建输入函数,并通过estimator.export_savedmodel方法将模型导出为SavedModel格式,便于后续的模型部署与服务化。同时,文章还涉及了模型导出过程中的一些关键参数设置,如词汇表文件的额外资产添加等。
部署运行你感兴趣的模型镜像
# add export graph
def serving_input_fn():
    input_ids = tf.placeholder(dtype=tf.int32, shape=[None, FLAGS.max_seq_length], name="input_ids")
    input_mask = tf.placeholder(dtype=tf.int32, shape=[None, FLAGS.max_seq_length], name="input_mask")
    segment_ids = tf.placeholder(dtype=tf.int32, shape=[None, FLAGS.max_seq_length], name="segment_ids")
    label_ids = tf.placeholder(dtype=tf.int32, shape=[None], name="label_ids")
    string_2 = tf.placeholder(dtype=tf.string, shape=[None], name="string_2")

    features = {'input_ids': input_ids,
                'input_mask': input_mask,
                'segment_ids': segment_ids,
                'label_ids': label_ids,
                'string_2': string_2}
    return tf.contrib.learn.InputFnOps(features, None, default_inputs=features)

export_dir = os.path.join(FLAGS.output_dir, "saved_model")
estimator.export_savedmodel(export_dir, serving_input_fn(),
                            assets_extra={"vocab.txt": FLAGS.vocab_file},
                            as_text=False,
                            strip_default_attrs=True)

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

这个错误: ```python TypeError: fit() got an unexpected keyword argument 'estimator__sample_weight' ``` 说明你尝试在 `fit()` 中传入一个叫 `estimator__sample_weight` 的参数,但模型的 `fit()` 方法并不接受它。 --- ## 🧨 错误原因分析 你在使用类似这样的代码时出错了: ```python grid_search.fit(X_train, y_train, estimator__sample_weight=samples_weights) ``` 或者: ```python cross_val_score(model, X_train, y_train, fit_params={'estimator__sample_weight': ...}) ``` 你本意是想给 `XGBRegressor` 传递样本权重(`sample_weight`),但由于你是用 `MultiOutputRegressor` 包裹的模型,**不能直接通过 `estimator__xxx` 向底层模型传递非标准参数**。 > ❌ `estimator__sample_weight` 并不是一个有效的参数转发方式,尤其是对 `sample_weight` 这种特殊参数。 --- ## ✅ 正确解决方案:使用 `fit_params` + `sample_weight` 的正确传递方式 ### ✅ 方法一:使用 `MultiOutputRegressor` 时,手动循环每个输出并设置 `sample_weight` 因为 `MultiOutputRegressor` 不支持自动转发 `sample_weight` 到每个子模型,所以我们需要 **自定义封装或手动处理**。 #### ✔️ 推荐做法:使用 `RegressorChain` 或 **自己写一个支持 sample_weight 的 MultiOutput 模型** 但最简单的方式是:**逐个训练每个输出,并分别传入 sample_weight** ```python from sklearn.base import clone import numpy as np class MultiOutputWithSampleWeight: def __init__(self, estimator): self.estimator = estimator self.estimators_ = [] def fit(self, X, y, sample_weight=None): self.estimators_ = [] n_targets = y.shape[1] for i in range(n_targets): est = clone(self.estimator) if sample_weight is not None: est.fit(X, y[:, i], sample_weight=sample_weight) else: est.fit(X, y[:, i]) self.estimators_.append(est) return self def predict(self, X): predictions = np.column_stack([est.predict(X) for est in self.estimators_]) return predictions ``` ### ✅ 使用示例: ```python # 假设你有样本权重(例如根据数据可靠性设定) sample_weight = np.ones(len(X_train)) # 示例:全为1,你可以自定义 # 创建你的模型 xgb_model = XGBRegressor(random_state=42) # 包装成支持 sample_weight 的多输出模型 multi_xgb = MultiOutputWithSampleWeight(xgb_model) # 训练(现在可以传 sample_weight) multi_xgb.fit(X_train, y_train, sample_weight=sample_weight) # 预测 y_pred = multi_xgb.predict(X_test) ``` --- ## ✅ 方法二:如果你坚持要用 `GridSearchCV` 或 `cross_validate`,也要配合 `fit_params` ```python from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid = { 'estimator__n_estimators': [100, 200], 'estimator__max_depth': [3, 5] } # 注意:这里不能用 estimator__sample_weight # 所以我们要改用上面自定义的 multi-output 类 # 改用我们自己的类 grid_search = GridSearchCV( MultiOutputWithSampleWeight(XGBRegressor()), param_grid, cv=3, scoring='r2', verbose=1 ) # 现在可以安全地传 fit_params grid_search.fit( X_train, y_train, sample_weight=sample_weight # 直接传进去,在 fit 中处理 ) ``` --- ## ❌ 为什么 `estimator__sample_weight` 不行? - `estimator__xxx` 是用来设置子估计器的 **构造参数(init 参数)** - 而 `sample_weight` 是 `fit()` 方法的一个参数,不是初始化参数 - 即使你能写 `estimator__sample_weight`,`MultiOutputRegressor` 内部也不会把它转发到 `.fit(X, y, sample_weight=...)` 中 👉 所以这条路走不通。 --- ## ✅ 方法三:如果不需要 `sample_weight`,那就别传! 如果你只是调试时误加了这句: ```python grid_search.fit(X_train, y_train, estimator__sample_weight=None) ``` 那你应该删掉这个参数!因为它根本无效。 ✅ 正确写法是: ```python grid_search.fit(X_train, y_train) ``` 除非你真的需要加权训练,否则不要引入不必要的 `fit_params`。 --- ## 🔍 如何判断是否需要 `sample_weight`? 只有当你有以下情况才需要: - 某些样本更可靠(比如实验重复多次的数据) - 数据存在类别不平衡(分类任务中常见) - 想强调某些区域的预测精度(如高 UTS 材料更重要) 如果没有明确理由,**不用加 `sample_weight`** --- ## ✅ 总结:如何避免此类错误 | 问题 | 解决方案 | |------|----------| | `estimator__sample_weight` 报错 | 删除该参数,或改用自定义多输出模型 | | `MultiOutputRegressor` 不支持 `sample_weight` | 自己实现支持该功能的包装类 | | 想做网格搜索又想加权 | 使用自定义类 + `fit_params` 在 `fit()` 中处理 | | 不确定要不要权重 | 先去掉,确保基础流程跑通 | --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值