
资源下载
- 【2020-03-22】【NetModel】【百度网盘】【 95个模型】【以模型名称作为文件名存储】(提取密码:46zp)
- 【2018-11-19】【NetModel】【百度网盘】【 79个模型】【以模型名称作为文件名存储】(提取密码:ddrk)
- 【2018-08-16】【NetModel】【百度网盘】【 76个模型】【以UUID作为文件名存储】
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"]