この記事では、AIを作ってみよう:画像分類CNN(1/3) に続き、AIを実際に作っていきます。
プログラムのコピペ
それでは、さっそくAIを作ってしまいましょう。説明は後回し、コピペしてしまってください。
下のプログラムをコピーして、自分のPCのデスクトップへファイルとして保存してください。Pythonプログラムは通常 .py という拡張子を付けます。
コピペについてもう少し詳しい手順はこちら。
- 下のプログラム(データ)をマウスでなぞって全部選択します。
- 右クリック→コピーを実行します。
- メモ帳を開いて、右クリック→ペーストを実行します。
- メモ帳のファイル→保存を実行します。
- 場所はデスクトップとし、ファイル名に一番上に書かれた名前(cnn_cifer.py)を書いて保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import os from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPool2D from tensorflow.keras.optimizers import Adam from tensorflow.keras.layers import InputLayer, Dense, Activation, Dropout, Flatten from tensorflow.keras.utils import plot_model, to_categorical from keras.callbacks import TensorBoard from keras.datasets import cifar10 from numpy import argmax EPOCHS = 10 BATCH_SIZE = 128 CIFER10_CLASSES = 10 LABEL_NAMES = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] MODELFILE = 'model_cnn_cifer.h5' PREDICT_NUM = 5 (images_train, labels_train),(images_test, labels_test) = cifar10.load_data() images_train = images_train.astype('float32') images_test = images_test.astype('float32') images_train /= 255.0 images_test /= 255.0 # one-hot labels_train = to_categorical(labels_train, CIFER10_CLASSES) labels_test = to_categorical(labels_test, CIFER10_CLASSES) # create model model = Sequential() model.add(InputLayer(input_shape=(32,32,3))) model.add(Conv2D(32,3)) model.add(Activation('relu')) model.add(Conv2D(32,3)) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Conv2D(64,3)) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Flatten()) model.add(Dense(1024)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(CIFER10_CLASSES, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"]) model.summary() # train if not os.path.exists(MODELFILE): history = model.fit(images_train, labels_train, batch_size=BATCH_SIZE, epochs=EPOCHS, verbose=1, validation_split=0.1) print('Train done.') model.save_weights(MODELFILE) print('Train saved.') else: # load model model.load_weights(MODELFILE) print('Train loaded.') # predict predicted = model.predict(images_test) for n in range(PREDICT_NUM): print('predict = ', LABEL_NAMES[argmax(predicted[n])]) print('label = ', LABEL_NAMES[argmax(labels_test[n])]) print('') |
保存できたでしょうか。
プログラムの詳しい解説は次の記事に書きます。できるだけ簡単な解説にしましたので、後で初心者の人も見てみてください。
実行
プログラムが保存できたら、下記のように実行します。
- コマンド入力ウィンドウを開きます。
Windowsの場合:スタートボタンを押す → メニューが出たらそのまま「cmd」と打ち「Enter」。
Macintoshの場合:「ターミナル」を実行します。 - 3ファイルを保存した場所に移動します。デスクトップであれば
Win,Macどちらも「cd desktop」と打ち「Enter」です。 - AIの学習を実行します。
「python cnn_cifer.py」と打ち「Enter」。 - CIFERデータのダウンロードが少し時間をとると思います。その後学習が始まりこれも30分程度かかります。終わると学習済みモデルファイル「model_cnn_cifer.h5」が保存されます。これで何度も学習する必要がなくなります。
- 最後にテスト画像を予測した結果が出ます。
画像は見えませんが、ランダムに選ばれた画像を読み込み予測、を5回繰り返します。
predict = ... 予測した物体名です。
label = ... こちらが正解です。上と合っていれば正しく予測したことになります。
いかがでしょうか。
正解率は高いのではないでしょうか。6万枚もの画像を学習しているので精度はいいはずですね。
カラー画像なので白黒画像よりデータ量が多いのですが、これはCNNモデルの畳み込みという処理があるからこそ学習ができています。
しかし学習時間が長いですね。実用的なAIを作るには、さらに大きな画像と複雑なモデルを使いますので、数時間~数日の学習時間が必要になります。
この学習時間はGPUという処理装置を使うことで格段に速くなります。パソコンに追加するのは難易度が高いですが、AWSのようなクラウドを利用することで必要な時だけ借りるといったことができます。
また時間の制限はありますが、無料でGPUが使えるサービスもあります。早く処理したい場合はこちらを参考にしてください。 -> 無料でGPUを使おう:Google Colaboratory
次の記事では、プログラムを簡単に解説します。