Published Date : 2019年11月14日12:59

Python Scriptと一緒に理解するCNN(Convolutional Neural Networks)の仕組み Dropout編
How CNN (Convolutional Neural Networks) Works with Python Scripts ~ Dropout ~


This blog has an English translation



画像認識シリーズ第10弾です。前回のブログ記事。

This is the 10th image recognition series. Last blog post.


前回はmodel_train関数内のMaxPooling2dの図による説明をおこないました。

In a previous my blog post, I explained MaxPooling2d, along with diagrams.


この手のものはやり尽くされていますが、ただ一から全部やってみたかった。それだけです。 つーことで今回はDropoutを解説していきたいと思いMASU。

This kind of thing is done by many people, but I just wanted to do it all from scratch. That's all. Anyway, I would like to explain "Dropout" this time.



目次

Table of Contents



概要
Overview


Dropoutの概念を理解するために、まず過学習が何なのかを簡単に説明します。

To understand the concept of Dropout, I'll first vriefly explain what over-fitting.



model.add(Dropout())の中身を図を使用して説明.

I would like to explain what's inside [model.add(Dropout())] along with diagrams.




過学習
Over-fitting



まず過学習ですが、一言で分かりやすくいうと、「学習した内容には上手に対応できるのに、未知の問題に対してはまったく対応できない」状態のことです。

First of all, it's over-fitting, but to put it simply, It's the state of "It can respond well to what it has learned, but It can't address the unknown at all."

物事を分かりやすくするためにこんな学習データがあるとします。

Let's say you have this learning data to make things easier to understand.


Responsive image

全て猫ですが、同じ画像です。

It's all cat's images, but it's the same images.

さて、モデルが学習を終えて、学習結果がでましたとさ。 「。。。。。おめでとう!100点満点大正解です!」

Now that the model has learned, the learning results are available. "......Congratulations! It got a perfect score of 100!!"

次に同じ猫ですが、この画像で学習モデルをテストしてみましょう。

Next, test the learning model with a image of the same "cat".


Responsive image

学習モデルはこう答えるでしょう「耳が立ってません、模様が違います、四つん這いではないです。」 猫の確率10%。これはきっと猫ではありません。

The learning model would say "The thing in this picture is has not ears, the pattern is different, not on all fours. The probability of a cat is 10%. This may not be a cat."

学習が終わった段階では学習率100%だったのに、いざテストをしてみたら猫である画像を猫と認識できなかった。 これが過学習です。

At the end of the model learning, the learning rate was 100%, but when It tested image recognition, it couldn't recognize an image of a cat as a cat. This is over-fitting.

この種類の過学習を防ぐためには、色々な特徴を持つ猫の画像を学習モデルに与える必要がありそうです。 そして、過学習を防ぐためには上記のような方法は勿論、様々な方法があります。それがDropoutです。 以上を踏まえた上でDropoutの役割をみてまSAW.

In order to prevent this kind of over-fitting. It is likely that images of cats with various characteristics should be given to the learning model. There are, of course, many other ways to prevent over-fittig. One way that is "Dropout", which I'm going to explain.




Pythonスクリプトと一緒に理解するDropout
Understanding Dropout with diagrams and Python



取り敢えず全体のコードは以下になります。

For now, the whole script is as follows.

Improved version of cifar10_cnn.py

imp_ver_cf10cnn.py
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
import numpy as np


labels = ["dogs", "cats", "monkeys", "birds", "fish", "lizards"]
total_num = len(labels)
image_size = 100

batch_size = 32
epochs = 100

def main():
  X_train, x_test, Y_train, y_test = np.load("data/augumented_images.npy")
  X_train = X_train.astype("float") / 256
  x_test = x_test.astype("float") / 256
  Y_train = np_utils.to_categorical(Y_train, total_num)
  y_test = np_utils.to_categorical(y_test, total_num)

  model = model_train(X_train, Y_train)
  model_eval(model, x_test, y_test)

def model_train(X, y):
  model = Sequential()
  model.add(Conv2D(32, (3, 3), padding='same',
                  input_shape=X.shape[1:]))
  model.add(Activation('relu'))
  model.add(Conv2D(32, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(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)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(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(total_num))
  model.add(Activation('softmax'))

  opt = keras.optimizers.adam()

  model.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])
  
  model.fit(X,y,batch_size=batch_size, epochs=epochs)

  model.save("data/creatures_cnn.h5")

  return model

def model_eval(model, X, y):
  scores = model.evaluate(X, y, verbose=1)
  print('Test Loss', scores[0])
  print('Test Accuracy', scores[1])

if __name__=="__main__":
  main()


前回のブログ記事では、それまで説明してきた関数を繋げて図で説明しました。

In previous my blog post, I combined the functions described so far and illustrated them with diagrams.

def model_train(X, y):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same',
                    input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

今回説明するのはこちら。 dropout()

This time, I'll show you how it works dropout function it's used Python.

model.add(Dropout(0.25))

ではPythonコードのDropoutが何を意味しているのか説明します。

Let's take a look at what Dropout means in Python code.

model.add(Dropout(0.25))

答えは単純で、このDropout(0.25)は「25%の入力値をランダムに遮断する。」です。 図にすると以下のようになりまつ。

This answer is simple, Dropout(0.25) is "Randomly shuts off 25% of the input value.". The diagram is shown below.


Responsive image

これまで説明してきた関数を繋げてみてみまSAW。

Let's put the functions we've discussed together.

model.add(Conv2D(32, (3, 3), padding='same', input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

Responsive image

ではDropoutが何故上手くいくのかを説明します。

Here's why Dropout works.


Responsive image

この2つの画像は何れも猫ですが、猫と関係の無い「カゴ」の特徴が強く出てます。

Both of these 2 images are cats, but they have strong characteristics of "basket" which has nothing to do with cats.

もしこの「かご」の特徴が最終的な「投票結果」に影響してしまったら?

What happens if this "basket" feature affects the final "results of the vote"??


Responsive image

このように偏った画像や、余計な情報が多い画像の選択が、「ノイズ」として結果に悪影響を及ぼすことがあります。

Choosing images that are biased or contain a lot of extra information can adversely affect results as "NOISE".

それを防ぐために、何度も「同じ情報」を違う視点(つまりある特徴を省いたり、追加したりする)で”見る”ことによって、 より”確からしい”情報に辿り着くことができる。

To prevent this from happening, learning model can repeatedly look at the "same information" from different perspectives (that is, omitting or adding certain features.) to get to more "reliable information".


Responsive image


Responsive image



残りのコードも同じ様に考えれば大丈夫です。

The rest of the code you could look the same.

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

それではこれまでのレイヤーの組み立て方を図にしてみます。

Let's take a look at how the layers that created by scripts has appeared so far have been assembled to using diagram.

def model_train(X, y):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same',
                    input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(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)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

Responsive image



残りの説明は次回に持ち越します。お次はFlatten()、Dense()、そしてActivation('softmax')の説明を予定してます。

I will carry over the rest of the explanation next time. Next comes about Flatten(), Dense(), and Activation('softmax').





See You Next Page!