29 Apr 2017, 22:10

3 つの戦略で Overfitting を撃退!Tensorflow v1.1 を使って CNN で MNIST に挑んだ

はじめに

fast.ai の Practical Deep Learning for Coders を受けてます。week3 のテーマは overfitting. いかにして、overfitting を防いで精度を向上させるかという話。 理論のあと実際の MNIST のデータを使って精度を向上させるレクチャーがあった。

先週、ちょうど Kaggle の手書き数字認識に挑戦していたので、 今回習ったことを Kaggle に適用してみて、精度が実際どうなるか見てみました。

また、先週 tensorflow 1.1 がリリースされて、 TensorFlow から Keras の機能が使えるようになったので、 それも試してみました。

結論から書くと、1050 位から 342 位への大躍進!上位 20%に近づきました。

Overfitting を防ぐ戦略

Overfitting とは

まずは、Overfitting についておさらい。過学習ともいう。

Overfitting とは、訓練データの精度はいいのだけれども未知のデータの精度が悪いこと。 モデルが汎化されていない状態を指す。

どうやって、確認するかというと、訓練データの他に Validation データを用意して Training のときに、訓練データと validation データの精度を出す。 もし、訓練データの精度がいいけれども、validation データの精度が悪いと Overfitting が起こっている可能性が高い。

Overfitting

OverFitting を防ぐ戦略

講義の中では、以下のステップで対策することが示される。

  1. Add more data
  2. Use data augmentation
  3. Use architectures that generalize well
  4. Add regularization
  5. Reduce architecture complexity.

とくに、2 と 4 に関して、実践的な手法である

  • Dropout
  • Data Augmentation,
  • Bach Normalization

が示される。

Dropout

階層の深いニューラルネットワークを精度よく最適化するために Hinton 教授 たちによって提案された手法。

その手法とは、ニューロンをランダムに消去しながら学習する手法。 訓練時に隠れ層のニューロンをランダムに選び出し、 その選び出したニューロンを消去する。

こんな手法で過学習を防げるのかとはじめは驚いたものの、 確かにこれで精度が出るのだ。

今回は、以下のクラスを利用した。

Data Augmentation

画像データを妥当な修正を加えることで、追加合成データを作成すること。 たとえば、ひっくり返したり、回したり、ズームしたり、クリッピングしたり、 色を変更したりなどなど。

参考:

Tensorflow(keras)には、ImageDataGenerator というクラスがあり、これを利用する。

Bach Normalization

Bach Normalization とは、 各層でのアクティベーションの分布を適度な広がりを持つように調整すること。

前処理として、データを加工することはよくやることだけれども、 アクティベーションされた分布に処理を加えることが特徴。これによって、

  • 学習を速く進行させることができる(学習係数を大きくすることができる)
  • 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくてよい)
  • 学習を抑制する(Dropout などの必要性を減らす)

などの利点がある。

Tensorflow(keras) では、以下のクラスがある。

MNIST に挑戦

今回は、以下の Keras(backend は Theano)を Tensorflow v1.1 にポーティングした。

今回作成した、自分の Jupyter Notebook は以下。

以下、コードの抜粋を以下に示す。

まずは、import。tensorflow.contrib.keras.python.keras と書く。 この書き方がわからずハマった。

import tensorflow as tf
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Flatten, Dense, Dropout, Lambda, Conv2D, BatchNormalization, MaxPool2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator

ネットワークを構成。ちょくちょく BatchNormalization の層が入っているところがポイント。 Dropout 層も出口のところに設けてある。

def get_model_bn_do():
    model = Sequential()
    model.add(Lambda(norm_input, input_shape=(28,28,1)))
    model.add(Conv2D(filters=32,kernel_size=(3,3), activation='relu'))
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=32,kernel_size=(3,3), activation='relu'))
    model.add(MaxPool2D())
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=64,kernel_size=(3,3), activation='relu'))
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=64,kernel_size=(3,3), activation='relu'))
    model.add(MaxPool2D())
    model.add(Flatten())
    model.add(BatchNormalization())
    model.add(Dense(512, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))
    model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    return model

