ほそ道まっぷ - 東関紀行、海道記を追加2020年04月22日 12:07


ほそ道まっぷ

Windowsアプリの「ほそ道まっぷ」に、東関紀行と海道記を追加。

さすがに鎌倉時代(13世紀)の紀行なので、なくなった地名、地殻変動で失われた場所、など、不明な箇所がいくつも。それでも、なんとか、道筋をたどってみる。

地名は、地理院地図を主にプロット。地図上の地名表記の近くが中心に来る設定。そのため、街道沿いから離れる場合も。また、山など少し離れた場所を指す場面もあり、画面いっぱいに拡げて、広く周囲を見ながら、本読みの供とするのがおすすめ。

プライバシーポリシーとサポート情報 - ほそ道まっぷ2020年04月22日 12:00

本アプリについて (About this app)

紀行文に記された地名を一覧から選択し、地理院地図とGoogle Mapで地形や史跡を確認しながら、読書を支援するアプリです。地形を合わせ見ることで、山あいを旅したのか、川沿いに進んだのか、荒野を縦断したのか、など、旅の風景が見えてきます。

2020年4月更新
東関紀行と海道記を追加しました。

※アプリのページ

プライバシーポリシー (Privacy statement)

ほそ道まっぷ
対象アプリ;ほそ道まっぷ

本アプリの製作者である The Fourteenth Lab (第十四工房) は、本アプリによって、お客様の個人情報およびプライバシーに関する情報を収集しません。

サポート情報 (Support)

ご質問や不具合のご連絡は、このページの「コメント欄」をご利用いただくか、「このブログについて」に記載の連絡先までお願いします。

あらかじめのおことわり (FAQ)

1) 地名を選択するタイミングによって、地図サイトの読込がうまくいかないことがあります。その場合は、地図の上にある「更新」ボタンで再読込してください。

2) 取り上げた地名は、主に本文や注釈で参照されている場所です。注釈で示されている場所には、場所違いと思われる箇所もありますが、そのまま取り上げています。

3) 一般的な地名は、通常、駅に代表させています。最寄り駅がない場合は、市役所などを充てています。ただし、駅は、かつての街道沿いから離れている場合も多いので、地図を広めに見て、街道筋や宿場町の見当をつけてみてください。

4) 表示位置の緯度経度は、地図を参照しながら、手作業で設定したものです。だいたいの位置を示していると理解してください。また、同じ地名でも、当時とは別の場所になっていることや、名前が同じだけで関係ない場所もあると思います。アプリ開発者の推測を含みます。その点は、ご容赦ください。

5) 地図表示は、緯度、経度、縮尺をURLに設定して、アプリ組み込みのブラウザで指定して表示しています。表示された地図の加工や、埋め込まれたスクリプトの呼び出しなどはしていません。

利用するツールや文献 (Reference)

1) 国土地理院地図

2) 芭蕉 奥のほそ道 付 曾良旅日記 奥細道菅菰抄 (萩原恭男校注)、岩波文庫

3) 東関紀行・海道記(玉井幸助校訂)、岩波文庫

CNTK; CNNのConv Layer数、ラベル数、モデル利用時の前処理と後処理2020年01月21日 15:21

CNTKのCNNを用いた画像識別。少しずつ、コツを掴みつつあるのか。

1.Conv Layerの数

Conv Layer 3

Conv Layer数3。64x64x1を8x8x16に持っていく。
学習が進むと、大きくLossが下がる箇所がある。ここででは、14000件ほど進んだところ。

Conv Layer 4

Conv Layer数4。64x64x1を8x8x32に持っていく。精度向上や、より多くのラベル数に対応できるようにとの発想だったが。大きくLossが下がる箇所は、25000件ほど進んだところ。

ラベル数は15。2つのCNNの間に、精度の有意な差は見られず。ただ、学習進度が遅くなっただけ。パラメータは他にもいろいろあるので、一概には言えないが、必要以上にモデルを複雑化するのは意味がなく、かえって有害にもなり得る。

2.ラベル数

