製品・サービスAIフレームワーク
“ufiesia”“pyaino”
学び、応用できる
2つのAI環境を構築
AIは日々進化し、私たちの生活や仕事に欠かせない存在になりつつあります。
でも、「どう動いているのか分からないまま」使っていませんか?
私は、その仕組みを理解しながら使えるAI環境を作りたいと考えました。
基礎の仕組みをシンプルに学べるufiesiaと、実践的な開発に使えるpyaino。
学びから応用までーAIを「ブラックボックス」から「透明なツール」へ変える2つのフレームワークです。(井上愛一郎)
ufiesia(ウフィーシア)とは
Ufiesiaはニューラルネットワークやディープラーニングの基本構造を理解するために用意したフレームワークです。
ソースコードを見て理解の助けとなるように、内部の記述も出来るだけ平易にしています。
同時に公開した「京」の扉に沿って学習していけば基本的な仕組みの理解が出来るものと期待します。
GitHubより、ufiesia(ウフィーシア)を
ダウンロードいただけます。
pyaino(ピアイノ)とは
pyainoは、NumPyをそのまま活用しながら実践的なAI開発を可能にするディープラーニング・フレームワークです。
微分計算はdefine-by-run方式で提供され、単純な関数の微分から、ディープラーニングの複雑な勾配計算まで正確に実現します。たとえば、1次関数の二階微分が正しくゼロになるように、高階微分も数学的に正確に計算できます。また、行列積の扱いも、数学と同じ規約で行われ、数値計算や数学の素養を持つ方にとって混乱がありません。
画像処理や言語処理に必要なモジュールも備えており、わずか数行の記述で機械学習やディープラーニングを体験できます。加えて、各モジュールは順伝播と逆伝播を明示的に記述しているため、不要な計算グラフを生成せず、計算資源を効率的に利用でき、検証時の動作確認も容易です。
GitHubより、pyaino(ピアイノ)を
ダウンロードいただけます。
AIフレームワーク 開発ブログ 過去の日誌を見る
ニューラルネットワークで画像を
研修会の内容
先の記事で社員研修会の話を書きました。そこで「内容」については参加者自身の発表の話を書きました。しかしそれ以外については詳しい内容を書いていなかったので触れておこうと思います。
MNISTとcelebA
今年の社員研修会は表題を「画像モデル入門」としたのですが、その教材として使ったのがMNISTとcelebAです。MNISTは、縦横28x28の白黒画像で、0から9の手書き文字を訓練用に60000枚、テスト用に10000枚集めたものです。

いっぽうcelebAは有名人の顔画像とその属性情報をまとめた大規模(>20万枚)な画像データセットで、縦横218x178のカラー画像ですが、このままでは大きすぎるので、縦横64x48に縮小して教材にしました。その画像の例を以下に掲載します。