以下のようなネットワークができあがる。

Layer (type)                 Output Shape              Param #   
=================================================================
lambda_1 (Lambda)            (None, 28, 28, 1)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
batch_normalization_1 (Batch (None, 26, 26, 32)        104       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 24, 24, 32)        9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 32)        0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 12, 12, 32)        48        
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 10, 10, 64)        18496     
_________________________________________________________________
batch_normalization_3 (Batch (None, 10, 10, 64)        40        
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 8, 8, 64)          36928     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 64)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1024)              0         
_________________________________________________________________
batch_normalization_4 (Batch (None, 1024)              4096      
_________________________________________________________________
dense_1 (Dense)              (None, 512)               524800    
_________________________________________________________________
batch_normalization_5 (Batch (None, 512)               2048      
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 601,258.0
Trainable params: 598,090.0
Non-trainable params: 3,168.0

data augmentation を ImageDataGenerator で実施する。 パラメータでいろいろ変更できるようになっている。

gen = ImageDataGenerator(rotation_range=8, width_shift_range=0.08, shear_range=0.3,
                            height_shift_range=0.08, zoom_range=0.08)
batches = gen.flow(features, labels, batch_size=batch_size)
test_batches = gen.flow(valid_features, valid_labels, batch_size=batch_size)

fit_generator で学習。ちなみに、train_on_batch 関数だと、メモリ枯渇を起こした。

model.fit_generator(batches, batches.n//batch_size, epochs=1,
                    validation_data=test_batches, validation_steps=test_batches.n//batch_size)

predict_classes 関数でテストデータを予測。

classes = model.predict_classes(test_features)

27 Apr 2017, 14:14

Udacity で Deep Learning Nanodegree Foundation を受講してる

Udacity で Deep Learning Nanodegree Foundation を受講してます。 -> 追記: 受講が終わりました

MOOC を受けるのは、31 回目だけれども、 Udacity Nanodegree は今回が始めて。なにしろ、学費が 599 ドル(= 6.5 万)というお値段。

13 が終わったので、少しずつまとめていこうと思う。 未完成だけれども、続きは、毎週更新する予定です。

概要

Youtube Star の Siraj Raval

日本では知られていない、Deep Learning 界の Youtube Star, Siraj Raval が Deep Learning の手法を教えてくれる。

動画がとにかくおもしろい。まずは動画紹介。

授業の流れ

授業は、Siraj さんと mat さんの動画を元に進められる。

  • Siraj’s introductory video & One hour coding session
  • Additional lesson(s) from Mat & other Udacity experts

毎週 mat 先生の動画が公開されて、それを見てミニクイズやミニプロジェクトを解いていく。 それとは別に、siraj さんのライブコーディングセッションが youtube で放送される。

Projects

毎月一回、Project が assignment として課される。

  • Project 1 Your First Neural Network
  • Project 2 Image Classification
  • Project 3 Generate TV Scripts
  • Project 4 Translate a Language
  • Project 5 Generate Faces

どんな課題か見てみたい人は、github の問題用リポジトリを参照するのがよい。

project の解答 を提出すると、Udacity のレビューアーにレビューされる (ここが驚いた。高い学費を払っているだけあって、手厚いサポート) 解答内容が不十分だったり、間違っている場合は、リジェクトされて再提出が求められる。

わからない場合は、フォーラムを見たり、slack で議論したりする。 slack には、なんと#Japan のチャンネルがあり、日本語 OK.

受講者人数

1 月に初めのコースが始まり、3 月に 2 回目のコースが始まった。自分は 3 月 から参加。

登録者数は 1 月が 5000 人くらい?3 月が 1500 人くらい(slack の人数より)

日本人は、50 人くらい。

Syllabus

1 月と 3 月では、シラバスの内容が少し違う。今後も feedback を元に変わる可能性あり。

Week 1: Introduction to Deep Learning
Week 2: Model Evaluation and Validation
Week 3: Graph computations
Week 4: Intro to TensorFlow
Week 5: Deep Neural Networks
Week 6: Convolutional Networks
Week 7: Recurrent Neural Networks
Week 8: Word Embeddings
Week 9: Using TensorBoard
Week 10: Text Generation
Week 11: Sequence to Sequence Generation
Week 12: Transfer Learning
Week 13: Reinforcement Learning
Week 14: Autoencoders
Week 15: Generative Adversarial Networks (GAN)
Week 16: Image Generation

扱う手法は、NN, CNN, RNN, GAN と,Deep Learning の主要な手法をカバーしている。

扱うトピックは、 感情判定、画像識別、株価の予測、テキスト生成、 Word2Vec, 自然言語処理、音楽生成、チャットボット、 ゲームプレイ、画像生成 …

難易度と学習時間

シラバスによると、8-12 時間の勉強時間の確保が必要とのこと。 自分の場合は、だいたい 10 時間くらい勉強すれば消化できた。

難易度なのだけれども、今のところは難しくなく、ついていくことが出来る。 複雑な数式もでてこないので、高校生だって受けることが出来ると思う。

CNN は、難しい部分は tensorflow に任せてしまい、 tensorflow の使い方を学ぶ印象を受けた。

Siraj’s Live Coding Session

Siraj さんのライブコーディングでは以下のトピックがあつかわれる。

  • Week 1 (329): Linear Regression
  • Week 2 (45): Tensorboard
  • Week 3 (412): Reinforcement Learning with Games
  • Week 4 (419): Image Compression
  • Week 5 (426): Visualizing Networks (GAN)
  • Week 6 (53): Generative Models (GAN)
  • Week 7 (510): Classification
  • Week 8 (517): Dimensionality Reduction
  • Week 9 (524): Data Visualization
  • Week 10 (531): Math terminology
  • Week 11 (67): Cloud Computing overview (AWS, google cloud, etc.)
  • Week 12 (614): Anomaly Detection
  • Week 13 (621): Stock Prediction
  • Week 14 (628): Video Generation
  • Week 15 (75): GANs for audio generation
  • Week 16 (712): GANs for video generation
  • Week 17 (719) : Probabilistic Programming

学習メモ

以下は、各回の概要をメモしたもの。参考までに。。。

  1. Neural Network =================

week1: Introduction to Deep Learning

はじめに anaconda や 線形代数の基礎と numpy、 Jupyter Notebook の使い方などが紹介される。

そのあと、ニューラルネットワーク。 パーセプトロンからはじまり、Gradient Descent, Backpropagation が説明される。

input と output レイヤだけの初歩から説明されて、 次に hidden レイヤが説明されるので、とてもわかりやすい。

Project1: Your First Neural Network

ニューラルネットワークを組んで、自転車の貸し出し台数を予測する。 numpy だけでニューラルネットを組む。

自分はゼロから作る Deep Learning を途中まで読んだのだけれども、 このプロジェクトのやろうとしていることは、この本と同じ。 よい復習にもなったし、逆にこの本を読んでいたから理解が助かった。

Project1 ができなかったら、refund してこの講座を諦めようと思っていた。 なんとか提出できて、リジェクトもされなかったので、このまま受けることにした。

(Machine Learning Nanodegree を受けている Studyplus の友達は、 Project の出来が悪いとリジェクトされて再提出を求められるといっていた)

  1. Convolutional Neural Network ===============================

week2: Graph Computations

TensorFlow の基礎となる Graph Computations を学び、 MiniFlow という Tensorflow のミニバージョンを自作する。 といっても、これは week1 の復習 Quiz のようなもの。 また、手取り足取りの説明なので、すごく簡単。

またこの週では、データの前処理, モデルの評価や Validation にも触れられる。

モデルの評価は、coursera ML でやったものと同じ。

week3: Sentiment Analysis

センチメント分析がテーマ。

Andrew Trask さんが登場し、ニューラルネットワークを利用して、センチメント分析を実施する。 この講義の目的は、いかにしてニューラルネットワークの精度を向上させるかと学習を高速化させるか。

はじめは、精度が 65%くらいしかないのだが、 あの手この手の工夫をすることで 95%以上にまでもっていく。 さらには学習の速度もはじめにくらべると爆速にもっていく。

チューニングでこれほど差がでるものかと驚いた。

また、この週では、TFLearn というライブラリが紹介される。 これをつかうと、ニューラルネットがシンプルに数行で構築できる。 バックプロパゲーションとか頑張ったのはなんだったんだよ!と思うほど、驚く。

week4: Intro to TensorFlow

TensorFlow の登場。やっと 4 週目にしてでてきた感がある。

TensorFlow の基礎文法をまなび、基本的な 2 層のニューラルネットを組む。 また、ロジスティック回帰について学ぶ。

この週は、今までで一番楽な週だった。

week5: Deep Neural Networks

Google AWS で GPU をつかう方法が示される。 この DLND をとっている生徒は、100 ドルの無料クーボンがもらえるのだ。 これで AWS で GPU を使って計算を高速化できる。また、FloydHub も紹介される。

といっても自分は別の用途で AWS をガンガン使ってしまったのでピンチ。

TenosorFlow で前回は、2 層のニューラルネットワークだったが、 それを 3 層のニューラルネットワークにする。

と同時に、オーバーフィッティングを防ぐ方法として、 正則化と Dropout の手法が紹介される。

week6: Convolutional Networks

Convolution Networks の説明。 畳み込みとプーリングの説明があったあと、 tensorflow でどう実装していくかが解説される

重みやバイアスの初期化方法についても言及される。

Project2 Image Classification

CIFAR10 の画像データを CNN で分類するというプロジェクト。

ネットワークは、week6 で与えられたコードを少し工夫すれば構築できるけれども、 ネットワークのパラメータを調整して精度をだすことに苦戦した。

最終的には、67% の精度がでた。合格ラインは 50% と低めなので、いい感じ。

  1. Recurrent Neural Network ===========================

week7: Recurrent Neural Network

Recurrent Neural Network の説明。 といっても、簡素な説明なので、ほとんどわからなかった! 参考リンクを示されてここ読んでおいてね、ということだった。

実践的な演習として、アンナ・カレーニナの小説を元に、文章を生成するものが 与えられる。TensorFlow を使って、LSTM を実装するのだが、 これが答えも一緒に示されるので、結構簡単に実装出来てしまう。

理論はまったくわからないが、実装出来てしまうので、これでいいのか??

別枠として、LSTM で株の予想をしようという Siraj さんのビデオがある。

week8: Word Embeddings

Word Embeddings がテーマということで、Skip-gram モデルの word2vec を自前で実装するというもの。

例のごとく、サンプルコードが与えられて、穴埋めしていく形で進められる。

論文やブログのリンクがはられて、読んでおいてねとのこと。外部リンクを読むことが前提みたい。

この日本語記事がイラスト付きでとてもわかりやすかった。大感謝!!

text8 という英語のテキストデータを学習する。 ニューラルネットの仕組みは簡単だったが、前処理が難しくて理解度がうすい。

  • SubSampling
  • Negative sampling

この Word2Vec を利用して、自分の Twitter アカウントを分析してみた。

Siraj さんのビデオは Style Transfer について。

これは、CADL で以前勉強していたので、深くは調べなかった。

FloydHub 創立者たちとのインタビュー動画もボーナスとしてあった。なんか、Udacity は FloydHub 推奨しているみたい。

week9: Using TensorBoard

TensorBorad を使う方法について。

TensorBoard は精度や Loss を可視化するのに便利だと思っていた。 今まで、闇雲にハイパーパラメータを探していたのだけれども、TensorBoard を使って探す方法を学んだ。

Keras でも TensorBoard は使えるみたい。

Siraj さんの動画は、Music Generation(音楽生成)。とても興味があるトピック。待ってました\^-\^

LSTM で音楽を学習させてみようということなのだけれども、 動画はよくわからなかった。しかし、ここで諦めてはいけない。 Siraj さんの動画は大抵数行のコードと大量の参照リンクなので自学自習が必要なのだ。

いろいろディープラーニングと音楽生成の関係を調べていくうちに、 char-rnn で音楽生成をしている事例がたくさん見つかった。なので、私もやってみた!

week10: Text Generation

テキスト生成。week8 では、文字ベースの文章生成をあつかったけれども、 ここでは単語ベースの文章生成。

この週では、Project3 が課せられたので、まずは準備として、 RNN による センチメント分析をおこなった。 複数の input に対して一つの output を出力する RNN.

センチメント分析は week3 で扱ったのだが、それを RNN という別の角度から再実施する。

Project3 Generate TV Scripts

有名テレビアニメ、ザ・シンプソンズのテレビスクリプトを学習し、 word ベースの RNN を使ってテレビスクリプトを生成しようという Project.

いつもながら、プロジェクトは演習のコピペでできてしまうので、簡単。

week11: Sequence to Sequence/Chatbot QA System with voice

複数の Input に対して、複数の Output を返す RNN のアーキテクチャの紹介。

この週は、わけがわからなかったな。はじめての挫折。

week12: Transfer Learning

転移学習。このトピックは大事。Kaggle などのデータ分析コンペで有用な手法。

この週の課題は、外部のリポジトリを使って tensorflow で vgg16 を使って、花の分類をする。

私は、fast.ai でこの転移学習についてたくさん学んでいたので、この週では学ぶことは少なかった。 逆に言えば、fast.ai の lesson1 をみることをつよくオススメしたい。lesson1 には日本語字幕もある!

week13: Reinforcement Learning

強化学習。ここでは、Deep Q-Network が紹介される。 強化学習はそれ自体大きな一つの分野なので、一週間で紹介するには無理があるのではと思った。

このあたりから、自分の興味は、Deep Learning から強化学習に移りはじめる。 なので、GAN はあまり理解できていない。

演習問題では、OpenAI Gym の CartPole 問題を Tensorflow を使って DQN でとく。 かなりいい結果がでて驚く。

これを参考に、Keras や Numpy で再実装を実施してみたのだが、思うように結果が出なかった。

Project4 Translate a Language

機械翻訳。英語からフランス語への翻訳を実施する。

難しそうだけれども、いつも通りスケルトンのコードが与えられて、week11 を参考にして穴埋めしていく。

フランス語がわからないので、翻訳結果が正しいのかはわからないけれども、一応できた。

この課題を参考に、チャットボットをつくってみたのだけれども、

<PAD><PAD><PAD><PAD><PAD><PAD>…

しか応答してくれない。 なにが悪いのかもあまり理解していないので、追いきれない。 チャットボットは後味が悪いけれども、ここまでにする。

  1. Generative Adversarial Network =================================

week14: Autoencoders

自己符号化器。

week15: Generative Adversarial Networks

ここから GAN が始まる。

Deep Learning Book の著者, GAN の提唱者、 Ian GoodFellow さんが登場し、GAN について解説してくれる。若い!

MNIST を GAN で生成することをする。すごいけど、仕組みが複雑で難しい。。。

week16: Image Generation

前回に引き続いて、GAN. Deep Convolution GAN(DCGAN) が説明される。

CNN でつかった Convolution の関数が出てくるところ意外は、MNIST の GAN と同じ。 ただし、プーリング層はでてこない。

また、Batch Normalization が登場する。これが GAN の性能をよくする。

看板の数字??を題材にして、DCGAN をする演習がある。

Project5 Generate Faces

最終課題は、DCGAN で MNIST と CelebA のデータセットを使って、画像生成をすること。

GAN をあまり理解していないのだが、DCGAN の回の Jupyter Notebook のコピペでなんとか乗り切った。

まとめ

この NanoDegree は超初心者向け、簡単

広範囲をカバーして難しそうなイメージを持っていたけれども、実際やってみると、難しい数式はでてこない。

講義は Jupyter Notebook で手取り足取りな丁寧さでかかれている。

Project は Lecture の Jupyter Notebook のコピペでクリアできたり、簡単。

ひとによっては、この難易度では物足りないのではないかとすら思う。自分にはちょうど良いレベル。

こんな自分でもできました

はじめ自分は DeepLearning はとても難しいものだと思っていた。

なので、こういうステップを踏んで入門しようと思っていた。

  1. 大学 1,2 年の数学を復習
  2. 機械学習を勉強する
  3. Deep Learning を勉強する

しかし、いざ Deep Learning の世界に踏み込んでみると、 数学すら怪しい自分でも、なんとかついていくことができた。

普通に CNN をバリバリ実装して kaggle にチャレンジとかできている。

fast.ai の理念

現在、Udacity DLND の裏で fast.ai が提供する MOOC, Practical Deep Learning for Coders というものを受けているのだけれども、 この MOOC の理念が素晴らしいので引用したい。

The purpose of this course is to make deep learning accessible to those individuals who may or may not possess a strong background in machine learning or mathematics.

We strongly believe that deep learning will be transformative in any application; as such, this course is designed for individuals who possess a background in computer programming and would like to apply these techniques to their domain of expertise.

つまり、Deep Learning は 数学者や物理学者のためのものでなくて、 CS のバックグラウンドを持つ全ての人に開かれるべきだという主張だ。

なんか、fast.ai の宣伝になってしまったが、Udacity の DLND はそういう部分がある。 理論は抑えるものの、より実践的に tensorflow を利用して現実につかっていくかにフォーカスしているように思える。

Deep Learning で世界をハック

恐れずに、Deep Learning に飛び込んでみよう。きっと面白いハッキングができるようになるはずだ。

Udacity のコースは、面白いハッキングの材料を提供してくれるはずだ。

以上、Happy Hacking!!

19 Apr 2017, 11:22

TensorFlow で学ぶディープラーニング入門を読んだ。Kaggle で実践してみた。

TensorFlow で学ぶディープラーニング入門~畳み込みニューラルネットワーク徹底解説を読みました。

概要と感想

この本は、 手書き文字の認識処理を MNIST データを利用してすることが目的。

また、Tensorflow で 畳み込みニューラルネットワーク(CNN)を実装することが目的。

章をおうごとにソースコードがパワーアップしていき、認識精度が上がっていくところが面白い。

  • 2 章: Softmax をつかった多項分類器
  • 3 章:
    • 2.単層ニューラルネットワーク
    • 3.多層ニューラルネットワーク
  • 4 章: 単層 CNN
  • 5 章: 多層 CNN

本のはじめににも書いてあるけれども、この本は TensorFlow の公式 Web サイトのチュートリアルで 「Deep MNIST for Experts」として紹介されているものをほぼそのまま採用しているそうだ。

私は、公式サイトは読んでいないから差分がどうこういうことはできないけれども、 数式を交えて丁寧に解説されていて、わかりやすいと感じた。

なお、Jupyter Notebook が提供されていて、 自分の環境で動かしながら勉強できるところがとても気に入った。

この本で提示されている「機械学習の 3 ステップ」が心に残ったので、引用したい。

[sourcecode language=”text” title=”” ]
①与えられたデータを元にして、未知のデータを予測する数式を考える
②数式に含まれるパラメーターの良し悪しを判断する誤差関数を用意する
③誤差関数を最小にするようにパラメーターの値を決定する
[/sourcecode]

TensorFlow について、この本ででてくるコードは毎回似たようなことをしているので、 はじめは困惑したのだけれども、繰り返し見ているうちにすらすら意味がわかるようになった。 入門レベルとしては、十分力がついたと思う。

環境構築は Anaconda をつかった

この本には、Docker をつかって環境構築をするように書いてあったのだけれども、 自分は、Anaconda を利用して読みめてみた。

ツールのバージョンも以下で読んだ。

  • Anaconda 4.3.16
  • Python 3.6
  • TensorFlow 1.0.1

ところどころ元のソースコードに修正が必要になったけれども、全て問題なく動作した。

自分がした修正は以下のリポジトリにあります。

Kaggle で実力試しをした

2017 年現在、Kaggle で MNIST をりようしたコンペが主催されている。

私は、各章を読み終わるたびに、理解度を深めるために Kaggle の MNIST のコンペに挑戦した。

これはとてもよい、また楽しい復習方法なので、ぜひオススメしたい。

ただし、この本を参考に実装した結果は、1150 位で 上位 1000 位以内にも入れないけれどもね。