オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

mnistのjpeg画像をtensorflowに入力する、Part 01

tensorflow、なかなか難しいですね
学習が思うようにいかないときのデバッグにとても苦労します
モデルの構造が悪いのか、
データのマインディングの仕方がまずいのか、
そもそもデータの読み込みにバグがあるのか、、、
tensorflowのplacefolderはC言語ベースの(というよりGPUに無知な)
プログラマには非常にデバッグがし難い、、、
プログラムが流れている最中のデータの変化を追うことが出来ませんからね
開発の効率を上げるためには、
信頼性の高いテンプレートを自分なりに構築する必要があると感じます

そこで、機械学習の一番の大元とも言える
画像をモデルに入力する部分を作ってみました
内容が長くなるので、3部構成で記事を書きます
本稿では、mnistのjpeg画像とラベルを出力してみます

mnistの元画像を取得

ダウンロードしたバイナリデータを個々の画像に分割し、jpegで保存します。

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

def load_mnist(path, kind='train'):
    """load MNIST data from designated path"""
    labels_path = os.path.join(path, '%s-labels.idx1-ubyte' % kind)
    images_path = os.path.join(path, '%s-images.idx3-ubyte' % kind)

    with open(labels_path, 'rb') as lbpath:
        magic, n = struct.unpack('>II', lbpath.read(8))
        labels = np.fromfile(lbpath, dtype=np.uint8)

    with open(images_path, 'rb') as imgpath:
        magic, num, rows, cols = struct.unpack(">IIII", imgpath.read(16))
        images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784)

    return images, labels

if __name__ == '__main__':

    # training data
    X_train, y_train = load_mnist('./data/raw', kind='train')
    os.makedirs('./images', exist_ok=True)
    os.makedirs('./images/training', exist_ok=True)
    train_label = []
    for (i, x) in enumerate(X_train):
        image_mat = np.array([[x[i] for j in range(3)]+[0] for i in range(784)])
        image = image_mat.reshape(28, 28, 4)

        filename = './images/training/image_' + str(i + 1) + '.jpg'
        train_label.append(y_train[i])
        print(filename)
        pil_image = Image.fromarray(image.astype('uint8')).convert('RGB')
        pil_image.save(filename)
    np.savetxt('./images/training/label.txt', train_label)

    # evaulation data
    X_train, y_train = load_mnist('./data/raw', kind='t10k')
    os.makedirs('./images/evaluation')
    evaluate_label = []
    for (i, x) in enumerate(X_train):
        image_mat = np.array([[x[i] for j in range(3)]+[0] for i in range(784)])
        image = image_mat.reshape(28, 28, 4)

        filename = './images/evaluation/image_' + str(i + 1) + '.jpg'
        evaluate_label.append(y_train[i])
        print(filename)
        pil_image = Image.fromarray(image.astype('uint8')).convert('RGB')
        pil_image.save(filename)
    np.savetxt('./images/evaluation/label.txt', evaluate_label)

下記のサイトを参考にしました
http://euglena1215.hatenablog.jp/entry/2017/02/02/153457

f:id:changlikesdesktop:20190226055650p:plain:w500

画像はランダムに並んでいるんですね
(=正解が0, 1, 2、、、とプレーンになっていない)
そこで、ラベルをlabel.txtに別途書き出しています

f:id:changlikesdesktop:20190226060452p:plain:w200

フォームを整えなかったので、 指数表示になって見難いですね(汗)

機械学習って、
ヒトの脳が処理しきれない大量データを解析することが目的なわけじゃないですか
だからなのか、解析中のデータの流れを追うことが疎かになりがちだと感じます
勿論、データの流れを全て見ることは不可能なんですが、
デバッグの段階ではある程度必要な作業だと思います
その辺が、スキルアップのポイントになるような気がします