先端ロボット開発論II

〜 合宿3(ML): 深層学習プログラミング 〜

Advanced Robot Development II

〜 Bootcamp 3 (DL): Deep learning programming 〜

基本情報 Basic information

スタッフ Staff

  • 教員:タボ
  • TA:大崎
  • Teacher: Tavo
  • TA: Osaki

スケジュール Schedule

時間内容
1/21(土)9:30 - 18:00深層学習の理論, Pythonの基礎, 深層学習のプログラミング
1/22(日)9:30 - 18:00深層学習のプログラミング
DayTimeContents
1/21(Sat)9:30 - 18:00Deep learning theory, Python review, Deep learning programming
1/22(Sun)9:30 - 18:00Deep learning programming

開催地 Place

  • NAIST情報科学研究科
  • Graduate School of Information Science, NAIST

事前準備 Preparations

  • Pythonの復習 Python review (Python)
  • Kerasのインストール & 操作方法の確認 Keras installation and usage (Keras)

参考

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 (日本語)

演習 Excercises

概要 Overview

  • Pythonの復習 Python review
  • 深層学習のプログラミング Deep learning programming

Pythonの復習 Python review

  • 行列の生成
  • Array creation
  • >>> import numpy as np
    >>> a = np.array(2,3,4) #incorrect
    >>> a = np.array([2,3,4]) #correct
    >>> a
    array([2, 3, 4])
    
    >>> b = np.array([(1.5,2,3), (4,5,6)])
    >>> b
    array([[ 1.5,  2. ,  3. ],
           [ 4. ,  5. ,  6. ]])
    
    >>> b = np.arange(12).reshape(4,3)           # 2d array
    >>> print(b)
    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]]
    • 行列操作
  • Index related
  • >>> import numpy as np
    >>> a = np.arange(10)**3
    >>> a
    array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
    >>> a[2]
    8
    >>> a[2:5]
    array([ 8, 27, 64])
    
    >>> def f(x,y):
    ...     return 10*x+y
    ...
    >>> b = np.fromfunction(f,(5,4),dtype=int)
    >>> b
    array([[ 0,  1,  2,  3],
           [10, 11, 12, 13],
           [20, 21, 22, 23],
           [30, 31, 32, 33],
           [40, 41, 42, 43]])
    >>> b[2,3]
    23
    >>> b[0:5, 1]                       # each row in the second column of b
    array([ 1, 11, 21, 31, 41])
    >>> b[ : ,1]                        # equivalent to the previous example
    array([ 1, 11, 21, 31, 41])
    >>> b[1:3, : ]                      # each column in the second and third row of b
    array([[10, 11, 12, 13],
           [20, 21, 22, 23]])
    • 行列の形状と操作 : reshape, shape, ndim, size, type
  • Shape and size related: reshape, shape, ndim, size and type.
  • >>> import numpy as np
    >>> a = np.arange(15).reshape(3, 5)
    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> a.shape
    (3, 5)
    >>> a.ndim
    2
    >>> a.size
    15
    >>> type(a)
    <type 'numpy.ndarray'>
    
    >>> a = np.floor(10*np.random.random((3,4)))
    >>> a
    array([[ 2.,  8.,  0.,  6.],
           [ 4.,  5.,  1.,  1.],
           [ 8.,  9.,  3.,  6.]])
    >>> a.shape
    (3, 4)
    >>> a.ravel()  # returns the array, flattened
    array([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])
    >>> a.reshape(6,2)  # returns the array with a modified shape
    array([[ 2.,  8.],
           [ 0.,  6.],
           [ 4.,  5.],
           [ 1.,  1.],
           [ 8.,  9.],
           [ 3.,  6.]])
    >>> a.T  # returns the array, transposed
    array([[ 2.,  4.,  8.],
           [ 8.,  5.,  9.],
           [ 0.,  1.,  3.],
           [ 6.,  1.,  6.]])
    >>> a.T.shape
    (4, 3)
    >>> a.shape
    (3, 4)

    深層学習のプログラミング Deep Learning programming

    レベル1 Level 1

    四角形 1.1 Rectangles

    四角形のデータセットを使って, 多層パーセプトロン(Multi-Layer Perceptron :MLP) で縦長か, 横長かを分類します. このデータセットは以下のURLからダウンロードできます. here.

    Using an existing dataset of rectangles, train a Multi-Layer Perceptron (MLP) to classify rectangles into wide and tall. The dataset can be downloaded from here.

    ZIPファイルには2つのファイルが含まれています. それは, 学習データ(バリデーションを含む)とテストデータです. データは一列ごとにサンプルが格納されており, スペースによって区切られています. それぞれのサンプルは28*28の画像をもとにした784次元のデータで, それぞれの列の最初の784行目までに対応します. 最後の行はラベルで, 0か1です. 四角形の枠に対応するピクセルは値が255です. それ以外は0です.

    The zip file contains two files: a training (and validation) set and a test set. Data is stored at one sample per row, the features being space-separated. There are 784 features per example (=28*28 images), corresponding to the first 784 columns of each row. The last column is the label, which is 1 or 0. The pixels corresponding to the border of the rectangle has a value of 255, the rest are 0.

    ステップ:

    • データの準備 ヒント: データを以下の次元に整形します.
    Steps:
    • Prepare the data. Hint: format the data to have the following shapes:
    Test data:
    X_test (50000, 784)
    y_test (50000,)
    Train data:
    X_train (1200, 784)
    y_train (1200,)
    • データを0から1に収まるように正規化します. (つまり, 255の値を持つピクセルは1になります. )
    • Normalize the data to values between 0 and 1 (i.e., the pixels with value 255 should be 1).
    • クラス(整数)をバイナリに変換します.
    • Convert class vectors (integers) to binary class matrices:
    Y_train = np_utils.to_categorical(y_train, nb_classes)
    Y_test = np_utils.to_categorical(y_test, nb_classes)
    • 以下の層を持つシーケンシャルモデルを作成します.
      全結合層(512次元を出力, 入力する特徴量に対応する次元を入力)
      活性化関数
      ドロップアウト
      全結合層(512次元を出力)
      活性化関数
      ドロップアウト
      全結合層(512次元を出力)
      活性化関数(ソフトマックス関数)
    • Create a sequential model with the following layers:
      Fully connected neural network with 512 output dimensions (explicitly set the input shape which corresponds to the features).
      Activation
      Dropout
      Fully connected neural network with 512 output dimensions
      Activation
      Dropout
      Fully connected neural network with the number of classes as output
      Activation (use softmax)
    • モデルをコンパイル
    • モデルを訓練
    • モデルの精度を評価
    • テストデータを使った分類
    • Compile the model
    • Train the model
    • Evaluate the accuracy of the model
    • Predict classes using the test data

    以下のようにしてmatplotlibを使った可視化ができます.

    You can visualize the data using matplotlib, as follows:

    for i in range(9):
        plt.subplot(3,3,i+1)
        plt.imshow(X_train[i], cmap='gray', interpolation='none')
        plt.title("Class {}".format(y_train[i]))
    plt.show()

    Note: the images need to be 28x28 for matplotlib to plot them.

    1.2 手書き数字 1.2 Handwritten numbers

    手書き数字のデータセットを使って, 書かれた数字を認識するMLPを訓練します. Kerasは以下のコードを使うとMNIST(手書き数字)データセットを自動的にダウンロードすることができます.

    Using an existing dataset of handwritten numbers, train a MLP to recognize what numbers are written. Keras can download the MNIST (handwritten numbers) dataset automatically with:

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

    データセットには0から9の数字が書かれた28*28のグレースケール画像が含まれています. 60000枚の画像が訓練用として用意されており, 10000枚の画像がテスト用として用意されています.

    The dataset contains grayscale images of 28x28 pixels with a digit between 0 and 9. 60000 of those images are for training and 10000 are for testing.

    1.1と同じネットワーク構成を利用することができます. でも, データは用意してください. (データを1.1と同じ次元に変換してください)

    You can use the same networks as in 1.1 but you need to prepare the data (i.e., you should reshape the data to have the same shape as in 1.1).

    レベル2 Level 2

    レベル2.1 クラウドコンピューティング 2.1 Cloud computing

    学習には多くの計算機資源が必要なため, NAIST-ITCのサーバーや, 有料のAWS, Google Cloud, Azureといったクラウドリソースを使うことができます.

    As the training requires high computational power, you can use cloud resources such as a local server, NAIST-ITC servers, or paid cloud computing such as AWS, Google Cloud, and Azure.

    Log into the following server using SSH:

    serverX.naist.jp port 22
    user: userX
    password: passwordX

    すべてのエクササイズで, 以下のことを行ってください.

    • クラウドを使ってモデルを学習し, 重みを保存
    • 自分のPCでモデルをテスト
    Do the following for all previous exercises:
    • Train your models in the cloud and save the weights
    • Test your models locally

    メモ:リソースには限りがあります. 同時に学習できるモデルは1つだけかもしれません. だから, 誰も使っていないことを確認してから使ってください.

    NOTE: as the resources are limited, probably only one model can be trained at a time so confirm with others that they are not using it.

    モデルの訓練が終了すると(一般に、長時間かかります), モデルの重さを以下のようにして保存することができます.

    Once your model is trained (which usually takes long time), you can save the weights of the model with:

    model_json = model.to_json()
    open('cifar10_architecture.json', 'w').write(model_json)
    model.save_weights('cifar10_weights.h5', overwrite=True)

    次に、自分のPCにダウンロードしてします。 以下のコードを使って読み込むことができます。

    Then, you can download it to your PC and test it locally. You can load it using:

    from keras.models import model_from_json
    model = model_from_json(open(model_def_fname).read())
    model.load_weights(model_weight_fname)

    その前に, コードが動作することをローカルで1エポック動かして試してください.

    NOTE: Before testing in the server, verify locally with a single epoch that your code is running.

    2.2 画像認識 2.2 Image recognition

    小さな画像のデータセットを使って, 画像を認識する畳み込みニューラルネットワーク(Convolutional Neural Networks: CNN)を訓練します. Kerasは以下のコードによってCIFAR10データセットを自動的にダウンロードすることができます.

    Using an existing dataset of tiny images, train a Convolutional Neural Network to recognize images. Keras can download the CIFAR10 (tiny images) dataset automatically with:

    from keras.datasets import cifar10

    データセットには32x32, 3チャンネルのカラー(RGB)画像が含まれています.

    The dataset contains images of 32x32 with 3 channels (RGB). The classes of the dataset are:

    airplane 
    automobile 
    bird 
    cat 
    deer 
    dog 
    frog 
    horse 
    ship 
    truck

    以下の層を持つシーケンシャルモデルを構築します.

    畳み込み層
    活性化関数
    畳み込み層
    活性化関数
    プーリング層
    ドロップアウト
    (以上の組み合わせを1回以上配置)
    平滑化
    全結合層(512次元を出力)
    活性化関数
    ドロップアウト
    全結合層(クラスの数を出力)
    活性化関数(ソフトマックス関数)

    Build a sequential model with the following layers:

    Convolutional
    Activation
    Convolutional
    Pooling
    Dropout
    (all of above once more)
    Flatten
    Fully connected neural network with 512 output dimensions
    Activation
    Dropout
    Fully connected neural network with the number of classes as output
    Activation (use softmax)

    以上のエクササイズでの, 自分のモデルの精度を確認して, テストデータを使ったテストを行います.

    As in previous exercises, verify the accuracy of your model and test it with the test data.

    正しく認識した数例と, 誤認識した数例を挙げてください.

    Plot few samples that were recognized and also few of those that failed.

    レベル3 Level 3

    既存の構造を利用 3.1 Using existing architectures

    Kerasは, 既に研究者によって作られたネットワーク構成(層の配置など)を簡単に使用することができるようになっています.

    Several researchers have created their own architectures (certain ways of arranging the layers) and you can easily use them with Keras.

    from keras.applications.resnet50 import ResNet50

    また, これらのネットワーク構造はイメージネットなどの大規模データセットを使って学習されています. Kerasは自動で重みをダウンロードすることができます.

    Also, such architectures have been trained with huge datasets such as ImageNet. Keras also allows you to automatically download the weights.

    model = ResNet50(weights='imagenet')

    構造とイメージネットを使って学習された重みをダウンロードして, 自分の画像を使って試してください.

    Download this architecture and the Imagenet weights so that you can test your own images.

    3.2 自分のデータの使用; 3.2 Use your own data

    以前の全てのエクササイズを自分で用意したデータを使ってテストしてください. (GIMPを使って作成したり, インターネットからダウンロードしたり, 写真を撮ってください. )

    • 四角形
    • 手書き数字
    • CIFAR10
    • ImageNetでの学習済みデータを使ったResNet50モデルでの画像認識
    Repeat the tests of all previous exercises using your own data (e.g., create it with GIMP, downloaded it from the Internet or take a picture).
    • Rectangles
    • Handwritten digits
    • Tiny images trained with CIFAR10
    • Image recognition using ResNet50 with ImageNet weights

    3.3 既存の構造を改良 3.3 Improving existing architectures

    Kerasは, 既に研究者によって作られたネットワーク構成(層の配置など)を簡単に変更することができるようになっています.

    With Keras, you can easily change the network configuration (such as layer arrangement) made by other researchers.

    イメージネットなどの大規模データセットを使って学習されたネットワーク構成をもとに, 部分的にネットワーク構成を変更し, 学習を行うことで, 出力結果を変えることができます.

    Based on the network configuration learned using a large-scale dataset such as ImageNet, you can change the output result by partly changing the network configuration and re-training the added/changed layers. This process is called fine tuning.

    自分で用意したデータセットを使って, 既存のモデルをもとに学習させてください.

    Please use a dataset prepared by you, modify an existing model, and re-train it.

    • 実行例
  • Example
  • 解答ページ Answer page

    NoteWiki

    事後課題について After the course

    以下は,今回の合宿に合格するための最低要件です.

    The minimum requirements to successfully complete this course are as follows:

    • 課題が終わってない人は,完了させて,ノートウィキにまとめること.コード, テスト結果, 結果付きのテスト画像, など
  • Finish all the problems and summarize the solution in the NoteWiki (include code, tests results, tested images with results, etc.).
    • 締切:1/27 9:00
  • Deadline: 1/27 9:00

  • トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
    Last-modified: 2017-01-27 (金) 09:04:20 (122d)