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
画像はランダムに並んでいるんですね
(=正解が0, 1, 2、、、とプレーンになっていない)
そこで、ラベルをlabel.txtに別途書き出しています
フォームを整えなかったので、 指数表示になって見難いですね(汗)
機械学習って、
ヒトの脳が処理しきれない大量データを解析することが目的なわけじゃないですか
だからなのか、解析中のデータの流れを追うことが疎かになりがちだと感じます
勿論、データの流れを全て見ることは不可能なんですが、
デバッグの段階ではある程度必要な作業だと思います
その辺が、スキルアップのポイントになるような気がします