ラベル数は少ない方が、よい成績を得られそうだが、そう簡単でもない。
今回は、漢字の部品を相手にしているが、「木」に加えて、「大」を加えた方が、精度が上がったりする。データのバリエーションを増やした方が、違いがわかるようになる側面がある。対象のデータの特性次第。

3.モデル利用時の前処理と後処理

漢字の部品単体の認識がそこそこできるようになったところで、対象を広げる。
この時、
・画像の切り出し
・不要な部分の刈り取り
・画像サイズの拡大による正規化
などの前処理を施さないと、結果はノイズだらけに。

圧右下

「圧」の例。画像の右下を切り出し、認識させると、そこそこの精度で「土」を識別する。

圧全体

文字全体だと、「田」と識別。

圧左半

左半分だと、「日」と識別。少し遠目で見ると、そうか、と思えなくもない。
こういった一連の結果を、どう判定して、不適切なものを取り除くかが課題。

圭上半

「圭」の例。画像の上半分を切り出し、「土」を識別。

圭下半

下半分も、「土」を識別。

圭全体

文字全体だと、「王」と識別。横棒を一本無視すれば、そう見えないこともない。
総じて人の識別と比べるとプリミティブなもの。

結果には、まだまだノイズが多い。対処としては、次のようなものか。
・学習データの見直し(形状やバリエーション)
・部品種(ラベル)の追加
・画像の前処理の改良
・結果からのノイズの除去方法の検討
実用に耐えるものができるかどうかは、五分五分。

こんな感じで、機械学習において、モデル構築は作業の一部。目的とする結果を得るには、やることがまだまだある。

機械学習の技術者を育てる、と巷でいうが、どのあたりの技術が課題となっているのか。地味で面倒な作業も多く、十把一絡げで論じてはいけないような。

なお、識別アプリは、UWPでCNTKのライブラリはCPUを使う。画像を69の枠に分割して、処理するが、かなりの時間を要する。エッジ側にもAIアクセラレータが必要、とされるのも道理かと。

UWPでCNTKを利用するためのC++ WrapperのBuildエラー2019年12月27日 11:42

やはり、WPFでは、アプリは作り難い。ということで、諦めが悪いようだが、UWPでCNTKのモデルを利用するためのC++のWrapperを書く。コードは、MSのサンプルをお手本に手を入れる。最近のC++のコードはなかなか新鮮。

リンクエラー

IDEのコードチェックは通ったところで、Buildしてみると、多量のリンクエラー。

配布されているCNTKの開発パック内のサンプルを取り出してBuildしても同じ症状。自分のコードのせいではないようす。よく見ると、エラーメッセージ中に、プラットフォームがx64で、VS2017のみサポート、との文言。

VisualStudio 2017をインストールしてBuildすると、あっさりと通過。

ツールセット2019

C++のプロジェクトで、プラットフォームツールセットがVS2019(v142)というのがいけない。

ツールセット2017

VS2017(v141)にすれば、リンクが通る。後で試すと、VS2019でも、ここを設定すればBuild可。

UWPでCNTKのモデルを利用する評価アプリ

起動時にランタイムを読み込む分、少しもっさりするが、無事、UWPでCNTKのモデルを用いるアプリが動く。これでこの先、手を入れやすい。

プログラムで生成したデータで学習してみると2019年12月26日 07:39

個人レベルでは、機械学習のデータが用意できないなら、作ってしまおう、とプログラムで生成するとして、それは、使い物になるのか。

学習データ生成アプリ

漢字を構成する要素を、乱数をふんだんに配置して、プログラムで生成。これなら万単位のデータも用意できる。Win2DのCanvasPathBuilderで書いていく。

木、ゴシックの評価

試しということで、CNTKで生成したラベル数が5のCNNのモデルを読み込み、検証。Windows MLが使えなかったので、アプリは、WPFで作成。C++のWrapperを用意してUWPにする手もあるのだけど。

ゴシックフォントの「木」を認識。評価関数は、学習した内容から、それである確率を数値化する。これを、右の一覧に表示。最大値のものを正答とする。

土、ゴシックの評価

ゴシックフォントの「土」を認識。そこそこ。

土、明朝の評価

明朝フォントの「土」を認識。「土」と「木」の判定数値が接近している。学習データがゴシック様のものであることが影響するか。

