人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载导读SQLFlow 的核心能力是让 SQL 程序直接调用用 Python 定义的深度学习模型——用户只需在 SQL 中书写TO TRAIN语句指定模型名称与超参数即可触发一次完整的模型训练、评估与预测流程。本文以 SQLFlow 官方设计文档《Define Models for SQLFlow》为基础讲解如何在 SQLFlow 中定义自定义模型为什么选择 Keras 而非 TensorFlow Estimator、Keras 三种建模 API 的取舍、tf.keras.Model子类化与 Functional API 的完整代码示例并结合仓库源码剖析 SQLFlow 运行时runtime如何加载、编译、训练、保存与预测这些自定义模型。读完本文你将掌握编写可直接被 SQL 语句调用的 Keras 自定义模型的全部规范与底层原理。为什么 SQLFlow 首选 Keras 而非 EstimatorSQLFlow 需要 SQL 程序能够调用定义在 Python 中的深度学习模型。在 TensorFlow 生态中模型通常有两种定义方式Keras API或继承tf.estimator.Estimator的自定义类。SQLFlow 明确优先选择 Keras理由有三TensorFlow 2.x 将与 Keras 深度集成官方在 TensorFlow Dev Summit 2019 上宣布了这一方向Keras 的文档资料比 Estimator 更丰富学习与排查成本更低社区中用 Keras 定义的模型数量远多于 Estimator。这一取向在仓库源码中得到了印证运行时在加载模型后会通过 is_tf_estimator 判断模型是否为 Estimator仅当模型是tf.estimator.Estimator、BoostedTreesClassifier或BoostedTreesRegressor的子类时返回 True其余一律按 Keras 模型走训练/预测分支而 SQL 侧的代码生成模板 template_train.go 默认导入的是tensorflow.estimator中预置的分类器/回归器与 Keras 优化器、损失函数供两类模型共同使用。Keras 三种建模 API 及其代码形态Keras 提供了三种定义模型的方式SQLFlow 文档逐一给出了最小可运行的代码骨架1. 子类化tf.keras.Model通过继承tf.keras.Model并重写__init__与call方法构建模型class DNNClassifier(tf.keras.Model): def __init__(self, feature_columns, hidden_units, n_classes): super(DNNClassifier, self).__init__() self.feature_layer tf.keras.layers.DenseFeatures(feature_columns) self.hidden_layers [] for hidden_unit in hidden_units: self.hidden_layers.append(tf.keras.layers.Dense(hidden_unit)) self.prediction_layer tf.keras.layers.Dense(n_classes, activationsoftmax) def call(self, inputs): x self.feature_layer(inputs) for hidden_layer in self.hidden_layers: x hidden_layer(x) return self.prediction_layer(x) model DNNClassifier(feature_columns, hidden_units, n_classes)注意tf.keras.Model提供的save_weights/load_weights只保存和恢复模型参数weights不保存网络拓扑结构topology。这一限制对子类化模型尤其明显——由于拓扑结构在 Python 代码中定义反序列化时必须重新实例化模型对象再加载权重。SQLFlow 正是按这一思路处理预测阶段先用同样的模型类与参数重建对象再加载权重详见下文保存与加载一节。2. Functional API函数式 APIx tf.feature_column.input_layer(shape(5,)) for n in hidden_units: x tf.keras.layers.Dense(n, activationrelu)(x) pred tf.keras.layers.Dense(n_classes, activationsoftmax)(x) model tf.keras.models.Model(inputsfeature_columns, outputspred)函数式 API 可以与 feature column API 协作但需要为每个原始特征列手工分配一个tf.keras.Input作为输入占位。3.keras.Sequential顺序模型model tf.keras.Sequential() model.add(tf.keras.layers.DenseFeatures(feature_columns)) for n in hidden_units: model.add(tf.keras.layers.Dense(n, activationrelu)) model.add(tf.keras.layers.Dense(n_classes, activationsoftmax))需要特别说明的是Sequential只能覆盖少量简单模型无法表达 ResNet、Transformer、WideAndDeep 等主流结构因此覆盖面有限。SQLFlow 的最终选择子类化tf.keras.Model三种 API 的对比如下表Keras API兼容 feature column API保存/加载模型模型覆盖面tf.keras.Model子类化☑️仅权重无拓扑高Functional API☑️☑️高Sequential 模型☑️☑️低综合与 feature column 的协作能力、模型的保存加载便利性、结构覆盖面三个维度SQLFlow 选定子类化tf.keras.Model作为首选建模方式。值得注意的是子类化模型只保存权重、不保存拓扑的局限并不会妨碍 SQLFlow 的使用因为 SQLFlow 的 SQL 语句本身完整记录着模型类名estimator与全部模型参数model.*运行时可以在训练、预测、评估阶段随时用这些信息重建模型对象——拓扑信息其实隐含在 SQL 中。实战示例一子类化tf.keras.Model的完整写法SQLFlow 文档给出了一个可在 SQL 中直接调用的完整模型类DNNClassifier要求 TensorFlow 2.0 alpha 及以上版本class DNNClassifier(tf.keras.Model): def __init__(self, feature_columns, hidden_units, n_classes): DNNClassifier :param feature_columns: feature columns. :type feature_columns: list[tf.feature_column]. :param hidden_units: number of hidden units. :type hidden_units: list[int]. :param n_classes: List of hidden units per layer. :type n_classes: int. super(DNNClassifier, self).__init__() # combines all the data as a dense tensor self.feature_layer tf.keras.layers.DenseFeatures(feature_columns) self.hidden_layers [] for hidden_unit in hidden_units: self.hidden_layers.append(tf.keras.layers.Dense(hidden_unit)) self.prediction_layer tf.keras.layers.Dense(n_classes, activationsoftmax) def call(self, inputs): x self.feature_layer(inputs) for hidden_layer in self.hidden_layers: x hidden_layer(x) return self.prediction_layer(x) def default_optimizer(self): Default optimizer name. Used in model.compile. return adam def default_loss(self): Default loss function. Used in model.compile. return categorical_crossentropy def default_training_epochs(self): Default training epochs. Used in model.fit. return 5 def prepare_prediction_column(self, prediction): Return the class label of highest probability. return prediction.argmax(axis-1)除了__init__与call这两个 Keras 强制要求的方法外SQLFlow 约定模型类还可以可选地提供四个默认值方法用于在 SQL 未显式指定对应超参数时兜底default_optimizer()默认优化器示例返回adam用于model.compiledefault_loss()默认损失函数示例返回categorical_crossentropy用于model.compiledefault_training_epochs()默认训练轮数示例返回5用于model.fitprepare_prediction_column(prediction)将模型输出转换为可写入结果表的预测值示例对分类输出做argmax(axis-1)取概率最大的类别。仓库 python/runtime/models/example.py 中保存着与文档完全一致的DNNClassifier实现并展示了纯 Python 侧的调用方式训练时执行model.compile(optimizermodel.default_optimizer(), lossmodel.default_loss())与model.fit(..., epochsmodel.default_training_epochs())预测时执行model.prepare_prediction_column(prediction)可作为脱离 SQLFlow、独立验证模型逻辑的参考脚本。实战示例二Functional API 的完整写法对于偏好函数式风格的开发者SQLFlow 文档也给出了一个可直接使用的MyExampleModel工厂函数其关键点在于为每个特征字段显式创建tf.keras.Inputdef MyExampleModel(feature_columns, field_metas, learning_rate0.01): feature_layer_inputs dict() for fm in field_metas: feature_layer_inputs[fm.name] tf.keras.Input(shape(fm.shape), namefm.name, dtypefm.dtype) feature_layer tf.keras.layers.DenseFeatures(feature_columns) feature_layer_outputs feature_layer(feature_layer_inputs) x layers.Dense(128, activationrelu)(feature_layer_outputs) x layers.Dense(64, activationrelu)(x) pred layers.Dense(1, activationsigmoid)(x) return keras.Model(inputs[v for v in feature_layer_inputs.values()], outputspred) def loss(output, labels): labels tf.reshape(labels, [-1]) return tf.reduce_mean( input_tensortf.nn.sparse_softmax_cross_entropy_with_logits( logitsoutput, labelslabels ) ) def optimizer(lr0.1): return tf.optimizers.SGD(lr) def prepare_prediction_column(self, prediction): Return the class label of highest probability. return prediction.argmax(axis-1)这里field_metas参数携带每个字段的name、shape、dtype信息用于构造输入占位。这一点与运行时的实现严格对应在 train.py 中SQLFlow 会判断模型是否是一个函数isinstance(estimator, types.FunctionType)如果是则自动把 SQL 侧推导出的feature_metas注入到model_params[field_metas]从而满足函数式模型的构造签名要求predict.py 的预测路径也做了同样的处理。在 SQL 中调用自定义模型参数从 SQL 到 Python 的传递链路模型定义好之后即可在 SQL 中通过TO TRAIN 模型名直接引用。SQLFlow 文档配套示例见 docgen.go如下SELECT * FROM iris.train TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [10, 20], validation.select SELECT * FROM iris.test LABEL class INTO sqlflow_models.my_dnn_model;这条 SQL 的语义分解如下TO TRAIN DNNClassifier指定要训练的模型类。模型名既可以是 TensorFlow 预置的 Estimator也可以是sqlflow_models.DNNClassifier这类自定义包中的模型详见下文WITH model.n_classes 3, model.hidden_units [10, 20]model.前缀下的键值对会被收集为模型构造参数LABEL class指定标签列INTO sqlflow_models.my_dnn_model指定模型保存位置可理解为模型仓库中的命名空间.模型名。参数的分类与传递由 Go 侧的 codegen.go 完成CategorizeAttributescodegen.go按前缀把WITH子句属性拆分为三组model.*→ 模型参数modelParams、train.*→ 训练参数trainParams、validation.*→ 验证参数validateParamsInitializeAttributescodegen.go会调用attribute.ExtractSQLFlowModelsSymbolOnce()通过 Python 的symbol_extractor解析sqlflow_models包内各模型 docstring 中的参数说明实现见 attribute.go从而对自定义模型的model.*参数做类型检查与默认值补全如果模型不在sqlflow_models前缀下即完全未知的自定义模型则会放开为任意model.*参数见 codegen.go特殊地constructOptimizers与constructLossescodegen.go会把model.optimizer、model.loss及其loss.xxx参数拼装成合法的 Python 调用表达式如SGD(lr0.1)最终代码生成模板 template_train.go 会把model_params序列化进生成的 Python 脚本并对optimizer、dnn_optimizer、linear_optimizer、loss等字符串参数执行eval将其还原为真实的 TensorFlow 优化器/损失对象后再传给训练入口。生成的 Python 脚本会尝试import sqlflow_modelstemplate_train.go失败时打印告警但不中断——这保证了内置模型在未安装自定义包时依然可用。运行时如何识别、加载并编译自定义模型SQL 语句经代码生成后最终调用的是 runtime/tensorflow/train.py 中的train()入口。其加载与分发的关键步骤如下加载模型类import_model(estimator_string)实现见 import_model.py直接对模型名字符串执行eval取回类或函数对象若模型名形如my_pkg.MyModel两段式且包名不是xgboost、sqlflow_models还会先尝试__import__导入对应包import_model.py判别模型类型is_tf_estimator(estimator)判断是 Estimator 还是 Keras 模型从而分流到 train_estimator.py 或 train_keras.py 两条训练管线编译 Keras 模型keras_compile()train_keras.py负责组装compile参数若WITH子句未显式给出optimizer则优先调用模型模块中定义的optimizer()函数若模块中没有该函数则回退到tf.keras.optimizers.Adagrad(lr0.001)默认优化器若未给出loss优先取模块级变量loss否则使用默认值sparse_categorical_crossentropy指标metrics则通过eval_metrics_fn()或 SQL 的validation.metrics指定包装特征输入init_model_with_feature_column()见 keras_with_feature_column_input.py通过inspect.getargspec检查模型构造函数是否接受feature_columns参数如果不接受例如纯函数式模型就把它包装进WrappedKerasModel由包装类先经过tf.keras.layers.DenseFeatures层把 SQL 侧 COLUMN 子句生成的 feature column 组装成稠密张量再喂给用户子模型训练keras_train_compiled()train_keras.py执行classifier.fit(...)其中epochs优先取 SQL 的train.epoch未指定时调用模型的default_training_epochs()。保存与加载子类化模型的权重恢复机制子类化 Keras 模型只保存权重、不保存拓扑SQLFlow 的处理方式是用 SQL 中的信息重建拓扑再恢复权重保存训练结束后train_keras.py 调用classifier.save(save, save_formattf)保存模型TensorFlow SavedModel 格式。源码注释特别指出若模型定义了sqlflow_train_loop且不含 Keras 层save可能失败因此会先写model_meta.json元数据再尝试保存加载预测时predict.py 先用相同的模型类与model_params重新实例化模型执行一次predict_on_batch以初始化参数再调用load_keras_model_weights()load_model.py从保存目录的variables/variablesTensorFlow checkpoint 格式恢复权重。model.save与model.save_weights的产物在 checkpoint 层面是兼容的因此可以互相加载。这一机制意味着自定义模型的类定义必须始终可用例如通过 pip 安装的sqlflow_models包或随模型仓库镜像分发因为模型的结构只存在于 Python 代码中。预测时的输出处理SQLFlow 的keras_predict()predict.py负责把模型输出写回数据库结果表其处理逻辑与文档中prepare_prediction_column的语义一致对单输出回归len(result[0]) 1直接取标量对多分类输出各输出概率之和约等于 1.0通过np.isclose(sum, 1.0)判定后执行result[0].argmax(axis-1)取概率最大的类别索引对多输出回归则原样保留向量若 SQL 指定了predict.extra_outputs模型可返回元组前一个元素为主预测结果其余元素按顺序写入附加结果列predict.py。文档示例中的prepare_prediction_column正是这一取 argmax约定的模型侧显式版本二者在语义上互为印证。补充阅读与进一步探索文档末尾建议进一步阅读 Keras 的三个核心源码文件models.py、engine/network.py与engine/training.py以深入理解模型的构造、层连接与训练循环。本仓库中与自定义模型主题强相关的可继续探索路径doc/design/customized_model.md本文所依据的官方设计文档原文python/runtime/models/example.py与文档一致的DNNClassifier参考实现及独立运行脚本python/runtime/tensorflow/train_keras.pyKeras 模型编译、训练、保存的完整运行时实现python/runtime/tensorflow/keras_with_feature_column_input.pyWrappedKerasModel特征包装机制go/codegen/tensorflow/codegen.go 与 go/codegen/tensorflow/template_train.goSQL 到 Python 训练脚本的代码生成链路python/runtime/tensorflow/keras_example.py 与 python/runtime/tensorflow/keras_example_reg.py分别演示自定义分类/回归 Keras 模型在训练-预测全流程中的真实调用参数。此外SQLFlow 的模型参数文档可通过go/cmd/docgen命令生成 Markdown 表格见 docgen.go 中的DocGenInMarkdown其中TO TRAIN DNNClassifier WITH model.n_classes3, ...的写法是各类模型参数在 SQL 中的统一表达范式可作为编写自定义模型文档时的参考模板。赞分享人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载相关推荐TDgpt 自定义机器学习模型接入指南将 Keras/Torch 模型注册为 SQL 可调用的时间序列分析算法TDgpt 自定义机器学习模型接入指南将 Keras/Torch 模型注册为 SQL 可调用的时间序列分析算法 TDgpt 是 TDengine 内置的时间序数据库时序数据库物联网大数据实时分析云原生5步构建专业级金融数据系统Python量化分析实战指南5步构建专业级金融数据系统Python量化分析实战指南 在金融科技快速发展的今天高效处理通达信数据已成为量化交易和数据分析师的核心需求。mootdx作为一款金融科技数据分析终极Flash游戏收藏方案Flash Collector完整实战指南终极Flash游戏收藏方案Flash Collector完整实战指南 Flash Collector是一款专为保存和运行经典Flash小游戏设计的开源工具能桌面应用网页爬虫上一篇如何快速为Honey Select 2安装完整汉化去码补丁新手友好终极指南下一篇FPM 打包 CPAN Perl 模块实战指南cpan 输入类型与命令行参数全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考