WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

DLLAB DAY 2018 ハッカソンに参加してきた

MicrosoftとPreferred Networksが生んだ、日本で最も勢いがあるディープラーニングコミュニティであるDEEP LEARNING LAB主催のDLLAB DAY 2018 ハッカソンに参加してきました。

f:id:okkah:20180621232852p:plain

dllab.ai


ハッカソンの内容
Computer Visionのコースと、Natural Language Processingのコースがありましたが、自分はCVの方に参加しました。

与えられたデータセットを用いて、9種類のクラスに分けられる約1万5千枚のポテトチップスの写真を自動で判別できるようなモデルを構築することが課題でした。

画像のサンプルはこんな感じです。

f:id:okkah:20180621221709j:plain

個人的にはのりしおがなかったのが残念笑


学んだ内容
自分が今回のハッカソンを通じて特に学んだ内容は、

1. Dockerはどこでも誰でも同じ環境が作れて便利
2. まだまだデータの読み込みの練習が必要

ということでした。順番に内容を追っていきます。


1. Dockerについて
Dockerは、アプリケーションを構築、展開、実行するためのオープンなプラットフォームです。

今回は、ユーザーが作成したコンテナをアップロードして公開・共有できるサービスであるDocker Hubと、クラウドコンピューティングプラットフォームであるMicrosoft Azureを使用しました。

Docker Hubにある今回のデータセットが入ったコンテナをMicrosoft Azure上に構成し、これをdocker pullコマンドでローカルにプルし、 docker runコマンドで8888番ポートを使ってコンテナを起動しました。

これにより、ブラウザ上でポートにアクセスすることで、Jupyter Notebookによるコーディングができるようになりました。

Dockerによる利点は、

1. コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる
2. 作成した環境を配布しやすい
3. 安定した開発を進めたり、リリースサイクルの改善にも役立つ

ということを学びました。


2. データの読み込み
今回は、環境構築とデータの読み込みにかなり時間がかかってしまったため、モデル構築や、前処理にかけられる時間が随分と減ってしまいました。

環境構築は運営側の問題でもあったため仕方がなかったとしても、データの読み込みはもっと勉強する必要があると感じました。

from PIL import Image
import os
import numpy as np
import pickle

# train
img_shape=(224,224)
imgs = []
for filename in os.listdir("../data/train/images"):
    img = Image.open("../data/train/images/" + filename)
    img = img.resize(img_shape)
    img = np.asarray(img, dtype='f')
    img /= 255
    img = np.transpose(img, (2, 0, 1))
    imgs.append((filename, img))
    
labels = {}
with open("../data/train/train_labels.txt", "r") as f:
    for line in f:
        labels[line.split()[0]] = line.split()[1]    

train = []
for fn, img in imgs:
    train.append((img, np.int8(labels[fn])))

with open("traindata.pickle", "wb") as f:
    pickle.dump(train, f)


今回はチームメイトの力を借りつつ、Python標準ライブラリにあるpickleモジュールを用いたオブジェクトの直列化・非直列化について学びました。

直列化 (Serialize) はプログラミングにおいてオブジェクトをバイト列に変換することであり、非直列化 (Deserialize) はその逆で、バイト列を元のオブジェクトを復元することです。

これにより、バイト列に変換されたデータをファイルの形で永続化することができます。

モジュール名でもあるpickleという名前は、ハンバーガーにもはさまっているあいつが由来みたいです。

メモリ上にある揮発性で賞味期限の短いオブジェクトを、バイト列の形でファイルに長期保存できる状態にすることをピクルス、つまり漬物に見立てているのだと考えられます。