ニューラルネットワークで文字認識 MNIST
まずはMNISTを使ってニューラルネットワークで文字認識です。これは画像を入力としてニューラルネットワークに入れて、それを0~9の10通りに分類するタスクです。これについては、ごく簡単なニューラルネットワークで扱うことができます。例えば;
model = Neuron.SequentialWithLoss(
Neuron.Conv2dLayer(100, activate='Sigmoid', optimize='AdamT'),
Neuron.Pooling2dLayer(),
Neuron.Flatten(),
Neuron.NeuronLayer(10, activate='Softmax', optimize='AdamT'),
LossFunctions.CrossEntropyError(),
)
このモデルで以下のように簡単に学習が進んで、
epoch | elapse | error train test | accuracy train test 0/ 10 | 0.0 | 0.242 0.244 | 11.70% 9.90% 1/ 10 | 30.2 | 0.052 0.053 | 86.00% 85.80% 2/ 10 | 30.2 | 0.040 0.038 | 87.90% 88.70% 3/ 10 | 30.2 | 0.033 0.032 | 90.20% 90.10% 4/ 10 | 30.3 | 0.030 0.029 | 91.20% 90.30% 5/ 10 | 30.2 | 0.029 0.028 | 91.60% 92.10% 6/ 10 | 30.2 | 0.026 0.026 | 93.10% 92.20% 7/ 10 | 30.3 | 0.024 0.023 | 92.60% 93.30% 8/ 10 | 30.2 | 0.025 0.025 | 93.50% 92.70% 9/ 10 | 30.2 | 0.022 0.022 | 93.90% 93.30% 10/ 10 | 30.1 | 0.021 0.020 | 94.50% 93.60%
あっという間に、testデータで90%を超えます。そしてもっとじっくり学習させれば、まだまだ向上します。因みにデータは訓練用trainを学習に使い、testの方は評価のみを行っています。だから、trainはニューラルネットワークにとって、すでに見た画像であるのに対し、testの方ははじめて見る画像になるわけです。さまざまな手法を駆使すれば、さらに向上しますから、初めて見る画像でも100%近い識別が可能になるわけです。
ニューラルネットワークで顔画像認識 celebA
次はcelebAの顔画像です。これはもちろん画像そのものがカラーである点は違うのですが、それ以上に、画像のヴァリエーションがMNISTとは大きく異なります。つまり顔が主役という点は画像として共通ではあるのですが、背景には様々なものが写りこんでいてバラバラです。ついでに顔の大きさもあまり揃っていません。だからMNISTのように簡単ではないことが、やる前からわかります。
そしてもう一つ大きな違いは、認識した結果として何を出力するのか、です。MINISTは0~9の数字なので出力としては0~9のいずれであるかであって一つの項目で、その区別すべき種類が10通りです。
これに対してcelebAの場合には40種類のラベルが付けられています。
例えば、'5_o_Clock_Shadow'(5時髭)、'Arched_Eyebrows'(三日月眉毛)、'Attractive'(魅力的)、'Bags_Under_Eyes'(目の下のクマ)、'Bald'(禿)、などなどです。
それがはなはだ主観的と思われるのですが、それぞれ-1と1の数値で、そうでない・そうだ、のラベルが付けられているのです。
つまり個々の項目については2通りしかないけれども、項目が40種類もあるのです。
マルチラベルの属性分類
この40項目は必ずしもすべて見分けなければならないわけではありませんが、せっかく顔画像認識をやるのなら、ということで、この40項目すべてを使うことにしました。あれこれ述べましたが、これも意外に簡単なモデルで扱うことができます。例えば(敢えてMNISTより簡単な)以下です。
kwargs = {'optimize' : 'AdamT'}
model = nn.SequentialWithLoss(
nn.Conv2dLayer(32, activate='ReLU', **kwargs),
nn.NeuronLayer(n_attrs, full_connection=True, activate='Sigmoid', **kwargs),
lf.CrossEntropyError2(reduction='sample') # 要素それぞれの損失のバッチ平均
)
このモデルでMNIST同様にkanntannni学習が進んで、
epoch | elapse | error | accuracy 0/ 50 | 0.0 | 27.483 | 54.44% 1/ 50 | 0.5 | 16.298 | 83.23% 2/ 50 | 0.5 | 13.761 | 84.66% 3/ 50 | 0.5 | 12.473 | 86.57% 4/ 50 | 0.5 | 10.112 | 88.86% 5/ 50 | 0.5 | 9.087 | 91.20% 6/ 50 | 0.5 | 7.922 | 92.03% 7/ 50 | 0.5 | 6.850 | 94.00% 8/ 50 | 0.5 | 6.284 | 94.90% 9/ 50 | 0.5 | 5.584 | 95.50% # 途中省略 48/ 50 | 0.5 | 0.358 | 100.00% 49/ 50 | 0.5 | 0.330 | 100.00% 50/ 50 | 0.5 | 0.317 | 100.00%
あっという間に100%です。とはいえ、実はこのケースは活性化関数にSigmoid、損失関数にCrossEntropyError2(正解不正解の両方向のクロスエントロピー)を使うことと、正解値データを-1/1から、0/1に変換しておくこと、などツボと言えることをちゃんと押さえておくことが肝要です。
画像認識の最後に、ちょっと面白いことを...
celebAの学習が済んだら、少し面白い遊びができます。それは、誰かの顔画像を持ってきて、学習済みのニューラルネットワークのモデルにそれを認識させるのです。
かなり言いにくいことも含まれていますが、顔画像を見たモデルがどう判断するのかを試してみるのです。
このためにjpgからモデルに入れられるデータを作るパスも用意しました。そして私の顔写真の場合には、'Male'(男)や'Wearing_Necktie'(ネクタイをしめている)、そして、'Bags_Under_Eyes'(目の下のクマ)や'Receding_Hairline'(頭髪後退)が出たりしました。その場でPCで写真を撮って、これをくわせた受講者もいました。
何かのイベントで、来訪者の方々に試してもらうのも、おもしろいかもしれませんが、場合によっては怒られそうですね?
初日はMNISTまで。あとは夜の宴会でした。
宴会の前に顔画像認識までやっておきたかったので、ちょっとだけ残念でした。
ブログのご感想やAIフレームワーク「ufiesia」「pyaino」に関するお問い合わせは、
問い合わせフォームからお送りください。
- お問い合わせ内容によりましては、ご期待に添えない場合やご回答が出来ない事が有ります。