他、「口」、「氵」などは、正しく認識。ただし、「亻」は、誤認識。形状が単純で不十分な学習に終わったか。

まだ、なんともいえないが、漢字フォントのようなかっちりしたものには、プログラムで生成したデータでもそこそこいけそうな感触。もう少し、先に進めてみる。

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

CNTKをC#で、ふたたび2019年12月02日 18:10

CNTKを用い、機械学習のうち、CNNを学んでみようとして、データを用意しては、学習しない、を繰り返し、途中、サイクリングや読書に逃避しつつ、ずいぶんと時間を費やす。結局、敷かれた道を歩むのが最短だったか、と今さら気づく。

漢字要素ラベリング

最初は、木や土、といった漢字の構成要素を識別できないか、と試みる。ラベリングしたデータは4000ほど。さっぱり学習が進まない。

ガルパンキャララベリング

漢字の構成要素は、画面のあちこちに現れる。これは、場所を特定してから識別しなければいけないか、と、もう少し簡単なデータを探す。手元に、Webで公開されている、もっとらぶらぶ作戦です、のPDFがあったので、顔の部分を切り出して、ラベリング。1500ほど。こちらも、学習が進まない状況は変わらず。

MNISTデータ変換

うまくいかないのは、データの不備か、学習プログラムのせいか、アルゴリズムを追えばよいわけではないので、切り分けが難しい。基本に戻って、MSのTutorialにある手書き数字の識別の例題を実装。ところが、ここでも学習は進まず。

MNIST Pythonサンプル

C#のAPIの方は、巷の情報も少ない。さらに戻って、Pythonの例題を実装。Visual StudioにPythonの環境も実装されたので、あわせて試す。文法解析などはしてくれるが、C#ほど親切ではない。データを変換する処理を動かして、出力ファイルを比較して、問題の所在が判明。自前のデータ生成処理に不具合があった。

C# MLP

処理を修正して、データを出力し直し、C#の例題にあるコンソールアプリを動かす。MLP(Multi Layer Perceptron)の方は、誤識別率5%程度を達成。

C# CNN

CNN(Convolutional Neural Network)の方は、誤識別率2%程度と、もう少し優秀。

画像識別学習アプリ

自前の学習プログラムで改めて確認。同じように学習が進むことを確認。

漢字の構成要素やらぶらぶ作戦の顔データで試してみると、誤識別率は、実用に耐えるほどではないが、改善する傾向を見ることができた(50%を切るくらいまで)。この2例では、MLPの方が、学習の進みが早い。手書き文字の例題の傾向とあわせてみると、MLPでデータの有効性(学習性向)を把握して、CNNに進む方がよさそう。

総括すると、CNTKを学ぶ道筋は、素直にPythonの環境で、既知のデータを用いて、データと処理ロジックを確認した上、C#のアプリ実装に進み、自前のデータに進む、という段取りが確実。そうすれば、学習アルゴリズムの選択や、Neural Networkの試行錯誤に集中できる。今回は、今さら新言語をと、Pythonを迂回しようとしたのが誤り。

新調したGPU。MLPでHidden Layerが200層、CNNで最大フィルタ数が16、画像は64x64ピクセル。これで、GPUのメモリ使用量が1.5GB弱(ブラウザが使う分を含む)。以前の0.5GBのQuadroでは不足だったはず。今度は、4GBあるので、もう少し試せそう。

問題はこの先。十分な学習に必要なデータ数は、かなり多め。個人の関心の向く中で用意するには、どうしたものか。大きな組織に属するもの以外には、お呼びではないのか。

興味の向くようなデータを公開してくれる組織が増えないと、例題のその先に進む学習者は増えない。逆にゲームやコンテストのノリで募れば、面白くもなりそう。くずし字のプロジェクトは、そのいい例かも。

Visual Studio 20192019年04月04日 14:05


VS2019

4月に入って早々、Visual Studio 2019がリリース。ぱっと見すぐに気づくのは、フラットなUIになったこと、スタートウインドウがダイアログになったこと。What's New は、インストーラの方に。機能面では、チームでの作業支援の充実かな。コーディング支援もいろいろあるようだけど、それは使い込んでから。