MXNet (.json, .params)
背景
-
- Wolfram 语言使用的 MXNet 深度学习框架的根本格式.
- MXNet 网络被保存为两个单独的文件: 一个指定网络拓扑的 .json 文件和一个指定笔记本中使用的数值数组的 .params 文件. 当加载 .json 文件时,Wolfram 语言会自动查找合适的 .params 文件.
Import 与 Export
- Import["file.json","MXNet"] 导入存为 .json 文件的 MXNet 网络,如果有的话,会从对应的 .params 文件加载权重.
- 对应于 "file.json" 的参数文件被假设为匹配模式 "file*.params" 并位于同样的文件夹中.
- Import["file.params","MXNet"] 也可用于直接导入网络参数.
- Import["file.json",{"MXNet",elem}] 和 Import["file.params",{"MXNet",elem}] 从对应文件导入指定参数 elem.
- 默认情况下,Import["file.json"] 导入为 "JSON" 格式,而非 "MXNet".
- 请到以下参考页面了解完整的基本信息:
-
Import, Export 从文件导入或导出到文件 CloudImport, CloudExport 从云对象导入或导出到云对象 ImportString, ExportString 从字符串导入或导出到字符串 ImportByteArray, ExportByteArray 从字节数组导入或导出到字节数组
参数
-
"Elements" 该文件可用的参数和选项列表 "Summary" 文件摘要 "Rules" 所有可用参数的规则列表 - 当导入 .json 文件时,可用网络 Import 参数:
-
"InputNames" 网络输入的名称 "NetExternalObject" 将网络导入为 NetExternalObject "NodeDataset" MXNet 符号结点的数据集 "NodeGraph" MXNet 符号的结点图形 "NodeGraphPlot" MXNet 符号的结点绘图 - Import["file.json","MXNet"] 默认使用 "Net" 参数.
- 当导入 .params 文件时,可用参数 Import 参数:
-
"ArrayAssociation" 以关联形式导入参数 "ArrayList" 以列表形式导入参数 "ArrayNames" 参数数组的名称 - Import["file.params","MXNet"] 默认使用 "ArrayAssociation" 参数.
范例
打开所有单元 关闭所有单元基本范例 (1)
定义 NetChain:
net = ElementwiseLayer[Ramp, "Input" -> {3, 4}]path = Export[FileNameJoin[{$TemporaryDirectory, "netChain.json"}], net, "MXNet"]Import[path, "MXNet", InputPorts -> <|"Input" -> {3, 4}|>]Import 参数 (9)
InputNames (1)
NetExternalObject (2)
以 NetExternalObject 形式导入 MXNet 网络:
Import["ExampleData/mxnet_example2.json", {"MXNet", "NetExternalObject"}, InputPorts -> <|"Input" -> {1, 3}|>]Import["ExampleData/mxnet_example2.json", "MXNet", InputPorts -> <|"Input" -> {1, 3}|>]FindFile["ExampleData/mxnet_example1.params"]Import["ExampleData/mxnet_example1.json", {"MXNet", "NetExternalObject"}, InputPorts -> <|"Input" -> {4, 1}|>]"ArrayPath" 选项可被用于避免导入参数文件,这等同于生成未初始化的网络:
Import["ExampleData/mxnet_example1.json", {"MXNet", "NetExternalObject"}, InputPorts -> <|"Input" -> {4, 1}|>, "ArrayPath" -> None]请注意,生成的 NetExternalObject 具有额外的输入,其中必须提供缺失数组的值.
NodeDataset (1)
NodeGraph (1)
NodeGraphPlot (1)
ArrayAssociation (1)
ArrayList (1)
导入选项 (1)
"ArrayPath" (1)
file = FindFile["ExampleData/mxnet_example1.params"]Import["ExampleData/mxnet_example1.json", "MXNet", InputPorts -> <|"Input" -> {4, 1}|>, "ArrayPath" -> file]当设置为 None 时,不导入参数,等同于生成未初始化网络:
Import["ExampleData/mxnet_example1.json", "MXNet", InputPorts -> <|"Input" -> {4, 1}|>, "ArrayPath" -> None]请注意,生成的 NetExternalObject 具有额外的输入,其中必须提供缺失数组的值.
可能存在的问题 (4)
MXNet 模型定义不保留输入与输出维度的信息. 定义一个带有指定 "Input"维度的 NetChain:
net = NetGraph[{Sin, Cos, Plus}, {NetPort["Input1"] -> 1, NetPort["Input2"] -> 2, {1, 2} -> 3}, "Input1" -> {2}]path = Export[FileNameJoin[{$TemporaryDirectory, "net.json"}], net, "MXNet"]Import[path, "MXNet"]Import[path, "MXNet", InputPorts -> <|"Input1" -> {4}, "Input2" -> {7}|>]
必须提供一组最小的一致维度. 在这种情况下,为单个输入提供形状就足以推断网络的其余部分:
Import[path, "MXNet", InputPorts -> <|"Input1" -> {7}|>]包含转换为作用于批量元素的 MXNet 运算符的层的网络在往返时需要额外的输入维度. 创建一个小型卷积网络:
net = NetInitialize@NetChain[{ConvolutionLayer[3, 2], ElementwiseLayer[Ramp]}, "Input" -> {4, 5, 6}]path = Export[FileNameJoin[{$TemporaryDirectory, "net.json"}], net, "MXNet"]Import[path, "MXNet", InputPorts -> <|"Input" -> {4, 5, 6}|>]
必须明确提供额外的输入尺寸,即批处理维度。它通常可以有任何值:
Import[path, "MXNet", InputPorts -> <|"Input" -> {13, 4, 5, 6}|>]任何添加于网络的 NetEncoder 或 NetDecoder 将不会被导出:
net = NetInitialize@ConvolutionLayer[2, 3, "Input" -> NetEncoder["Image"]]path = Export[FileNameJoin[{$TemporaryDirectory, "conv.json"}], net, "MXNet"]所导入的 NetExternalObject 不再含有 NetEncoder:
extNet = Import[path, "MXNet", InputPorts -> <|"Input" -> {1, 3, 126, 126}|>]net = BasicRecurrentLayer[3, "Input" -> {"Varying", 2}]path = Export[FileNameJoin[{$TemporaryDirectory, "net.json"}], net, "MXNet"]net = BasicRecurrentLayer[3, "Input" -> {3, 2}]path = Export[FileNameJoin[{$TemporaryDirectory, "net.json"}], net, "MXNet"]历史
2017年引入 (11.2) | 在以下年份被更新:2023 (13.3)