連載こんにちは、ニューラルネット老人こと糟谷勇児です。Augmentation)を見ていきます。データオーギュメンテーションは学習データを人工的に変えて水増しして学習させる技法です。今回はニューラルネット自体をいじらないので簡単そうですね。(実際はだいぶハマった)前回は、ソフトマックス層を実装しました。ソフトマックスはドラクエに例えるとチャモロという話をしましたが、データオーギュメンテーションはドラクエに例えると「ゲントの杖」ぐらいの期待感はあります。いうのも、今までの誤認識をした結果を見ると明らかに失敗しているものに傾向があるからです。小さいもの下のほうにあるものアップのもの低コントラストなものこれらを認識するのに、画像を拡大・縮小したり、平行移動したり、低コントラストにしたりした画像を増やしていくとよさそうです。しちゃう私はずっと実務として画像処理をやってきたので、やっぱり人工的にデータを増やすのってなんかもやもやしちゃうんですよね。小さい飛行機が認識できないとしたら、人工的に画像を作る前にやることあるだろみたいな。空港監視で使うために飛行機を見分ける画像処理だとしたら、どの程度離れた飛行機まで認識するのかお客さんと仕様を合わせて、結構離れたものまで認識するなら、そういうサンプルも採取する必要があるでしょう。遠いので小さく見えるのと、縮小して小さいのは、レンズのゆがみやノイズの問題があるので違う話です。一つのモデルにこだわらなくても小さいものを認識するモデルと、大きいものを認識するモデルに分けるとか、認識する側を拡大縮小して何回も認識処理をかけるとかいろいろあると思うんですよね。そんなこと言ってると時代に取り残されるので、早速やっていきましょう。今回は、ちょっと拡大したものとちょっと縮小したものを用意します。拡大のほうはいいですが、縮小のほうは画像がない部分が出てきてしまいます。ここはOpenCvのInpaintで補完してやることにします。低コントラストのものも用意します。こちらはLab色空間に変換したのち、輝度成分(L平面)の標準偏差を取得し、ノーマライズした後、標準偏差が小さくなるようにして元のスケールに戻します。その後、RGB色空間に戻してやります。今回は4500枚ずつ学習データ使っているのですが、全件に対してランダムに0.7~1.3倍までの画像を作ります。その後、4枚に1枚は低コントラスト処理をかけてみました。この辺の設計が難しいですね。人工画像をもとの画像と同じ数だけ増やすのがいいのか、半分ぐらいにしておくのがいいのか。増やせば増やすほど1エポックにかかる時間は増すのと、実際には認識対象も多くは普通のサイズの画像なのであまり小さいのや大きいのを増やしても逆に精度が下がってしまいます。いって、元画像の半分の数ということにすると、画像の中で拡大前と後で二回学習されるものとそうでないものが出てきます。これが、バイアスにつながらないか心配になります。この辺りはいろいろやって確かめていきたいですね。ニューラルネットの並列化さて、ここで問題が出てきました。カラー化したり、ソフトマックスの導入でバッチサイズが小さいと学習がうまくいかなくなったり、少しずつ学習に時間がかかるようになってきて、今回2倍の時間がかかるようになったので、並列化して速くしないといけないくなってきました。今回、ニューラルネットは状態を持ったクラスとして作っているので並列化はなかなか難しいです。今回は複数の同じニューラルネットを用意し、バッチごとに並列化して学習して統合するようにしました。学習のバッチサイズが256だとすると、それを16分割して16個のニューラルネットにそれぞれ学習して、更新する重みを統合します。統合したニューラルネットをまた16個コピーして学習することを繰り返します。これで、4コアあるPCで3倍以上の速度になりました。今回も実際にやっていきます。ネットワーク構造は前回に引き続き以下のような感じです。2水増ししてできた画像はこんな感じ。左が元画像、右がサイズを変更した画像です。こちらが縮小画像こちらが拡大画像これを学習した結果、ちょっと精度が上がりました。前回88%まで行きましたが、今回は88.5%まで行きました。実はこの結果を得るまでに左右反転を試したのですが精度変わらず、x軸y軸を反転させるのも試したのですが逆に精度が下がってしまいました。その後いろいろ試したんですが90%を超えるような学習はできませんでした。これ以上は結構難しいかもしれない・・・もしかしたらもっと踏み込んで分析していく必要があるかもしれません。船も飛行機も一律小さくしていましたが、小さいものは飛行機が多いんですよね。飛行機は移動速度が速いので撮りたいと思ってもズームするのが難しいからでしょうか。単純に空を飛んでいるから遠いのか。飛行機は小さくするけど船はしないなどの工夫はあるかもしれません。そもそも結構小さいデータも学習データに入っていてもう加味された上で今の結果なのかもしれません。画像の分析によりすぎるとディープラーニングを学ぶ本題から外れそうなので今後の課題としておきます。次回は次回は気を取り直してついにAlexNetに挑戦していきたいと思います。一筋縄ではいかないと思いますが頑張ってみます。VGGにも使える高速化したコンボリューショナルネッ...こんにちは、ニューラルネット老人こと糟谷勇児です。C#で書かれたシンプルなコンボリューショナルネット(...こんにちは、ニューラルネット老人こと糟谷勇児です。VGGをC#で実装して学ぶこんにちは、ニューラルネット老人こと糟谷勇児です。AlexNetをデータオーギュメンテーションさせて学...こんにちはニューラルネット老人こと糟谷勇児です。意外と難しいソフトマックス層を実装して学ぶこんにちは、ニューラルネット老人こと糟谷勇児です。Inc.引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。