数据可视化深度学习3D渲染AI 可解释性【免费下载链接】tensorspaceNeural network 3D visualization framework, build interactive and intuitive model in browsers, support pre-trained deep learning models from TensorFlow, Keras, TensorFlow.js项目地址https://gitcode.com/gh_mirrors/te/tensorspace点击查看免费下载本文是 TensorSpace 官方《模型预处理简介》docs/README_zh.md的深度展开。TensorSpace 是一个用于在浏览器中构建神经网络 3D 可视化交互应用的框架但要让一个现成的 TensorFlow、Keras 或 TensorFlow.js 预训练模型在 TensorSpace 中活起来必须先完成模型预处理Model Preprocessing——把只输出最终结果的传统模型改造成同时输出中间层结果的 TensorSpace 适配模型。读完本文你将掌握预处理的完整概念、核心参数含义以及针对 TensorFlow4 种格式、Keras2 种格式、TensorFlow.js 的完整可执行转换命令与可视化接入代码。图 1传统预训练模型只有单一最终输出如 MNIST 的 softmax 结果什么是模型预处理模型预处理或模型预处理过程是 TensorSpace 使用流程中位于模型训练/下载与3D 可视化之间的一步关键工序。按照官方文档它一般包含三个步骤选择你需要提取层间数据的中间层从网络结构里挑出那些你希望在 3D 场景中呈现的层例如卷积层、池化层、全连接层。从中间层提取所需要的数据让模型在推断时不仅返回最终结果还把中间层的 tensor 一并返回。将原有模型转换为 TensorSpace 所支持的模型格式TensorSpace 的 Loader 是基于 TensorFlow.js 的tf.loadLayersModel/tf.loadGraphModel加载模型的因此预处理产物必须是 TensorSpace 兼容的 tfjs 模型格式一份model.json结构文件 若干权重分片文件。为什么需要模型预处理TensorSpace 提供了非常灵活的框架开发者可以用类似搭积木的方式设计模型结构——即使没有真实的网络与权重也能先用TSP.layers.*堆叠出一个展示用模型见 examples/helloworld/helloworld-empty.html它不加载任何权重仅通过model.add()构建 LeNet 结构。但 TensorSpace 更大的价值在于它提供了一个 3D 可视化交互空间让模型中层与层之间的链接、最终输出的形状都变得直观可以同时观察到模型结构和层间输出。问题在于大多数已经训练好的模型多用于推断只提供一个最终输出。例如一个 MNIST 手写字符模型常见的 TensorFlow 或 Keras 预训练模型只有一个最终输出——经过最后 softmax 层得到的 10 个 0~1 之间的数值表示输入数字属于0-9的概率见图 1。这样单一的输出无法回答模型是怎么一步步得出这个结论的。TensorSpace 十分吸引人的一点在于通过获取层间输出并渲染到 3D 实体上使用者可以同时观察模型结构和层间输出信息密度更高、更直观而且能呈现每一层对输入数据的直接处理结果完整了解最终预测结果是怎样一步步产生的见图 2。图 2经过预处理后模型除最终结果外还输出 padding、conv、maxpool、dense 等中间层结果要达到这种效果就需要对模型做预处理让从网上下载的预训练模型不仅仅输出最终结果还输出中间层的层间结果——这也是本教程要解决的两个核心问题如何定位中间层节点的位置、如何生成多输出层间输出的预训练模型。如何预处理TensorSpace-Converter 总览通过预处理我们把传统单一输出的神经网络模型转换为拥有中间层输出的 TensorSpace 适配模型。这个工作由官方配套工具TensorSpace-Converter命令行程序tensorspacejs_converter完成。tensorspacejs_converter的通用调用形式为$ tensorspacejs_converter \ --input_model_from框架类型 \ --input_model_format模型格式 \ --output_layer_names中间层名称,逗号分隔 \ input_path \ output_path核心参数一览参数含义本仓库教程中的取值--input_model_from原始模型的构建框架tensorflow、keras、tfjs--input_model_format原始模型的文件组织格式tf_keras、tf_keras_separated、tf_frozen、tf_saved、topology_weights_combined、topology_weights_separatedtfjs模型无需此参数--output_layer_names部分场景写作--output_node_names需要导出中间结果的层/节点名逗号分隔如conv_1,maxpool_1,...,softmaxinput_path位置参数原始模型路径多文件格式用英文半角逗号,合并结构文件在前、权重文件在后./rawModel/keras/tf_keras_model.h5等output_path位置参数预处理结果输出目录./convertedModel等不同框架、不同格式的具体命令下面分三节逐一给出这些命令都完整保存在仓库的 docs 文档体系中可直接对照执行。场景一TensorFlow 模型预处理4 种格式TensorFlow 教程docs/tensorflow/README_zh.md以 MNIST 数据集 LeNet 结构为例覆盖了 4 种常见的模型存储格式tf.keras合并模型、tf.keras结构与权重分离模型、frozen 模型、saved 模型。对应的原始模型、转换脚本与可视化代码分别位于 docs/tensorflow/rawModel、docs/tensorflow/script 与 docs/tensorflow/index.html。1. tf.keras 模型结构 权重合并为单个 .h5对于模型结构和权重合并保存的tf.keras模型只有一个xxx.h5文件用以下命令转换脚本见 convertKeras.sh$ tensorspacejs_converter \ --input_model_fromtensorflow \ --input_model_formattf_keras \ --output_layer_namesconv_1,maxpool_1,conv_2,maxpool_2,dense_1,dense_2,softmax \ ./rawModel/keras/tf_keras_model.h5 \ ./convertedModel/layerModel注意事项将input_model_from设置成tensorflow。将input_model_format设置成tf_keras。将.h5文件的路径设置到input_path中。取出tf.keras模型的Layer名称设置到output_layer_names中如图 3 所示的操作方式。预处理脚本会在convertedModel/layerModel文件夹中生成经过预处理的模型本仓库已提供生成好的模型位于 docs/tensorflow/convertedModel/layerModel。2. tf.keras 模型结构与权重分开保存如果模型结构与权重分开保存会有一个模型结构文件xxx.json和一个权重文件eee.h5见 docs/tensorflow/rawModel/keras_separated用以下命令转换脚本见 convertKerasSeperated.sh$ tensorspacejs_converter \ --input_model_fromtensorflow \ --input_model_formattf_keras_separated \ --output_layer_namesConv2D_1,MaxPooling2D_1,Conv2D_2,MaxPooling2D_2,Dense_1,Dense_2,Softmax \ ./rawModel/keras_separated/topology.json,./rawModel/keras_separated/weights.h5 \ ./convertedModel/layerModel注意事项将input_model_from设置成tensorflow。将input_model_format设置成tf_keras_separated。因为有两个模型文件设置input_path时需合并两个文件的路径用英文半角逗号,分开且.json结构文件路径在前、.h5权重文件路径在后。3. frozen 模型.pb 图模型对于 TensorFlow frozen 模型见 docs/tensorflow/rawModel/frozen用以下命令转换脚本见 convertFrozen.sh$ tensorspacejs_converter \ --input_model_fromtensorflow \ --input_model_formattf_frozen \ --output_layer_namesMyConv2D_1,MyMaxPooling2D_1,MyConv2D_2,MyMaxPooling2D_2,MyDense_1,MyDense_2,MySoftMax \ ./rawModel/frozen/frozen_model.pb \ ./convertedModel/graphModel注意事项将input_model_from设置成tensorflow。将input_model_format设置成tf_frozen。将.pb文件的路径设置到input_path中。此时取出的是 frozen 模型的node名称设置到output_layer_names中frozen/saved 这类图模型没有 Layer 概念要按计算图中的节点名来指定输出参见图 3 下方的节点名取法。4. saved 模型目录格式对于 TensorFlow saved 模型见 docs/tensorflow/rawModel/saved用以下命令转换脚本见 convertSaved.sh$ tensorspacejs_converter \ --input_model_fromtensorflow \ --input_model_formattf_saved \ --output_layer_namesMyConv2D_1,MyMaxPooling2D_1,MyConv2D_2,MyMaxPooling2D_2,MyDense_1,MyDense_2,MySoftMax \ ./rawModel/saved \ ./convertedModel/graphModel注意事项将input_model_from设置成tensorflow。将input_model_format设置成tf_saved。将 saved 模型文件夹路径设置到input_path注意不是单个文件。同样取出模型的node名称设置到output_layer_names。以上两条命令都会在convertedModel/graphModel文件夹中生成预处理模型本仓库已提供见 docs/tensorflow/convertedModel/graphModel。图 3从模型结构/计算图中取出层名或节点名填入output_layer_names参数对应教程图 1/图 2 的操作方法场景二Keras 模型预处理2 种格式Keras 教程docs/keras/README_zh.md同样使用 MNIST LeNet。如果你手上没有现成的 Keras 模型可以用仓库提供的训练脚本 docs/keras/train/mnist.py 现场训练一个——该脚本用 Keras 定义了一个带Conv2D_1 / MaxPooling2D_1 / Conv2D_2 / MaxPooling2D_2 / Dense_1 / Dense_2 / Softmax命名的 LeNet 序列模型训练 5 个 epoch 后保存为keras_model.h5。1. 模型结构与权重保存在同一个 HDF5 文件对于模型结构和权重保存在同一 HDF5 文件中的 Keras 模型即xxx.h5见 docs/keras/rawModel/combined用以下命令转换脚本见 convertCombined.sh$ tensorspacejs_converter \ --input_model_fromkeras \ --input_model_formattopology_weights_combined \ --output_node_namesConv2D_1,MaxPooling2D_1,Conv2D_2,MaxPooling2D_2,Dense_1,Dense_2,Softmax \ ./rawModel/combined/mnist.h5 \ ./convertedModel/注意事项将input_model_from设置成keras。将input_model_format设置成topology_weights_combined。将.h5文件的路径设置到input_path中。取出 Keras 模型的Layer名称设置到output_layer_names对应脚本中实际写作--output_node_names语义同为指定需要导出的层/节点。2. 模型结构与权重保存在不同的文件对于结构与权重分开保存的 Keras 模型见 docs/keras/rawModel/separated用以下命令转换脚本见 convertSeparated.sh$ tensorspacejs_converter \ --input_model_fromkeras \ --input_model_formattopology_weights_separated \ --output_node_namesConv2D_1,MaxPooling2D_1,Conv2D_2,MaxPooling2D_2,Dense_1,Dense_2,Softmax \ ./rawModel/separated/topology.json,./rawModel/separated/weight.h5 \ ./convertedModel/注意事项将input_model_from设置成keras。将input_model_format设置成topology_weights_separated。同样地input_path需合并两个文件路径并用英文半角逗号,分开.json结构文件在前、.h5权重文件在后。场景三TensorFlow.js 模型预处理TensorFlow.js 教程docs/tfjs/README_zh.md同样以 MNIST LeNet 为例。如果你没有现成的 tfjs 模型仓库提供了训练用的 docs/tfjs/train/createModel.html 页面脚本。tfjs 模型的标准产物是一份结构文件xxx.json与权重文件xxx.weight.bin示例见 docs/tfjs/rawModel用以下命令转换脚本见 converter.sh$ tensorspacejs_converter \ --input_model_fromtfjs \ --output_layer_namesmyPadding,myConv1,myMaxPooling1,myConv2,myMaxPooling2,myDense1,myDense2,myDense3 \ ./rawModel/mnist.json \ ./convertedModel/注意事项将input_model_from设置成tfjstfjs 模型无需指定input_model_format。使用 TensorFlow.js 训练并保存模型后会得到结构文件xxx.json和权重文件xxx.weight.bin把两个文件放在同一个目录下然后将结构文件xxx.json的路径设置为input_path。取出 TensorFlow.js 模型的Layer名称设置到output_layer_names。预处理产物与载入可视化预处理产物model.json 权重分片无论哪种框架经过tensorspacejs_converter转换后都会得到两类文件一份model.json文件包含模型的结构信息包括中间层输出。若干权重文件包含模型训练得到的权重信息权重文件的数量取决于模型的结构层数、参数量越大分片越多。这一点可以直接在本仓库的 examples/helloworld/convertedModel/model.json 中得到印证这份预处理后的模型结构中output_layers一栏明确列出了padding_1、conv_1、maxpool_1、conv_2、maxpool_2、dense_1、dense_2、softmax共 8 个输出节点正是预处理阶段通过output_layer_names指定的那些中间层——这就是多输出模型在文件层面的直接证据。在 TensorSpace 中构建可视化模型以 TensorFlow 教程为例预处理完成后用 TensorSpace API 构建可视化模型完整代码见 docs/tensorflow/index.html 与 examples/helloworld/helloworld.htmllet model new TSP.models.Sequential( modelContainer ); model.add( new TSP.layers.GreyscaleInput() ); model.add( new TSP.layers.Conv2d() ); model.add( new TSP.layers.Pooling2d() ); model.add( new TSP.layers.Conv2d() ); model.add( new TSP.layers.Pooling2d() ); model.add( new TSP.layers.Dense() ); model.add( new TSP.layers.Dense() ); model.add( new TSP.layers.Output1d( { outputs: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] } ) );注TensorSpace 的Sequential模型使用add()逐层堆叠结构实现在 src/tsp-model/Sequential.js。TensorFlow 教程中的 LeNet 不含 padding 层而 HelloWorld 与 tfjs 教程的 LeNet 结构包含Padding2d层对应使用new TSP.layers.Padding2d()。载入与初始化type 与 outputsName 是关键TensorSpace 在载入模型时对于不同种类的模型需要进行不同的配置对于 TensorSpace-Converter 生成的layer 模型来自tf_keras/tf_keras_separated格式只需指定type与urlmodel.load( { type: tensorflow, url: ./convertedModel/layerModel/model.json } );对于 TensorSpace-Converter 生成的graph 模型来自tf_frozen或tf_saved格式必须额外配置outputsName属性其中的name与转换时输入的output_layer_names完全一致model.load( { type: tensorflow, url: ./convertedModel/graphModel/model.json, outputsName: [MyConv2D_1, MyMaxPooling2D_1, MyConv2D_2, MyMaxPooling2D_2, MyDense_1, MyDense_2, MySoftMax] } );Keras 与 TensorFlow.js 模型的载入方式同理区别仅在type字段// Keras 模型 model.load( { type: keras, url: ./convertedModel/model.json } ); // TensorFlow.js 模型 model.load( { type: tfjs, url: ./convertedModel/model.json } );最后将 TensorSpace 模型初始化可以把预测放进init()回调中确保初始化完成后再执行model.init( function() { model.predict( image_5 ); // 传入手写 5 的像素数据 } );一切顺利的话在浏览器中打开对应的index.html即可看到 TensorSpace 渲染出的 LeNet 3D 模型对输入 5 的逐层预测过程。底层原理Loader 与 Predictor 如何消费多输出模型预处理产物的多输出特性最终由 TensorSpace 的加载器Loader与预测器Predictor消化。从源码看其分工如下Loader 负责加载模型资源。三种 Loader 均继承自抽象基类 LoaderKerasLoader 与 TfjsLoader 调用tf.loadLayersModel(url)加载 layer 类模型TfLoader 则根据是否配置了outputsName做出选择——配置了就走tf.loadGraphModel(url)graph 模型未配置则走tf.loadLayersModel(url)layer 模型。这与上文graph 模型必须配置outputsName的要求一一对应。Predictor 负责把输入数据喂给模型并取出各层输出。TfPredictor 的predict()中当outputsName存在时使用model.resource.execute(inputTensor, this.outputsName)按节点名列表一次性取出所有指定中间层的张量未配置时退化为model.resource.predict(inputTensor)。Keras 与 tfjs 的 PredictorKerasPredictor、TfjsPredictor则直接调用resource.predict(inputTensor)因为预处理后的model.json本身已经把中间层声明为输出节点一次predict即可返回全部层间结果。Predictor 基类负责输入张量的规范化。Predictor 在loadPredictorConfig中从已加载模型的inputs推断输入形状并把 batch 维度固定为1createInputTensor再把原始数据数组转为tf.Tensor列表供上层调用。Sequential 模型负责把预测结果分发到各可视化层。Sequential.predict 调用predictor.predict(input)得到预测结果数组再由updateLayerPredictVis()Sequential.js把第i个输出张量依次传递给第i1个可视化层——这正是层间输出逐一渲染到 3D 实体的运行时机制。小结模型预处理是 TensorSpace 可视化工作流中承上启下的一环其本质可概括为三件事选中间层 → 提取层间输出 → 转换为 TensorSpace 兼容的多输出 tfjs 模型。通过tensorspacejs_converter的--input_model_from、--input_model_format、--output_layer_names或--output_node_names与位置参数input_path/output_path即可完成 TensorFlowtf_keras、tf_keras_separated、tf_frozen、tf_saved、Kerastopology_weights_combined、topology_weights_separated以及 TensorFlow.js 三类主流格式的转换。转换后在 TensorSpace 中按模型类型配置typegraph 模型还需outputsName即可在浏览器中同时看到网络结构与每一层对输入数据的直接处理结果。仓库中与本文对应的完整可运行材料包括docs/tensorflow/README_zh.md、docs/keras/README_zh.md、docs/tfjs/README_zh.md 三份框架级教程及其 转换脚本、原始模型、预处理产物 和 可视化页面以及端到端示例 examples/helloworld。赞分享数据可视化深度学习3D渲染AI 可解释性【免费下载链接】tensorspaceNeural network 3D visualization framework, build interactive and intuitive model in browsers, support pre-trained deep learning models from TensorFlow, Keras, TensorFlow.js项目地址https://gitcode.com/gh_mirrors/te/tensorspace点击查看免费下载相关推荐Chainer 模型导出为 Caffe Protobuf 格式基于 exporters.caffe 的预训练模型转换实战Chainer 模型导出为 Caffe Protobuf 格式基于 exporters.caffe 的预训练模型转换实战 Chainer 提供了将自身模型导出深度学习机器学习使用TensorSpace可视化TensorFlow.js预训练模型使用TensorSpace可视化TensorFlow.js预训练模型 你是否曾经面对复杂的神经网络模型感到困惑想要直观理解模型内部的结构和工作原理Tenso数据可视化深度学习3D渲染AI 可解释性MNN模型导出工具将训练好的模型转换为推理格式MNN模型导出工具将训练好的模型转换为推理格式 你是否遇到过训练好的深度学习模型无法直接在移动端或嵌入式设备上运行的问题是否因为模型格式不兼容而导致部署流程人工智能大模型推理引擎深度学习本地部署模型量化模型优化多模态计算机视觉嵌入式上一篇Utopia知识抽取内幕文档如何变成实体与事实开放图契约深度解析下一篇定制你的语音助手外观qwen-audio-agent悬浮Orb宠物皮肤导入完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考