knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

ディープラーニングで画像認識 実装(3)、keras で、CIFAR-10データの学習


index:

概要

前回は、自前で準備した画像の
keras で画像認識の学習、評価、を行いました。
mnist以外のデータで、CIFAR-10データ を試してみたいと思います

環境

keras : 2.1.3
tensorflow : 1.4
python : 3.5.2

画像データ

kerasの場合、cifar10関連の処理を読み込むと、
カンタンに、学習用データとしてロード可能でした。

下記の import
from keras.datasets import cifar10

50000 枚が学習用、残り 10000 枚が評価用
素数 32x32 で RGB


f:id:knaka0209:20181203163604p:plain

・画像が小さく、画素数が少ない為。
 種類によっては、人が見てもよく判別できない物もありそうです

・種類は、10種類で下記内容
airplane; 飛行機
automobile; 自動車
bird; 鳥
cat; 猫
deer; 鹿
dog; 犬
frog; 蛙
horse; 馬
ship; 船, 舟
truck; 大型トラック

コード

https://github.com/kuc-arc-f/img_CIFAR

・今回は、開発PCで処理時間が長くなりそうで、
 google colabで、学習処理を行いました。

train_colab.py

・ データのロード

if __name__ == '__main__':
    #cifar10をダウンロード
    (x_train,y_train),(x_test,y_test)=cifar10.load_data()
    #
    print(x_train.shape, y_train.shape )
    print(x_test.shape  , y_test.shape )
    #画像を0-1の範囲で正規化
    x_train=x_train.astype('float32')/255.0
    x_test=x_test.astype('float32')/255.0

    #正解ラベルをOne-Hot表現に変換
    y_train=np_utils.to_categorical(y_train,10)
    y_test=np_utils.to_categorical(y_test,10)

・学習の処理

batch_size=32
epoch_num=10
#fit
history=model.fit(x_train,y_train
    ,batch_size=batch_size
    ,nb_epoch=epoch_num
    ,verbose=1,validation_split=0.1)

・ 実行ログ

Using TensorFlow backend.
((50000, 32, 32, 3), (50000, 1))
((10000, 32, 32, 3), (10000, 1))
/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:62: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
Train on 45000 samples, validate on 5000 samples
Epoch 1/10
45000/45000 [==============================] - 26s 578us/step - loss: 1.4947 - acc: 0.4553 - val_loss: 1.0340 - val_acc: 0.6320
Epoch 2/10
45000/45000 [==============================] - 22s 490us/step - loss: 1.0413 - acc: 0.6291 - val_loss: 0.8798 - val_acc: 0.6878
Epoch 3/10
45000/45000 [==============================] - 22s 495us/step - loss: 0.8964 - acc: 0.6855 - val_loss: 0.7888 - val_acc: 0.7224
Epoch 4/10
45000/45000 [==============================] - 22s 492us/step - loss: 0.8000 - acc: 0.7178 - val_loss: 0.7154 - val_acc: 0.7528
Epoch 5/10
45000/45000 [==============================] - 22s 489us/step - loss: 0.7319 - acc: 0.7452 - val_loss: 0.6705 - val_acc: 0.7704
Epoch 6/10
45000/45000 [==============================] - 22s 494us/step - loss: 0.6809 - acc: 0.7605 - val_loss: 0.6391 - val_acc: 0.7810
Epoch 7/10
45000/45000 [==============================] - 22s 490us/step - loss: 0.6376 - acc: 0.7781 - val_loss: 0.6564 - val_acc: 0.7762
Epoch 8/10
45000/45000 [==============================] - 22s 490us/step - loss: 0.6069 - acc: 0.7881 - val_loss: 0.6671 - val_acc: 0.7802
Epoch 9/10
45000/45000 [==============================] - 22s 496us/step - loss: 0.5759 - acc: 0.7948 - val_loss: 0.6474 - val_acc: 0.7846
Epoch 10/10
45000/45000 [==============================] - 22s 489us/step - loss: 0.5380 - acc: 0.8104 - val_loss: 0.6407 - val_acc: 0.7904
('Test loss:', 0.6536725306987763)
('Test acc:', 0.7773)


評価の、正解率は、 約77%で、いまいちな結果に。
エポック数は、10で少なめです。(GPUでも、数分かかりましたが。)

精度をあげるには、エポック数を増やしたり、
他の、パラメータ変更の必用がありそうですが
試行錯誤したいと思います。

・保存済みの学習ファイル、モデルのロードと、
 評価の処理
predict.py
 => 学習時に、保存したファイルをロード、その後に、評価

    model_file = "cifar10_cnn.json"
    with open(model_file, 'r') as fp:
        model = model_from_json(fp.read())
    model.load_weights("cifar10_cnn.h5")
    model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
#    model.summary()

    # モデルの評価
    loss, acc = model.evaluate(x_test, y_test, verbose=0)
    print('Test loss:', loss)
    print('Test acc:', acc)

関連

KerasでCIFAR-10の一般物体認識
http://aidiary.hatenablog.com/entry/20161127/1480240182

http://kikei.github.io/ai/2018/03/25/cifer10-cnn1.html

cifar10とKerasを使ってCNN(Convolutional Neural Network)を実装してみる
https://qiita.com/God_KonaBanana/items/10fa8bb58cdd1dbd2e59