葉物野菜を見極めたい!by keras

19
Karabiner. inc 葉葉葉葉 葉葉葉葉葉By Keras

Upload: yuji-kawakami

Post on 08-Feb-2017

216 views

Category:

Science


7 download

TRANSCRIPT

Page 1: 葉物野菜を見極めたい!by Keras

Karabiner.inc

葉物野菜見極めたい!

By Keras

Page 2: 葉物野菜を見極めたい!by Keras

Karabiner.inc

今日の内容は単純な画像分類です!

詳しい方には退屈かも・・

Page 3: 葉物野菜を見極めたい!by Keras

Karabiner.inc

画像分類について

• 画像から特徴を抽出し、どんな画像か判断すること

入力データ

機械学習 トナカイっぽいけど犬!

Page 4: 葉物野菜を見極めたい!by Keras

Karabiner.inc

Kerasって?

Page 5: 葉物野菜を見極めたい!by Keras

Karabiner.inc

KerasTesorFlowと Theanoのための深層学習ライブラリー 

TesorFlow( or Theano)の機能を使いながら、直感的にニューラルネットワークの構築ができる!今回バックグランドに TensorFlowを使いました。

https://keras.io/ja/

Page 6: 葉物野菜を見極めたい!by Keras

Karabiner.inc

TensorFlow• Google社が提供する機械学習ライブラリー

https://www.tensorflow.org/

Page 7: 葉物野菜を見極めたい!by Keras

Karabiner.inc

Kerasで簡単にできること① ニューラルネットワークのモデル構築 &学習② 学習済みモデルを使う③ Fine-tuningを行える④ 実装ラクチンな便利機能( callback)

Page 8: 葉物野菜を見極めたい!by Keras

Karabiner.inc

from keras.models import Sequentialfrom keras.layers import Dense, Activationmodel = Sequential()model.add(Dense(output_dim=3, input_dim=4)) model.add(Activation("relu")) model.add(Dense(output_dim=3)) model.add(Activation("softmax"))

Python

①ニューラルネットワークモデルの構築

例)全結合層のニューラルネットワークモデル4次元の入力値を3次元出力(活性化関数:ReLu)3次元の入力値を3次元出力(活性化関数:softmax)

最初に入力サイズを入れたら後は不要

川上祐司
Page 9: 葉物野菜を見極めたい!by Keras

Karabiner.inc

# 学習の仕方を指定(単純バージョン)model.compile(loss='mean_squared_error', optimizer='sgd')

# 学習の仕方を指定(詳細バージョン)sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='mean_squared_error', optimizer=sgd)

# 学習の開始model.fit(data, labels, nb_epoch=10, batch_size=32)

Python

①ニューラルネットワークモデルの学習

例)学習方法を SGDに指定する場合

【 SGDのパラメータ】• lr: float >= 0. 学習率.• momentum: float >= 0. モーメンタム.• decay: float >= 0. 各更新の学習率減衰.• nesterov: boolean. Nesterov momentumを適用するかどうか.

川上祐司
Page 10: 葉物野菜を見極めたい!by Keras

Karabiner.inc

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictionsfrom keras.preprocessing import imageimport numpy as np

model = VGG16(weights=‘imagenet’) # モデルの読み込み# 入力画像のロードimg = image.load_img("./sample.jpg", target_size=(224, 224)) x = image.img_to_array(img)  # 入力画像の行列化x = np.expand_dims(x, axis=0)  # 4次元テンソル# 予測preds = model.predict(preprocess_input(x))results = decode_predictions(preds, top=5)[0]# 結果出力for result in results: print(result)

Python

②学習済みモデルを使う例) ImageNetを学習した VGG16を使う場合

川上祐司
Page 11: 葉物野菜を見極めたい!by Keras

Karabiner.inc

③Fine-tuningを行える

畳み込みニューラルネットワークは出力層に近づけば近づくほど、より細かい特徴を捉えた状態のため、その部分ところだけ学習させ、上層部分は学習させない(フリーズ)画像引用: http://cs231n.stanford.edu/slides/winter1516_lecture11.pdf

川上祐司
Page 12: 葉物野菜を見極めたい!by Keras

Karabiner.inc

input_tensor = Input(shape=(img_size[0],img_size[1],3))vgg16_model = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)top_model = Sequential() top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))top_model.add(Dense(256, activation='relu'))top_model.add(Dropout(0.5))top_model.add(Dense(3, activation='sigmoid'))model = Model(input=vgg16_model.input, output=top_model(vgg16_model.output))# 学習させないところをフリーズさせるfor layer in model.layers[:15]: layer.trainable = False

Python

③Fine-tuningを行える例) ImageNetを学習した VGG16を使う場合

記述量少なめで Fine-tuningを試すことができる。参考: https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

川上祐司
Page 13: 葉物野菜を見極めたい!by Keras

Karabiner.inc

# callbackの定義cp_cb = ModelCheckpoint(filepath=‘filename.hdf5', monitor='val_loss', verbose=0, save_best_only=False, mode='auto') tb_cb = TensorBoard(log_dir='logs', histogram_freq=0, write_graph=True)

