CNTKで生成したモデルをWindows MLで使用したいが2019年12月23日 09:08

自前のデータによる学習も少し進捗してきたところで、できあがったモデルが使い物になるか試そうと、Windows MLでアプリを用意しようと試みる。

ONNXフォーマットへの変換

Windows MLで取り込めるのは、ONNXフォーマットのモデル。CNTKのSaveのAPIによると、ONNXフォーマットの出力もできそうだが、C#のライブラリは非対応。簡単なPythonプログラムで変換。

Windows ML Code Generatorによる生成

変換したONNXをプロジェクトに取り込むと、Windows Machine Learning Code Generatorがコードを自動生成してくれる。

ONNX Opsetバージョン変換

自動生成されたクラスを用い、アプリを書いてみるが、読み込みで例外発生。Opsetのバージョンの未対応。CNTK2.7で出力したもののバージョンは9。Windows MLが対応しているのは7と8。これも、簡単なPythonプログラムを書いて変換。この機械学習の世界、発展中ということもあって、ツールやフォーマットの不整合があちこちに。

EvaluateAsync例外

もう一度、アプリを動かすと、読み込みは通るが、LearningModelSessionのEvaluateAsyncで例外。XとWの配列数が不一致、というが。

WinML Dashboard

ONNXモデルの中身をみる必要が生じ、WinMLDashboardをインストールして確認。

Inputs

DashboardのEdit/Viewボタンを押し、最初のConvのNODE PROPERTIESのInputsをみる。
Xの型は float32[Sequence, 1, 1, 64, 64]。
Wの型は、float32[4, 1, 3, 3]。
Xは5つ、Wは4つ。例外のメッセージはこれのことか。

MINISTのInputs

WinMLはConv非対応かと思ったが、例題に出てくるMNISTのモデルをダウンロードして、確認してみると、Convを使っている。ただし、InputsのXとWの配列の数は4つで合っている。CNTKのSaveでこの辺りを制御するパラメータはない。

MNIST CNTK 2.5.1

Dashboardの画面の最初に戻って、MNISTのモデルを生成したCNTKのバージョンをみると、2.5.1。少し古い。

自前のアプリで使用するCNTKの最新版2.7では、ONNXの拡張されたデータ型 (Sequence) に対応しており、それに準じた出力をしている。他方、Windows MLでは、そこまでの対応に至っていない、そんな事情と推察する。

今さら、古いバージョンのCNTKを使うのも?なので、Windows MLによるアプリは保留。WPFなら、CNTKのC#のAPIが使えるので、そちらで検証を進める。