38
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Colab+KerasでCNNを爆速構築

Last updated at Posted at 2018-12-10

はじめに

Google ColabとKerasを用いてCNNを爆速で学習させる方法を紹介する。

CNN(畳み込みニューラルネットワーク)は画像認識に強い。機械学習の世界では「うどんといえば香川」、「画像といえばCNN」です。

用いる画像データとしては企業のデータを使うわけにもいかないし、MNISTではつまらないと思うのでここではCIFAR-10を用いてやってみることにする。

CIFAR-10とは

約8000万枚の画像がある80 Million Tiny Imagesからサブセットとして約6万枚の画像を抽出してラベル付けしたデータセットで以下の特徴がある。

  • 全部で60000枚
  • 画像サイズは32ピクセルx32ピクセル
  • RGBの3チャンネルカラー画像
  • クラスラベルはairplane, automobile, bird, cat, deer, dog, frog, horse, ship, truckで10クラス
  • 50000枚(各クラス5000枚)の訓練画像と10000枚(各クラス1000枚)のテスト画像に分割されている

読み方は サイファーテン シィーファーテン (参考動画: https://www.youtube.com/watch?v=XDqziNMCqH8)

Google Colabとは

Googleが提供する数あるサービスの内、JupyterでGPUやTPUが無料で使えるサービスである。

GPUでやってみた体感としては自分のローカル環境(MacbookPro2017, 13inch, 3.3GHz Intel Core i5, メモリ16GB)と比べて約100倍近い速さで学習できる。

作ったNotebookはGoogle Driveに保存される。(Google Colab URL: https://colab.research.google.com/)

Kerasとは

TensorFlowをラップして使いやすくした認識でいいと思う。
バックグラウンドではTensorFlowが動いている。

CIFAR-10を見てみる

まず、CIFAR-10にどんな画像が入っているか見てみよう。
CIFAR-10データセットをインポートする。

from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

トレーニングデータの最初の30個を描写してみる。

import matplotlib.pyplot as plt

# ラベルのリストを定義
cifar10_labels = [
    'airplane',
    'automobile',
    'bird',
    'cat',
    'deer',
    'dog',
    'frog',
    'horse',
    'ship',
    'truck'
]

# 描写
for index, img in enumerate(X_train[:30]):
    plt.subplot(3, 10, index + 1)
    plt.imshow(img)
    plt.axis('off')
    plt.title(cifar10_labels[y_train[index][0]])
    plt.tight_layout()

plt.show()

cifar10_sample.png

様々な画像データで構成されていることがわかった。
次にデータの前処理を行う。

データ前処理

前処理として、特徴量の正規化とクラスラベルのone-hot-vector化を行う。

特徴量の正規化

以下のコードで正規化を行う。(RGBは0〜255の範囲のため)

# 特徴量の正規化
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255.
X_test /= 255.

クラスラベルのone-hot-vector化

クラスラベルは順序を持たないので、one-hot-vector化しておく。

from keras.utils import np_utils

# クラスラベルのone-hot-vector化
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)

最後にCNNモデルを構築していく。

CNNの構築

レイヤー構造を、(畳み込み層×2 + Maxプーリング層 + ドロップアウト)×2 + 全結合層として以下のように構築していく。

# 必要なものをimport
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.optimizers import Adam

from keras.layers.core import Dense, Activation, Dropout, Flatten
from tensorflow.python.keras.callbacks import TensorBoard

# モデルを定義
model=Sequential()

# 層を追加していく
model.add(Conv2D(32,(3,3),padding='same',input_shape=(32,32,3)))
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten()) # 平坦化
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10,activation='softmax'))

# コンパイル
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

# TensorBoardで結果を見るためのインスタンス化
tsb = TensorBoard(log_dir='./logs')

# 学習
history = model.fit(
    X_train,
    y_train,
    batch_size=32,
    epochs=20,
    validation_split=0.2,
    callbacks=[tsb]
)

TensorBoardで学習結果を確認してみる

ちゃんと学習できているかTensorBoardを用いて確認してみます。

$ tensorboard --logdir=./logs/

で、TensorBoardを起動しlocalhost:6006にアクセス。

スクリーンショット 2018-12-10 23.20.51.png

ちゃんと学習できているようで安心。

ここからやることとしては、さらに精度を向上させるためパラメータやレイヤー構成を変えてみてチューニングしていく作業に入っていく。

おわりに

今回はGoogle Colabとkerasを用いてGPUを使いCNNを構築してみました。

最後まで読んでいただきありがとうございます!

38
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?