この記事では、PythonでAIを作っていきます。
AND回路の統計AIから、手書き数字の画像を識別するニューラルネットワークのAIを作ります。ニューラルネットワークは一次元MLPだけでなく、二次元CNNもできます。
下記の書籍がテキストです。実際に授業で教えています。
- 基本的なAIの作成(統計AI、アヤメの分類)
- 手描き数字の画像識別(一次元MLP、二次元CNN)
- 省略した内容と理由
私は、IT専門学校のAIコースのカリキュラムを全て企画してきました。この記事のカリキュラムで学習すると、専門学校2年生修了と同等レベルになれます。
あなたのAI開発の初動の参考になれば、嬉しいです。
▼次に読んで欲しい記事▼
IT専門学校のAIコースでのカリキュラム
目次は下記のサイト様で見ることができます。
私がカリキュラムで選んだ内容は以下。
- 1-1:機械学習の概要
- 1-4:実習環境Google Colaboratoryの使い方
- 2-1:統計AIによるAND回路の機械学習
- 統計AIによるOR回路の機械学習(オリジナル)
- 統計AIによるXOR回路の機械学習(アレンジ)
- 2-2:統計AIによるアヤメの分類
- 2-5:AIの精度評価
- クロスバリデーション(交差検証)
- グリッドサーチ
- 3-2:顔検出AI(Haar-like特徴分類器)
- 写真から顔検出して枠で囲む
- 3-3:手書き数字の判別(1次元)
- 5-1:ニューラルネットワークの概要
- 5-4:手書き数字の判別(ニューラルネットワーク)
- 1次元のニューラルネットワーク(MLP)
- 2次元の畳み込みニューラルネットワーク(CNN)
以下では、各節の実習内容やポイントを解説していきます。
第一章 | 機械学習や開発環境の概要
第一章は、機械学習の概要・開発実習の環境について書かれています。
1-1:機械学習の概要
機械学習とは、事前に与えた大量のデータから、タスクを正しく行うための特徴を見出していくことです。
AIが行うタスクは、
- 分類…区別する
- 回帰…値を予想する
- クラスタリング…グループ分け
- 次元数を削減…必要なデータ項目を選定する
AIが取り扱える分野は、画像・時系列・音声・テキストなどです。
深層学習(ディープラーニング)とは、機械学習のうちニューラルネットワークを使ったものです。
機械学習の学習手法は3種類あります。
- 教師あり学習…データに答えをつけてAIに学習させる手法です。「この画像は犬だよ」「この画像は猫だよ」とデータと答えを与えて学習してもらいます。
- 教師なし学習…データだけを与えてAIに学習させる手法です。画像データを大量に与えて「4グループに分けてごらん」と課題を与えて、AIは実現できるように自分でやり方を作っていきます。
- 強化学習…AIが最適な行動を試行錯誤で見出していく学習手法です。例えばオセロという環境を与えて、良い手を打てたり勝利したら報酬を与え、悪い手や負けたらペナルティを与えるなどをします。AIは報酬を多くもらう行動を模索し学習していきます。
最近はGANという生成AIでは、2つのAI(偽物を作るAIと偽物かどうか見分けるAI)がお互いに競い合って学習し、偽物とばれないような偽物を生成できるAIができます。例えば「この世に存在しない人」や「この世に存在しない猫」の画像を生成することができます。
1-4:実習環境Google Colaboratoryの使い方
google colaboratoryは、gmailアカウントがあれば、無料で使用できます。
「google colaboratory」でググって、ログインすればOKです。
自分のPCに接続したカメラなどを使いたい!って以外は、これだけで事足ります。
AIもできますよ。GPUもすぐに使えます。
私は数年前からずっとメインで使っています。
第二章 | 統計を利用したAIを作ろう
AIは、「統計を利用したAI」と「ニューラルネットワークを利用したAI」があります。
scikit-learnというライブラリを使って、統計を利用したAIをプログラミングします。
2-1:統計AIによるAND回路の機械学習
「2入力のAND回路」について、どんな入力があればどんな出力が得られるかをAIに学習させます。
Linear-SVCという直線で分ける統計AIで作ってみましょう。
データの特性と数から適切な統計AIを提案する「チートシート」の見方も学びます。
2-1:統計AIによるOR回路(オリジナル)
「AND回路」のプログラムを改良して、「OR回路」の入出力を学習したAIを作ってください。
ちょっと変えるだけなので、自分がプログラムを理解しているか確認になります。
2-1:統計AIによるXOR回路(アレンジ)
「XOR回路」を3つの統計AIでやってみてください。
- LinearSVC…うまくいきません。直線で分離(線形分離)できないからです。
- KNeighbors…うまくいきます。
- SVM(サポートベクタマシン)…上手くいきます。高次元で線形分離。
この中でもSVMが特徴的です。LinearSVCでは線形分離できませんでしたが、カーネル変換によって高次元へ拡張することで線形分離に成功しています。
2-2:統計AIによるアヤメの分類
アヤメ(Iris)の品種分類するAIを、教師あり学習で作ります。
AIプログラムの学習で必ずやるやつですね。
プログラムの流れは下記です。
- インターネットからデータをダウンロードする。
- ダウンロードデータをCSVファイルとして保存する。
- CSVファイルを読み込む
- pandasというライブラリを使います。
- データと答えを配列で表現することを学びます。
- SVCという統計AIで学習する。
- 学習済みAIに予測させてみる。
この実習で、「AIの学習」の基本プログラムが組めるようになります。
別のAIも作れるようになります。
例えば、画像識別でもデータは配列として読み込みます。pandasやnumpyを使います。
統計AIならscikit-learnライブラリ、ニューラルネットワークならKerasライブラリを使います。
ここではまだ使いませんが、グラフ描画はmatplotlibを使うのが王道です。
2-5:AIの精度評価
クロスバリデーションとグリッドサーチによって、AIの性能評価と最適なパラメータを探します。
スキップしてもまぁいいです。
- クロスバリデーション…実際にAIの種類を切り替えて動作させてみて性能評価をします。
- グリッドサーチ…AIが学習する時の設定値の最適値を探索します。
第三章 | 画像識別AIを作ろう
3-2:顔検出AI(Haar-like特徴分類器)
写真データを読み込んで、顔を検出して、四角い枠で囲んだ写真を作るAIです。
ドラゴンボールのスカウターみたいですね。
顔検出はHaar-like特徴分類器を使用します。Haar-likeはニューラルネットワークではないです。顔の明暗パターンを検出する手法です。
※githubからのダウンロードをしてもうまく動かないので、Haar-likeはコピペで持って来ましょう。
テキストでは、顔検出した後に顔をモザイクに変換していますが、スキップでOK。画像の解像度を下げて、また上げているだけです。
3-3:手書き数字の識別(1次元)
手書き数字(MNIST)の判別をするAIを、教師あり学習で作ります。
アヤメの分類と同じで、AIプログラムの勉強で必ず取り扱うテーマです。
今後も手書き数字AIを何度も作ります。
- 3-3でSVMによるAI
- 5-4でMLPとCNNを使ったAI
第五章 | ニューラルネットワークによるAIを作ろう
5-1:ニューラルネットワークの概要
以下の用語を知っておきましょう。
- 入力層、出力層、中間層(隠れ層)
- 発火、活性化関数(ReLU、tanh、sigmoid)
- 誤差逆伝播法(バックプロパゲーション)、重み
5-4:1次元ニューラルネットワークMLP
手書き数字(MNIST)の判別をするAIを、ニューラルネットワークを使って教師あり学習で作ります。
MLP(多層パーセプトロン)は、典型的なニューラルネットワークです。MNISTの手書き数字は、白黒の画像データで、二次元配列です。
プログラムの流れは以下の通り。
- MNISTのデータを読み込む。
- 訓練用データ、訓練用データの答え、検証用データ、検証用データの答えの配列に格納する。
- 訓練用データ、検証用データを一次元配列に変換する。
- 手書き数字の画像データは二次元配列ですが、MLPが一次元なので変換する必要があります。
- 訓練用データの答え、検証用データの答えをone-hot-vectorにする。
- ニューラルネットワークの出力層に合わせています。
- ニューラルネットワーク(MLP)を作る
- 入力層(ニューロン512個)、中間層(512層)、出力層(10個)の三層構造です。
- 教師あり学習を実行
- 正解率とLOSS関数を描画
正解率とLOSS関数を描画するので、過学習についても学習できます。
5-4:2次元畳み込みニューラルネットワーク, CNN
手書き数字(MNIST)の判別をするAIを、二次元畳み込みニューラルネットワーク(CNN)を使って教師あり学習で作ります。
MNISTの手書き数字は、白黒の画像データで、二次元配列です。
5-3のMLPは一次元なので、写真をシュレッダーにかけて1つにつなげたようなものです。横の関係は捉えていますが、縦の関係は捉えていません。
一方、CNNは畳み込みによって、二次元的特徴を捉えては圧縮していくようなAIです。
プログラムの流れは、MLPとまったく同じです。
カリキュラムから省略した内容について
今回は、ニューラルネットワークで画像識別AIを作れるようになることを最優先としました。
今まで提示したカリキュラムで充分なため、強いてやるなら。
- 2-3:ワインの評価…データ偏りはメインテーマではないため
- 3-1:OpenCV…画像データの取り扱い基礎のため
- 3-4:郵便番号読み取り…赤枠を抽出しているだけのため
- 3-5:動体検知…画像の差分計算をしているだけのため
省略した内容と理由です。
- 2-3:ワインの評価…データ偏りはメインテーマではないため
- 2-4:気象データ…直線補完しているだけのため
- 3-1:OpenCV…画像データの取り扱い基礎のため
- 3-4:郵便番号読み取り…赤枠を抽出しているだけのため
- 3-5:動体検知…画像の差分計算をしているだけのため
- 4章:自然言語処理…簡単な処理だけであり、外部APIを使ったシステム開発が主流のため
- 5-2:Tensorflow…テンソルを直接扱い難しいため。Kerasを用いるのが主流のため
- 5-3:アヤメの分類(ニューラルネットワーク)…手書き数字画像AIを優先したいため
- 5-5:CIFAR-10…手書き数字画像AIを優先したいため
- 5-6:カタカナ判別…手書き数字画像AIを優先したいため
- 6章:google colaboratoryでは、flaskやngrokを使用しないと実現できないため
2-3:ワインの評価
アヤメと同じで入力が数字の羅列なので面白くないと思ってスキップです。
データ数の偏りがあった場合の対応方法が学べます。
2-4:気象データの時系列推定
時系列も直線補完しているだけなので、面白くないと思ってスキップ。
グラフ描画ライブラリmatplotlibが体験できますが、他のところでできるのでスキップ。
3-1:OpenCVライブラリの基本
画像操作について学べますが、まだ必要ではないのでスキップ。
3-4:ハガキの郵便番号抽出(OCR)
ハガキの画像データから郵便番号を読み取ります。
郵便番号の赤枠を検出して、手書き数字を判別させます。
3-5:動体検知
動画を静止画に変換し、前の時間の画像との差分から、動く物体を検出するAIを作ります。
4章:自然言語処理
実習において多数の難点があるためにスキップしました。
- 日本語を取り扱うMeCabライブラリのインストールが特殊
- 学習用データをwikipediaから持ってくるデータが大きく、google colaboratoryを圧迫します
- ベクトル化や感情分析は、プログラムを書いている通りに打ち込んでいるだけで、自分で作っている感がしない
- 言語を数学的操作で取り扱っていますが、理解するには難しい
- さらに理解したとしても、自然言語AIをゼロから作ることはできません
自然言語処理AIは、大手IT企業が完成品を提供しています。
AI初学者が学んで身につくものでもないので、サービスを利用してシステムを作った方が良いです。
5-2:tensorflow
tensorflowはニューラルネットワークをガチで組む時に使うライブラリです。
tensorflowをKerasライブラリを使って簡単に呼び出して使います。行列計算を理解した上で使うのは難しいため、スキップしました。
5-3:アヤメの分類(ニューラルネットワーク)
5-4で手書き数字をニューラルネットワークで判別させるため、スキップしました。
手書き数字は5-5で畳み込みニューラルネットワークも使うため、手書き数字を優先しました。
また、アヤメの数値データを取り扱うだけで、見た目面白くないですから。
5-5:CIFAR-10画像データの判別
CIFAR-10という有名な写真データベースがあるため、それを使った画像判別AIです。
5-3や5-4との違いは、カラー画像になった程度なので、スキップしました。
5-6:手書きカタカナの判別
判別する種類が大きく増えた以外に違いがないため、スキップ。
6章:webアプリとして実装
開発したAIをwebアプリとして実装する方法が掲載されています。
webアプリはflaskで実現しています。
今後の応用課題で取り扱うので、今回はスキップしました。
google colaboratoryでは、flaskに加えてngrokで実現できます。
また、paiza-cloudを用いて、djangoでも実現できます。