NeuralNetworkConsole

Neural Network Console Challengeに参加してみた!【Part1】

Neural Network Console Challenge_1

スポンサーリンク

こんにちは、 ぴろ です。

Neural Network Console Challenge(NNC Challenge)というAIで写真素材を画像分類するコンテストがありましたので参加してみました。

本記事はNNC Challengeのアウトプット提出用兼プロセスの備忘録になります。

Neural Network Console(NNC)とはSonyが提供するノンプログラミングでAI開発できるGUIツールになります。

このNNCを使用してPIXTAの写真素材を画像分類モデルを作成するコンテスト形式のオンラインイベントがNNC Challengeになります。

AI開発を始めようとしても、「始め方がいまいち分からない」「プログラミングでの開発ハードルが高く挫折してしまう」「そもそもデータがない」といった課題に直面し挫折してしまう人も多いかと思います。

私もその一人だったのですが、本コンテストでは以下のメリットがあるのでとても参加しやすかったです。

  • NNCはドラッグ&ドロップによる簡単編集ができるので、敷居が低い
  • PIXTAの写真素材が提供されるので、データ収集は不要
  • 参加するとNNCで使用できるGPU利用枠10,000円分が付与されるので、GPUマシンがなくても問題ない(運営事務局にメールで依頼する必要があります。)

優秀な作品やアイデアは表彰されるみたいですが、まずはアウトプットすることを優先してやっていこうと思います。

NNC表彰
引用:Neural Network Console Challenge

スポンサーリンク

NNC Charangeのテーマの選定

NNC Challengeに参加したらまずはテーマを決めていきます。

本コンテストでは以下の4種類のテーマから選んで新たな画像カテゴリ分類を考えます。

  • 『人物画像をNNCで学習させ新しいオノマトペ(擬音語/擬声語/擬態語)の画像カテゴリ分類を作り出す』
    例)ニコニコ/バチバチ/ゴリゴリ
  • 『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』
    例)正面向き/バストアップ/全身/背面
  • 『NNCで画像を学習し人の感情によって分類』
    例)嬉しい/悲しい/恥ずかしい
  • 上記以外のチャレンジテーマを自由に設定しての応募も可
    ※ただし画像分類のテーマに限る

私はあまのじゃくと言いますか、ほかの人と違うことをやってみたいと思う人間なので、4つめのチャレンジテーマを自由に設定しようと思います。

決めたテーマ画像分類のテーマは、「写真内の人物がいる場所が屋内か屋外かを分類する」にします。

このテーマに決めた理由は次の2つです。

  • NNC自体使うことが初めてなので、まずは簡単な2値分類ができるテーマにしたい
  • 画像データはすべて人が写っているので、その人物が屋内か屋外かの判断ができる

NNCで使用する学習・評価用データの準備

準備

参加したら画像データのダウンロードリンクのメールが届くのでダウンロードしておきます。

ダウンロードしたデータを使って、学習・評価用のデータを準備します。

アノテーションの実施

まずはアノテーション(画像のタグ付け分類)を行います。

アノテーションとは、どのような画像が「屋内」「屋外」といえるか、正解となるデータを付与することです。

NNCには使用するデータセットを作成するツールがあるので、画像をフォルダに移動するだけです。

とはいえ10000枚もあるのでけっこう大変でした。。。。

今回の場合は[屋内][屋外]の2つのフォルダを作成し、以下のような画像をそれぞれ振り分けました。

屋内

inddoor_sample

屋外

outdoor_sample

学習用データ提供:PIXTA

データセットの用意

アノテーションが完了したらツールを使用してデータセットを作成します。

学習用と評価用の割合は7:3で分類します。

1000枚1セットで計7セット用意します。

学習用の7000枚を一気に学習させると時間がかかるため、最初は1セット目だけを学習させます。

データセットの作成方法はこちらがわかりやすいかと思います。

NNCでニューラルネットワーク(アルゴリズム)を作成

データセットを作成したら、次はニューラルネットワーク(アルゴリズム)を作成します。

今回は屋内or屋外の2値分類なので、比較的簡単なニューラルネットワークにしようと思います。

以下の動画を参考にしてニューラルネットワークを作成しました。

作成したネットワークは以下になりました。(動画内のネットワークと同じです)

NeuralNetworkConsole

NNCで使用するデータセットの設定

次にデータセットの設定を行います。

1セット目の約1000枚を学習用、判定用の3000枚を評価用にセットします。

データセットを設定したら、作成したデータセットが正しいデータセットフォーマットであるかどうかを確認します。

データセットビューワ上で右クリック⇒[Check Consistency]をクリックします。

NeuralNetworkConsole

[No inconsistency were found]と出れば問題ありません。

NeuralNetworkConsole

この機能は学習、評価それぞれのデータセットで、ファイル名、変数の数、各変数のサイズなどが正しく設定されているかについてのチェックが行われます。

不整合がある場合はエラー箇所と共に不整合の内容が表示されます。

こういった細かいところでチェック機能がある点がよいですね。

いざ学習初めてみてエラーが出て原因を調べてみるとデータセットだった、ということが事前に防ぐことができるのはありがたいです。

学習・評価の実施

学習

ニューラルネットワークの作成とデータセットを設定したら、いよいよ学習・評価を行います。

流れとしては次のように行っていきます。

  1. Profilingの実施
  2. 基本のネットワークで学習・評価
  3. 構造自動探索機能でネットワークのチューニング
  4. 全てのデータセットで学習・評価

Profilingとは

NNCでは学習開始時にキャッシュ作成を行いますが、学習実行にGPUを選択してもCPUで処理されます。

そのため、ローカルGPUではなく課金でGPUを使用する場合は、GPUでの学習の費用対効果をあげるため先にprofileを行ったほうが良いです。

