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が使えるので、そちらで検証を進める。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://c5d5e5.asablo.jp/blog/2019/12/23/9192861/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。