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に別途書き出しています

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