资源下载

0. 说明

最近在学习 Mathematica 机器学习方面的功能,与 TensorFlow 相比,Mathematica 在机器学习方面主要有以下优点:

  • 构建模型简洁明了
  • 训练过程可视化
  • 交互式的展示模型结构,对于大型网络很方便
  • 加载数据方便


(训练过程,点击图片可看大图,下同)

在学习过程中,有些部分需要下载 Wolfram 提供的神经网络预训练模型。
但由于国内下载时存在网络不稳定的情况,所以我就把 NetModule 中所有资源都下载下来,避免重装软件或在其电脑使用时还得再下载。并在这儿全部分享给大家。

提示:NetModule 中的模型会不断增加,本文会陆续更新新的资源。

1. 资源下载与保存

1.1 来源

官方资源列表链接

上面两个页面都可以按输入类型和任务类型来过滤模型,每个模型页面都有该模型的介绍和使用案例。另外,页面中也会说明训练集的来源,这为自己训练模型提供了一系列不错的数据源。

1.2 登录 Wolfram 账号

下载 NetModule 资源,需要先登录 Wolfram 账号。

启动 Notebook 后,一般会进行欢迎页面,此时直接登录即可。如果跳过了欢迎页面,也可以在 帮助 > 登录 中登录您的 Wolfram 账号。

如果以命令行方法运行(不启动 Notebook),可以在代码中使用CloudConnect函数登录您的 Wolfram 账号,比如:

CloudConnect["您的 Wolfram 用户名", "您的 Wolfram 密码"];

1.3 下载并保存资源

在 Linux 中,将下列代码保存在 ~/net-model/download.ws,之后运行wolframscript -f ~/net-model/download.ws 即可开始下载模型。

完整的代码(包含账号登录)如下:

Echo["Logining"];
rootDir = "~/net-model/";(*【建议修改】存储路径*)
CloudConnect["您的 Wolfram 用户名", "您的 Wolfram 密码"];(*【需要修改】登录Wolfram账号*)
Echo["Logined"];

allNetModel = NetModel[];(*获取所有模型的名称*)
ow = OpenWrite[rootDir <> "net-module-index.txt"];(*打开存储模型信息的文件*)
If[! DirectoryQ[rootDir <> "wlnet/"], 
 CreateDirectory[rootDir <> "wlnet/"]];(*创建存储模型的目录*)

Do[
 (*模型信息*)
 netName = allNetModel[[k]];(*模型名称*)
 Echo["loading:\t" <> netName];
 uuid = ResourceObject[netName]["UUID"];(*获取模型UUID*)
 hash = Hash[netName, "SHA", "HexString"];
 fileName = rootDir <> "wlnet/" <> netName <> ".wlnet";

 (*跳过已经下载的模型*)
 If[FileExistsQ[fileName],
  WriteString[ow, 
   "load_ed:\t" <> uuid <> "\t" <> hash <> "\t" <> netName <> 
    "\n"];(*存储已下载过的模型信息*)
  Echo["skip loaded NetModel:\t" <> uuid <> "\t" <> hash <> "\t" <> 
    netName];
  Continue[]
  ];

 (*下载模型*)
 net = NetModel[netName];
 If[net === $Failed,
  WriteString[ow, 
   "load_fail\t" <> uuid <> "\t" <> hash <> "\t" <> netName <> 
    "\n"];(*存储下载失败的模型信息*)
  Echo["skip load file NetModel:\t" <> uuid <> "\t" <> hash <> "\t" <>
     netName];
  Continue[]
  ];

 (*存储模型*)
 Export[fileName, net];
 WriteString[ow, 
  "load_succ:\t" <> uuid <> "\t" <> hash <> "\t" <> netName <> 
   "\n"];(*存储下载成功的模型信息*)
 Echo["load succ:\t" <> netName];
 , {k, Length[allNetModel]}];
Close[ow];

2. 使用

2.1 直接使用方法

由于使用 Mathematica 自己的文件格式存储的模型,所以直接导入即可使用。
关于 UUID,可以使用函数 ResourceObject 查询,也可以在共享的资源中找到 __net-module-index.txt 里面存储了这些模型的对应关系。
也可以使用下面的定义的函数来导入模型(模型用到了函数 ResourceObject,需要网络)

netModule[dir_,name_]:=Import[FileNameJoin[{dir,ResourceObject[name]["UUID"]<>".wlnet"}]];
net=netModule["存储模型的目录","LeNet Trained on MNIST Data"]

或者使用下面定义的函数导入模型(使用文件 __net-module-index.mx,不需要网络)

<< FileNameJoin[{"存储模型的目录","__net-module-index.mx"}];
netModule[dir_, name_] := Import[FileNameJoin[{dir, nets[name]}]];
netModule["存储模型的目录","LeNet Trained on MNIST Data"]

2.2 修改模型与使用方法

使用预训练模型可以节省训练时间,更人兴奋的是,你可以自由修改预训练过的网络。
比如,使用网络 Inception V1 Trained on Extended Salient Object Subitizing Data 可以识别图像中突出对象的数量。
有时候只是想知道图像中有没有目标对象,即二分类问题,那么可以通过下面的方式修改网络的最后几层和输出层:

(*导入模型,函数定义参见上面*)
net=netModule["存储模型的目录","Inception V1 Trained on Extended Salient Object Subitizing Data"]

(*删除最后两层*)
netTemp=NetDrop[net,{"loss3_classifier_sos","loss3_loss3"}]

(*追加两层,并进行初使化,最后将输出设置为二分类*)
net=NetAppend[netTemp,
{
"loss3_classifier_sos"->NetInitialize[LinearLayer[2,"Input"->NetInformation[netTemp,"OutputPorts"]["Output"]]],
"loss3"->SoftmaxLayer[]
},
"Output"->NetDecoder[{"Class",{1,0}}]
]


运行上面的代码即可看到修改后的网络(Mathematica 神经网络对象),如果想看整体的结构图可以使用函数 NetInformation

NetInformation[net, "FullSummaryGraphic"]


函数 NetInformation 可以给出网络的各种信息,查看该网络支持的属性可以运行:

NetInformation[net, "Properties"]