ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TensorFlow.js Converter 支持的 TensorFlow 算子清单(Supported Ops)全面解析

TensorFlow.js Converter 支持的 TensorFlow 算子清单(Supported Ops)全面解析 人工智能机器学习深度学习前端后端【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址https://gitcode.com/gh_mirrors/tf/tfjs点击查看免费下载本文以 tfjs-converter 官方文档 supported_ops.md 为主体系统梳理 TensorFlow 算子到 TensorFlow.js 算子的映射关系并结合 operation_mapper.ts、operation_executor.ts 等源码剖析其背后的映射与执行机制帮助读者在将 TF 模型转换为 TF.js 模型时快速判断算子可用性与用法。一、本文档的定位与阅读方式supported_ops.md是 tfjs-converter 中关于TensorFlow 算子 → TensorFlow.js 算子映射关系的官方索引文档。它回答了一个核心问题我训练好的 TensorFlow / Keras 模型里用到的算子能否被 TensorFlow.js 直接运行左列Tensorflow Op Name模型导出的 GraphDef / SavedModel 中真实存在的算子名如Conv2D、FusedBatchNormV3。右列Tensorflow.js Op Nametfjs-converter 转换后实际调用的 TF.js API 名如conv2d、batchNorm。部分行标注Not mapped这些是 TF.js 侧提供的算子但 TensorFlow 中没有可直接对应的算子或仅存在于旧版/特定版本中。它们通常由 TF.js 自定义算子或在转换后的图中以其他方式实现因此出现在右列。从源码结构看这份清单并非手工硬编码而是与src/operations/目录下的映射表一一对应。operation_mapper.ts在构造函数中加载了arithmetic, basicMath, control, convolution, creation, dynamic, evaluation, graph, hashTable, image, logical, matrices, normalization, reduction, sliceJoin, sparse, spectral, string, transformation这 19 个分类的 op 映射 JSONoperation_mapper.ts#L56-L70并以tfOpName为键建立查找表。也就是说文档中的每一行都对应源码中一条真实的映射记录。1.1 映射Mapper与执行Executor的两级架构要读懂这份清单需要先理解 tfjs-converter 的两级处理流水线映射阶段OperationMapper把 TensorFlow GraphDef 中的NodeDef转换成 TF.js 内部的Node结构。核心逻辑在OperationMapper.mapNode()先按tfOpName查表找不到时回退到getRegisteredOp()注册的自定义算子仍找不到则该节点映射为{}空 Mapper错误延迟到运行期源码注释明确指出 Unsupported ops will cause an error at run-time (not parse time)见 operation_mapper.ts#L179-L183。随后对每个节点的inputs输入张量与attrs属性逐一解析输入通过mapper.inputs中定义的start/end索引定位属性则依据string / number / bool / shape / dtype / func / tensor等类型分派到getStringParam、getNumberParam、getDtypeParam等解析函数operation_mapper.ts#L216-L334。执行阶段OperationExecutorexecuteOp()依据节点的category分发到对应的 executorarithmetic、basic_math、control、convolution、creation、dynamic、evaluation、graph、logical、matrices、normalization、reduction、slice_join、sparse、spectral、string、transformation、hash_table、custom最终调用tensorflow/tfjs-core的算子函数operation_executor.ts#L55-L124。因此supported_ops.md中的分类标题如 Operations - Arithmetic对应的是operation_executor.ts中的category分支而TF.js Op Name对应各 executor 内部switch (node.op)后调用的具体 tfjs-core 函数。例如 Arithmetic 分类中的Add/AddV2/BiasAdd三个 TF 算子统一映射到ops.addFloorMod/Mod映射到ops.modRealDiv/Div映射到ops.div见 arithmetic_executor.ts#L31-L96。1.2 为什么文档值得逐表对照在模型转换前逐表对照的意义在于预判失败点如果模型包含清单之外的算子转换本身convert_graph_def可能成功但执行到该节点时才抛错。因为mapNode对未知算子不报错错误发生在executeOp的default分支抛出Unknown op xxx并建议使用tf.registerOp()注册自定义执行operation_executor.ts#L113-L117。选择等价替代对Not mapped的算子通常可以寻找 TF.js 侧的替代实现如用conv2dTranspose替代反卷积、用topk替代TopKV2的部分场景。理解命名差异TF 算子名与 TF.js API 名并不总是相同如DepthwiseConv2dNativevsdepthwiseConv2d清单能避免按名索骥的困惑。二、算术Arithmetic与基础数学Basic math2.1 算术算子TensorFlow Op NameTensorFlow.js Op NameAdd / AddN / AddV2 / BiasAddadd / addN / addBiasAdd在 executor 中按add执行Div / DivNoNan / FloorDivdiv / divNoNan / floorDivFloorMod / ModmodMaximum / Minimummaximum / minimumMul / Pow / RealDivmul / pow / divSquaredDifference / SubsquaredDifference / sub从 arithmetic_executor.ts 可以确认Add、AddV2、BiasAdd三个 case 均调用ops.add(a, b)RealDiv与Div都调用ops.divFloorMod与Mod都调用ops.mod。这意味着模型中的BiasAdd在浏览器端会被当作普通加法执行——这解释了为何 TF.js 不需要单独实现BiasAdd内核。使用建议转换前若模型以AddV2TF2.x 默认或BiasAdd形式表达加法TF.js 均可直接执行无需修改图。2.2 基础数学算子TensorFlow Op NameTensorFlow.js Op NameAbs / Acos / Acosh / Asin / Asinh / Atan / Atan2 / Atanhabs / acos / acosh / asin / asinh / atan / atan2 / atanhCeil / Cos / Cosh / Elu / Erf / Exp / Expm1 / Floorceil / cos / cosh / elu / erf / exp / expm1 / floorImag / LeakyRelu / Log / Log1p / Neg / Prelu / Prodimag / leakyRelu / log / log1p / neg / prelu / prodReal / Reciprocal / Relu / Relu6 / Round / Rsqrtreal / reciprocal / relu / relu6 / round / rsqrtSelu / Sigmoid / Sign / Sin / Sinh / Softplusselu / sigmoid / sign / sin / sinh / softplusSqrt / Square / Tan / Tanhsqrt / square / tan / tanhIsFinite / IsInf / IsNanisFinite / isInf / isNaNComplex / ComplexAbscomplex / complexAbsClipByValueclipByValueNot mappedlogSigmoid、step这一分类覆盖了几乎全部常用的激活函数与基础数学函数。特别值得注意复数支持Complex、ComplexAbs、Imag、Real表明 tfjs-converter 支持包含复数运算的模型底层依赖 tfjs-core 的complex64数据类型见parseDtypeParam中DT_COMPLEX64/DT_COMPLEX128 → complex64的映射operation_mapper.ts#L502-L504。激活函数家族Relu、Relu6、LeakyRelu、Prelu、Elu、Selu、Softplus、Sigmoid、Tanh一应俱全绝大多数 CNN/RNN 模型都不会在此分类遇阻。Not mapped的logSigmoid、step属于 TF.js 额外提供的 APITensorFlow 中没有同名算子。三、控制流Control Flow与图算子Graph3.1 控制流条件与循环TensorFlow Op NameTensorFlow.js Op NameIf / StatelessIf / While / StatelessWhileIf / StatelessIf / While / StatelessWhileEnter / Exit / LoopCond / Merge / NextIteration / Switch同名保留EmptyTensorList / TensorArrayV3 系列Close/Concat/Gather/Read/Scatter/Size/Split/Write同名保留TensorList 系列Concat/ConcatV2/FromTensor/Gather/GetItem/Length/PopBack/PushBack/Reserve/Resize/Scatter/ScatterV2/SetItem/Split/Stack同名保留这是清单中最庞大的一类支撑着tf.while_loop、tf.cond、TensorArray与TensorList结构。从 control_executor.ts 的实现看While、If等算子会递归执行graph.library.function中定义的子图mapFunction会把FunctionDef映射为独立的子Graph见 operation_mapper.ts#L339-L405。实践提示控制流算子在 TF 2.x 的 SavedModel 导出中非常常见如动态 RNN、tf.map_fn、循环解码器。如果模型转换后报Unknown op且算子名属于 TensorList/TensorArray 系列请先确认所使用的 tfjs-converter 版本与本文档一致因为该清单随版本持续扩充。3.2 图算子GraphTensorFlow Op NameTensorFlow.js Op NameConst / Identity / IdentityN / NoOp / Snapshot / StopGradient同名Placeholder / PlaceholderWithDefault同名FakeQuantWithMinMaxVarsFakeQuantWithMinMaxVarsPrint / Rank / Shape / ShapeN / Size同名Placeholder与Const在图映射中承担特殊角色transformGraph会单独收集placeholders模型输入与weights常量权重列表operation_mapper.ts#L81-L91。FakeQuantWithMinMaxVars的存在意味着量化感知训练QAT导出的图可以在 TF.js 中运行执行时按伪量化语义处理。四、卷积Convolution、图像Images与池化4.1 卷积算子TensorFlow Op NameTensorFlow.js Op NameConv1D / Conv2D / Conv3Dconv1d / conv2d / conv3dConv2DBackpropInputconv2dTranspose反卷积DepthwiseConv2d / DepthwiseConv2dNativedepthwiseConv2d_FusedConv2D / FusedDepthwiseConv2dNative同名 fused 变体AvgPool / AvgPool3D / MaxPool / MaxPool3DavgPool / avgPool3d / maxPool / maxPool3dMaxPoolWithArgmax / Dilation2D同名Not mappedconv2dTranspose、conv3dTranspose、pool、separableConv2d以Conv2D为例执行器会从节点属性中取出strides、pad、dataFormat转为大写NHWC/NCHW、dilations然后调用ops.conv2d(x, filter, [stride[1], stride[2]], pad, dataFormat, [dilations[1], dilations[2]])convolution_executor.ts#L103-L117。_FusedConv2D则是 TF 图优化器融合了 bias 与激活如Relu后的算子TF.js 通过ops.fused.conv2d一次性完成卷积偏置激活显著减少内存往返convolution_executor.ts#L119-L139。注意事项若希望模型走融合路径需要在 TensorFlow 侧导出时启用图优化Grappler 的_FusedConv2D融合否则以标准Conv2D执行同样正确。Not mapped的pool通用池化封装与separableConv2D是 TF.js 侧提供的便捷 API不是 TF 算子名。4.2 图像算子TensorFlow Op NameTensorFlow.js Op NameResizeBilinear / ResizeNearestNeighborresizeBilinear / resizeNearestNeighborCropAndResizecropAndResizeImageProjectiveTransformV3transformNot mappedflipLeftRight、rotateWithOffset对象检测与图像预处理类模型如 SSD、Faster R-CNN 的CropAndResize阶段常用到本分类。ImageProjectiveTransformV3对应 TF.js 的transform投影变换用于仿射/透视变换类数据增强。五、张量操作创建、切片连接、变换与矩阵5.1 张量创建CreationTensorFlow Op NameTensorFlow.js Op NameFill / Range / LinSpacefill / range / linspaceOnes / Zeros / OnesLike / ZerosLikeones / zeros / onesLike / zerosLikeOneHot / MultinomialoneHot / multinomialRandomStandardNormal / RandomUniform / TruncatedNormal同名Not mappedeye注意 TF.js 的随机数算子名与 TF 一致但随机种子行为由 TF.js 环境标志控制转换后结果不一定与 Python 端逐位一致属正常现象。5.2 切片与连接Slicing and JoiningTensorFlow Op NameTensorFlow.js Op NameConcat / ConcatV2concatGather / GatherV2 / GatherNdgather / gatherNdPack / Unpack / Split / SplitV / Stackpack / unpack / split / stackSlice / StridedSlice / Reverse / ReverseV2slice / stridedSlice / reverseTile / ScatterNd / SparseToDensetile / scatterNd / sparseToDenseNot mappedbooleanMaskAsync、unstackStridedSlice是tf.strided_slice的核心支撑也是许多 TF 高层 API如x[..., 1:]编译后的底层算子几乎每个实用模型都会用到。5.3 变换TransformationsTensorFlow Op NameTensorFlow.js Op NameBatchToSpaceND / SpaceToBatchNDbatchToSpaceND / spaceToBatchNDDepthToSpace / MirrorPad / Pad / PadV2depthToSpace / mirrorPad / pad / padV2Reshape / Squeeze / ExpandDims / Cast / Transposereshape / squeeze / expandDims / cast / transposeBroadcastArgs / BroadcastTobroadcastArgs / broadcastToEnsureShapeensureShapeNot mappedsetdiff1dAsyncCast依赖parseDtypeParam的数据类型映射表DT_FLOAT/DT_HALF/DT_DOUBLE → float32、DT_INT32/DT_INT64/DT_INT8/DT_UINT8 → int32、DT_BOOL → bool、DT_STRING → string、DT_COMPLEX64/128 → complex64operation_mapper.ts#L482-L510。对未知 dtype映射返回null且错误同样延迟到运行期。5.4 矩阵运算Matrices与线性代数TensorFlow Op NameTensorFlow.js Op NameMatMul / BatchMatMul / BatchMatMulV2 / _FusedMatMulmatMul / batchMatMul / 同名Transpose / Einsum / MatrixBandParttranspose / einsum / bandPartNot mappeddot、norm、outerProduct、qr、gramSchmidt_FusedMatMul与_FusedConv2D类似是 Grappler 融合偏置/激活后的稠密层形态Einsum让 Transformer 等模型的 attention 计算可以直接转换。六、归约、归一化、逻辑、评估与哈希表6.1 归约ReductionTensorFlow Op NameTensorFlow.js Op NameAll / Any / Max / Min / Mean / Sum / Prodall / any / max / min / mean / sum / prodArgMax / ArgMinargMax / argMinBincount / DenseBincountbincount / denseBincountNot mappedlogSumExp6.2 归一化NormalizationTensorFlow Op NameTensorFlow.js Op NameSoftmax / LogSoftmax / LRNsoftmax / logSoftmax / lrnFusedBatchNorm / V2 / V3同名EuclideanNorm / SparseToDense同名Not mappedbatchNorm、momentsFusedBatchNormV3在 TF 2.x 的tf.keras.layers.BatchNormalization导出图中十分常见。batchNorm、moments是 TF.js 侧的便捷 APIbatchNorm对应tf.batchNorm用于推理阶段的 BN 参数合并或自定义归一化。6.3 逻辑Logical与评估Evaluation逻辑类Equal、Greater、GreaterEqual、Less、LessEqual、NotEqual、LogicalAnd、LogicalOr、LogicalNot、Select、SelectV2、BitwiseAnd全部同名映射另有 TF.js 侧补充的logicalXor。评估类TopKV2、Unique、UniqueV2、LowerBound、UpperBound同名映射TF.js 侧提供topk、confusionMatrix、inTopKAsync。分类任务常用Softmax topk组合TopKV2直接可用topk则用于 TF.js 原生代码中。6.4 哈希表HashtableHashTable/HashTableV2、LookupTableFind/Import/Size含 V2 变体全部同名映射。哈希表算子依赖ResourceManager管理全局资源——这也是executeOp中唯一需要传入resourceManager参数的分支operation_executor.ts#L102-L104。此类算子多见于特征工程类模型如 Wide Deep 的 embedding lookup。七、RNN、Scan、Segment、Spectral、Signal 与动态算子7.1 RNN 与 Scan文档中Tensors - RNN 分类目前为空即没有列出的 TF 算子但 RNN 模型并非不可转换——其展开后的 LSTM/GRU 单元算子MatMul、Sigmoid、Tanh、Add、Mul 等分别落在前文各分类中动态长度展开则依赖控制流分类的While/TensorArray。Scan 分类Cumprod → cumprod、Cumsum → cumsum支持前缀扫描类算法。7.2 Segment 与动态DynamicSegmentNot mapped → unsortedSegmentSumTF.js 侧 API对应 TF 的UnsortedSegmentSum从源码分类看稀疏/不规则张量能力由sparse_executor与ragged_executor支撑。DynamicListDiff、NonMaxSuppressionV2/V3/V4/V5、Where全部同名映射。NMS 系列是目标检测后处理的标配V2~V5 的完整支持意味着检测模型通常可以端到端转换。7.3 谱Spectral与信号SignalSpectralFFT/IFFT/RFFT/IRFFT → fft/ifft/rfft/irfft支持音频/信号处理类模型的频谱变换。Signalframe、hammingWindow、hannWindow、stft均为Not mappedTF.js 侧补充的音频窗口/短时傅里叶工具TF 中对应算子请使用tf.signal.frame、tf.signal.stft导出前的预处理替代。八、移动平均Moving AverageNot mapped → movingAverage该分类服务于指数滑动平均EMA场景。虽然 TF 侧未列出同名算子但 TF.js 提供movingAverage便于在浏览器中实现参数滑动平均更新如在线学习或模型微调。九、如何确认你的模型算子是否支持由于文档随 tfjs-converter 版本演进最可靠的做法是结合源码三层确认对照清单快速浏览本文档对应分类。查映射表源码OperationMapper构造函数加载的 19 个分类映射operation_mapper.ts#L56-L70与本文档同源也可直接查看 op_mapper_schema.ts 中OpMapper的 JSON Schemacategory/inputs/attrs字段定义理解一条映射记录由哪些字段构成。查执行器源码在 executors 目录 中找到对应分类的 executor看switch (node.op)是否包含你的算子。若包含则可确认该算子在该版本中可执行若不包含但映射表存在说明属于已映射但待执行实现的边缘情况。兜底方案对清单外的算子使用tf.registerOp()导出自 tfjs-converter/src/index.ts注册自定义 OpExecutor——executeOp的custom分支会优先调用注册的执行器operation_executor.ts#L105-L112并在NodeValueImpl的封装下访问节点输入与属性custom_op/node_value_impl.ts。十、总结分类覆盖要点算术/基础数学加减乘除、激活函数全家族、复数、clip控制流/图If/While、TensorArray/TensorList、Placeholder/Const卷积/图像Conv1D~3D、反卷积、池化、fused 融合、resize/crop张量操作创建、切片连接、变换、矩阵、einsum归约/归一化统计归约、BN/Softmax 系列逻辑/评估/哈希表比较、NMS、topk、lookup谱/信号/动态FFT 族、stft、NMS、Wheresupported_ops.md是一份随版本持续生长的清单文档中每一行都与 operation_mapper.ts 加载的映射表、operation_executor.ts 的分发逻辑一一对应。对于清单内算子转换即可用对于清单外算子错误会延迟到运行期抛出。建议在转换前导出模型算子清单与本文档逐项核对必要时结合tf.registerOp()补齐自定义算子从而保证模型在浏览器与 Node.js 端的完整可运行性。赞分享人工智能机器学习深度学习前端后端【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址https://gitcode.com/gh_mirrors/tf/tfjs点击查看免费下载相关推荐CANN ops-nn 中 MatmulFp32 算子 aclnn 单算子调用样例全解析CANN ops nn 中 MatmulFp32 算子 aclnn 单算子调用样例全解析 导读 本文基于 CANN ops nn 开源仓库中 experimen人工智能算子库深度学习CANNAscendTensorFlow Lite 如何用 Select TF ops 转换含不受支持算子的模型并运行推理TensorFlow Lite 如何用 Select TF ops 转换含不受支持算子的模型并运行推理 TensorFlow Lite 的 built in人工智能机器学习深度学习分布式训练预训练TensorFlow到ONNX转换支持状态全面解析TensorFlow到ONNX转换支持状态全面解析 前言 在深度学习模型部署过程中模型格式转换是一个关键环节。TensorFlow到ONNX的转换工具tf2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表