model.fit(X_train, Y_train, callbacks=[cp_cb, tb_cb])

Python

③実装ラクチンな便利機能例)チェックポイントと Tensorboardを使う場合

他にも Callbackに便利な機能あり。ドキュメント参照: https://keras.io/ja/callbacks/

川上祐司
Page 14: 葉物野菜を見極めたい!by Keras

Karabiner.inc

今回やってみたいこと→葉物野菜の分類

誰得?

Page 15: 葉物野菜を見極めたい!by Keras

Karabiner.inc

葉物野菜の分類

キャベツ レタスはくさい

はくさいはまだしも、キャベツとレタス間違う人はいるかもよ?→Kerasで画像分類モデルを作って解決!

Page 16: 葉物野菜を見極めたい!by Keras

Karabiner.inc

とりあえずやってみる

Jupyter Notebookで実践

Page 17: 葉物野菜を見極めたい!by Keras

Karabiner.inc

TensorFlow実装Python

name filter stride paddingoutput

map size function

data - - - 227×227×3 -conv1 11×11 4 - 55×55×96 ReLpool1 3×3 2 - 27×27×96

conv2 5×5 1 - 27×27×96 ReL

pool2 3×3 2 - 13×13×256

conv3 3×3 1 - 13×13×384 ReL

conv4 3×3 1 - 13×13×384 ReL

conv5 3×3 1 - 13×13×256 ReL

pool5 3×3 2 - 6×6×256

fc6 - - - 1×1×4096 ReL

fc7 - - - 1×1×4096 ReLfc8 - - - 1×1×1000 softmax

def inference(self, images_placeholder, keep_prob): # 第 1畳み込みレイヤー with tf.name_scope('conv1') as scope: W_conv1 = self.weight_variable([11, 11, 3, 96]) b_conv1 = self.bias_variable([96]) h_conv1 = tf.nn.relu(self.conv2d(images_placeholder, W_conv1, stride=4, padding='VALID') + b_conv1) # 第 1プーリング層 with tf.name_scope('pool1') as scope: h_pool1 = self.max_pool_2x2(h_conv1, ksize=3, stride=2, padding='VALID')

# 第 2畳み込みレイヤー with tf.name_scope('conv2') as scope: W_conv2 = self.weight_variable([5, 5, 96, 96]) b_conv2 = self.bias_variable([96]) h_conv2 = tf.nn.relu(self.conv2d(h_pool1, W_conv2, stride=1, padding='VALID') + b_conv2) # 第 2プーリング層 with tf.name_scope('pool2') as scope: h_pool2 = self.max_pool_2x2(h_conv2, ksize=3, stride=2, padding='VALID')

省略・・・    # 第 8全結合レイヤー with tf.name_scope('fc8') as scope: W_fc8 = self.weight_variable([1000, self.NUMBER_OF_CLASSES]) b_fc8 = self.bias_variable([self.NUMBER_OF_CLASSES]) y_conv = tf.matmul(h_fc7, W_fc8) + b_fc8 return y_conv

Page 18: 葉物野菜を見極めたい!by Keras

Karabiner.inc

Chainer実装class CNN(Chain): def __init__(self): self._train = True super(CNN,self).__init__( conv1=L.Convolution2D(3, 96, 11, stride=4), conv2=L.Convolution2D(96, 256, 5, stride=1), conv3=L.Convolution2D(256, 384, 3, stride=1), conv4=L.Convolution2D(384, 384, 3, stride=1), conv5=L.Convolution2D(384, 256, 3, stride=1), fc6=L.Linear(9216, 4096), fc7=L.Linear(4096, 4096), fc8=L.Linear(4096, 1000), )

def forward(self, x, train=True): conv1 = F.relu(self.conv1(x)) pool1 = F.max_pooling_2d(conv1, 3, stride=2) conv2 = F.relu(self.conv2(pool1)) pool2 = F.max_pooling_2d(conv2, 3, stride=2) conv3 = F.relu(self.conv3(pool2)) conv4 = F.relu(self.conv4(conv3)) conv5 = F.relu(self.conv5(conv4)) pool5 = F.max_pooling_2d(conv5, 3, stride=2) fc6 = F.relu(self.fc6(pool5)) fc7 = F.relu(self.fc7(fc6)) y = self.fc8(fc7) return y

Python

name filter stride paddingoutput

map size function

data - - - 227×227×3 -conv1 11×11 4 - 55×55×96 ReLpool1 3×3 2 - 27×27×96

conv2 5×5 1 - 27×27×96 ReL

pool2 3×3 2 - 13×13×256

conv3 3×3 1 - 13×13×384 ReL

conv4 3×3 1 - 13×13×384 ReL

conv5 3×3 1 - 13×13×256 ReL

pool5 3×3 2 - 6×6×256

fc6 - - - 1×1×4096 ReL

fc7 - - - 1×1×4096 ReLfc8 - - - 1×1×1000 softmax

Page 19: 葉物野菜を見極めたい!by Keras

Karabiner.inc

まとめ

• Kerasは直感的にかつシンプルにモデルの構築ができるため、プロトタイプの作成には便利!

• 学習済みのモデルを使用して、特徴抽出や Fine-tuningも楽々!