みらいテックラボ

音声・画像認識や機械学習など, 管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

「プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化」の紹介

昨年(2016年)くらいから, 「Docker」という仮想化技術を耳にするようになった.
それまで, 仮想化技術というと「VMWare Player」や「VirtualBox」などホスト型仮想化と, 「Hyper-V」や「XenServer」などハイパーバイザー型仮想化は聞いたことはあったのだが...

普段組み込みソフトやネイティブアプリなどの開発に関わることが多く, Webサービスなどのシステム開発や運用には縁がなかったので, これまで気にはなっていたが後回しにしてきた.
しかし, このGWに何か本を読もうと思った際にDockerのことを思い出したので, いくつかあるDocker関連本の中からAmazonの評価がよかったこの本を読んでみることに.

 目 次
第1部 導入編
 第1章 おさえておきたいシステム/インフラの知識
 第2章 コンテナ仮想化技術とDocker
第2部 基本編
 第3章 Dockerのインストールと基本コマンド
 第4章 Dockerfileを使ったコードによるサーバ構築
 第5章 Dockerイメージの共有 -- Docker Registry
第3部 応用編
 第6章 複数コンテナの一元管理 -- Docker Compose
 第7章 マルチホスト環境でのDocker運用 -- Docker Machine, Docker Swarm
 第8章 クラウドでのDocker運用

Docker教科書というだけあって, インフラ系の基礎知識からDockerコマンドの解説, Dockerfileの基本構文などが分かり易く説明されている.
Windows版のDocker Toolbox[1]で実際に試しながら学べる点もよい.

Dockerの基本的な考え方や使い方などを勉強したい方にはおススメです.

この本を読み終え, Dockerの考え方, コマンド等ついて知識としてある程度分かった気になっているが, 実際にシステム開発等で具体的に使ってみないと本当の良さが分かったり, 技術として身に付かないと思う.
ぜひ, システム開発等で試してみたいものだ.

---
参照URL:
[1] Docker Toolbox

Docker入門

Docker入門

Docker実践ガイド impress top gearシリーズ

Docker実践ガイド impress top gearシリーズ

ペットボトルを認識してみよう! (5)

今回は, 昨年の10月~12月に開催された「チームで学ぼう! TensorFlow(機械学習)実践編第2期」において, 私の参加した「チーム仲鶴後吉(仮)」の取り組んだ内容の番外編である.

最近, AWSGPUを使うようになり, 大規模なモデルの学習ができるようになったので,
Deep Learningの画像応用において代表的なモデルであるVGG16[1]をFine-tuningすることで, ペットボトルのカテゴリ識別の精度向上にトライした.

番外編
1. VGG16ベースシステム
1.1 VGG16+Fine-tuning[2]
VGG16は, 2014年のILSVRC(ImageNet Large Scale Visual Recognition Challenge)で提案された畳み込み13層とフル結合3層の計16層から成る畳み込みニューラルネットワークである.
KerasではこのVGG16を容易に利用できるので, 今回はKerasのバックエンドにTensorFlowを使い, ペットボトルのカテゴリ識別を試してみた.

[コード]

# coding: utf-8

# Petbottle classifier using VGG16

import os
import sys
import numpy as np
import pandas as pd

# Keras
from keras.preprocessing.image import ImageDataGenerator
from keras.layers import Input, Activation, Dropout, Flatten, Dense
from keras.models import Sequential, Model
from keras.applications.vgg16 import VGG16

from keras import optimizers

# パラメータ
# データ
TRAIN_DIR = './data/train_images'
VAL_DIR = './data/val_images'
MODEL_DIR = './model'
MODEL_FILE = 'petbottle_vgg16.h5'

# 画像データ
IMG_WIDTH  = 80
IMG_HEIGHT = 160
IMG_CHANNELS = 3

BATCH_SIZE = 100
TRAIN_SAMPLES = 32208
VAL_SAMPLES = 84
# 2Epoch毎にモデル保存. 10(=2*15)Epoch学習
EPOCH = 2 
LOOP  = 5

# カテゴリ情報
category = pd.read_csv('category_master.tsv', sep='\t')
classes = []
for name in category['category_dir']:
    classes.append(name)
print(classes)

# 学習データ準備
train_data_generator = ImageDataGenerator(
    rescale = 1.0 / 255,
    horizontal_flip = True)

train_data = train_data_generator.flow_from_directory(
    TRAIN_DIR,
    target_size = (IMG_HEIGHT, IMG_WIDTH),
    color_mode = 'rgb',
    classes = classes,
    class_mode = 'categorical',
    batch_size = BATCH_SIZE,
    seed = 1,
    shuffle = True)

# 評価データ準備
val_data_generator = ImageDataGenerator(
    rescale = 1.0 / 255)

val_data = val_data_generator.flow_from_directory(
    VAL_DIR,
    target_size = (IMG_HEIGHT, IMG_WIDTH),
    color_mode = 'rgb',
    classes = classes,
    class_mode = 'categorical',
    shuffle = False)

# VGG16モデル準備
# 注) FC層は使用しない(1000カテゴリ→11カテゴリのため)
input_tensor = Input(shape=(IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
vgg16_model = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
vgg16_model.summary()

# カスタムFC層
# 11カテゴリ
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(128, activation='relu'))
top_model.add(Dense(128, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(11, activation='softmax'))

# VGG16(nonFC) + カスタムFC層
model = Model(input=vgg16_model.input, output=top_model(vgg16_model.output))
if os.path.exists(os.path.join(MODEL_DIR, MODEL_FILE)):
    model.load_weights(os.path.join(MODEL_DIR, MODEL_FILE))
model.summary()

for layer in model.layers[:15]:
    layer.trainable = False

model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.Adam(lr=3e-6, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.),
              metrics=['accuracy'])

# ファインチューニング
for i in range(LOOP):
    log = model.fit_generator(
        train_data,
        samples_per_epoch = TRAIN_SAMPLES,
        nb_epoch = EPOCH,
        validation_data = val_data,
        nb_val_samples = VAL_SAMPLES)
    mname = ('Epoch%d-%s' % ((i+1)*EPOCH, MODEL_FILE))
    model.save_weights(os.path.join(MODEL_DIR, mname))

1.2 モデル構造
VGG16をベースとした今回のモデル構造は, 以下の通り.
f:id:moonlight-aska:20170423090222p:plain

1.3 学習と評価
学習履歴は, 以下の通り.

学習条件:
 ・カテゴリ数:11
 ・入力画像:80x160dot (注:32x64dotを拡大)
 ・学習データ:32,208
 ・エポック数:10
f:id:moonlight-aska:20170423105624p:plain:w300

識別条件:
 ・カテゴリ数:11
 ・評価データ:84
f:id:moonlight-aska:20170423105649p:plain:w300

10Epochで識別率80.95%となり, 以前の66.67%[3]を大きく上回るとともに, 初期の目標であった75.0%をも超える性能が得られた.
さすが, ImageNetと呼ばれる大規模な画像データセットを使って訓練したモデルだけのことはある.

現状, 各カテゴリーの学習データ数に結構バラツキがあるので, この辺りをバランスよくするなどすれば更に性能改善が見込めそうだ.

---
参照URL:
[1] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
[2] VGG16のFine-tuningによる犬猫認識 (2)
[3] ペットボトルを認識してみよう! (3)




詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~



Chainerによる実践深層学習

Chainerによる実践深層学習


初めてのディープラーニング --オープンソース

初めてのディープラーニング --オープンソース"Caffe"による演習付き