意図通りではないネットワークの実行に高価なGPUを使うのはもったいないので、CPUのProfilingでキャッシュを予め作成後にGPUで学習を実行すると効率的です。

Profilingのやり方や出力内容についての説明はチュートリアル:学習の処理時間のProfilingを行うが参考になります。

Profiling処理を含めたGPUのコンピューティングリソースについて効率的にジョブ実行を行うためには?が参考になります。

Profilingの実施

それではProfilingを実施します。

[EDIT]タブ右側のコントローラでドロップダウンメニューから[profile]を選択します。

プロセッサーはLocal ProcessorかCPUを選択してRUNをクリックします。

NeuralNetworkConsole

Profile Completedとログに表示されればOKです。

NeuralNetworkConsole

GPUの設定

今回は無料枠で使用できるGPUを使用するので、GPU設定を行います。

右上の[Setup]をクリックし、[ENGINE]タブのProcessor Typeを[CUDA-Enable GPU]に設定します。

ローカルではなく課金のGPUで行う場合はドロップダウンリストはDefaultでOKです。

NeuralNetworkConsole

学習の開始

いよいよ学習を行います。

[EDIT]タブ右側のコントローラでドロップダウンメニューから[Train]を選択します。

プロセッサーは今回は[Tesla V100]を選択してRUNをクリックします。

NeuralNetworkConsole

学習が完了したら評価を行います。

評価は[TRAINING]タブから右側のコントローラでRunをクリックします。

NeuralNetworkConsole

正解率(Accuracy)は67%となりました。

NeuralNetworkConsole

予想はしていましたがよくないですね。

学習データが不足しているのもありますが、ネットワークが最適なものではないのでチューニングが必要です。

構造自動探索機能で効率よくチューニングを行う

NNCではチューニングを効率よくできる構造自動探索機能があります。

早速この機能を使用しチューニングを行います。

チューニングとおおざっぱに言いましたが、具体的には自動的にネットワーク構造を変更させながら、より精度が高く演算量の少ないネットワーク構造を探す機能です。

エポック数やバッチサイズのようなハイパーパラメータを調節するようではないので、この辺りは自分で調節する必要があります。

今回はハイパーパラメーターは調節せずに、単純な構造自動探索機能による精度の変化を見ていきます。

構造自動探索機能を使用するには、右上の[CONFIG]タブから[Structure Search]のチェックボックスをONにします。

構造自動探索機能の方法(Method)は[Network Feature + Gaussian Process]を使用します。

理由は[Random]と比較して素早くより良いネットワークを発見できるため、GPUの使用リソースが限られている今回の環境ではこちらのほうが適しています。

NeuralNetworkConsole構造自動探索機能についてはこちらの動画がとても参考になります。

構造自動探索機能をGPUで約3時間ほどおこなった結果が以下になります。

NeuralNetworkConsole

一番Errorの値が小さいこのモデルを使用して評価を行ってみます。

NeuralNetworkConsole

正解率(Accuracy)は74%となりました。

チューニング前は67%だったので、8%も向上しました。

NeuralNetworkConsole

次はこのネットワークでデータ数を増やしてさらに学習を行っていきます。

チューニング後のネットワークで全データを学習・評価する

10000枚のうち3000枚を評価用、1000枚1セットで計7セットを学習用として用意しており、1セット目を学習していました。

これを1+2セット、1+2+3セット…というように順々にデータを足して学習し、データ数によってどれだけ精度が上がるかを見てみます。

学習した結果は以下の様になりました。

学習結果まとめ

学習用の全データ7000枚を学習させたセット7では87%まで精度が向上しました。

セット1での74.5%なので、10%以上も向上しました。

やはりデータ数とネットワーク構造が大事ということですね。

CPUとの処理速度比較

無料GPU利用枠を利用した場合は、CPUとの処理速度の比較について触れる必要があるので記載しておきます。

  • 使用した製品

CPU:Intel Core i5 M560@ 2.67GHz × 1
GPU:NVIDIA Tesla V100 GPU × 1

  • 処理時間

CPU:17時間35分
GPU:1分

CPUが古く性能が低いため全データを学習すると途方もない時間がかかるため、1セット(約1000枚)での学習時間になります。

CPUが約10年前のものとはいえ大きく差が開きました。

最新のノートPCでもおそらく数十分はかかると思うので、時間的コストを考えるとやはりGPUを使用するべきですね。

GPU利用枠が使えて本当に良かったです。

Neural Network Console Challengeに参加した感想

本コンテストに参加したきっかけとして、ディープラーニングG検定を合格したけど、いまいちCNNやRNNについて理解できていない状況でした。

なんとなく概念は分かっていたのですが、実際に触れてみないと分からないなーっと思っている最中に本コンテストが目についたので思い切って参加してみました。

ゆくゆくはプログラミングで自分で実装していみたいとは思いますが、プログラミングは省いて実装することができるので、概念を学ぶにはとても最適でした。

特に構造自動探索機能は便利で、基本となるネットワークを作れば後はより性能が高いネットワークを自動で探索してくれるので勉強になります。

強いて言えば、構造自動探索機能でチューニングする前と後のネットワークを比較する機能があればさらに勉強しやすくなるので、アップデートを期待して待ちたいと思います。

Neural Network Console Challenge_2
Neural Network Console Challengeに参加してみた!【Part2】こんにちは、 ぴろ です。 Neural Network Console Challenge(NNC Challenge)というA...
Neural Network Console 使用方法
ディープラーニング入門!Neural Network Consoleを使ってみたので使用方法を解説こんにちは。ぴろ です。 Sonyが提供しているNeural Network Consoleをご存知でしょうか? Pytho...

 

 

スポンサーリンク