GoogleのDeeplearningプラットフォームであるtensorflowを触ってみました。
世の中にはMNISTのサンプルを実行したブログが多いのですが、tutorialを開設しているだけのものが多くちょっとよく理解できていませんでした
自分なりに色々と調べてMNISTを理解していきます
まずはBeginnerということのサンプルです。
Beginnerというか、Deeplearningというよりは回帰分析をTensorflowで行っているというサンプルです
データダウンロード
input_data.pyを使うとよくわからないので自分でデータ取得からハンドリングします。
まず、データをダウンロードします。
https://www.tensorflow.org/versions/master/tutorials/mnist/download/index.html
こちらの真ん中ほどにあるリンクから下記4つをダウンロードし解凍しておきます。
train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
$ gunzip train-images-idx3-ubyte.gz $ gunzip train-labels-idx1-ubyte.gz $ gunzip t10k-images-idx3-ubyte.gz $ gunzip t10k-labels-idx1-ubyte.gz
データの整形
そのままでは使いづらいので整形します
od -An -v -tu1 -j16 -w784 train-images-idx3-ubyte | sed 's/^ *//' | tr -s ' ' >train-images.txt od -An -v -tu1 -j8 -w1 train-labels-idx1-ubyte | tr -d ' ' >train-labels.txt od -An -v -tu1 -j16 -w784 t10k-images-idx3-ubyte | sed 's/^ *//' | tr -s ' ' >t10k-images.txt od -An -v -tu1 -j8 -w1 t10k-labels-idx1-ubyte | tr -d ' ' >t10k-labels.txt file_join(){ image=$1 label=$2 ruby < train.txt file_join t10k-images.txt t10k-labels.txt > t10k.txt
train.txtとt10k.txtというファイルが作成されます。このファイルは1行ごとにMNISTの画像データの数値データ、0-255までの値で構成されています。その行の先頭に正解数字を入れてたデータです。
Deeplearning
Tensorflowのプログラムはこちらの方のサンプルを流用させていただきました
http://tensorflow.classcat.com/2016/02/11/tensorflow-how-tos-visualizing-learning/
#!/bin/env python # -*- coding: utf-8 -*- # http://tensorflow.classcat.com/2016/02/11/tensorflow-how-tos-visualizing-learning/ import tensorflow as tf import numpy as np import random import time NUMCLASS=10 NUMPARAM=784 ### データ処理用 def label_data(lines): labels=[] for line in lines: # ラベルを1-of-k方式で用意する tmp = np.zeros(NUMCLASS) tmp[int(line)] = 1 labels.append(tmp) return np.asarray(labels) def image_data(test): test_image=map(lambda n: map(lambda k: float(k)/255.0,n),test[:,1:NUMPARAM+1]) return np.asarray(test_image) # 開始時刻 start_time = time.time() print "開始時刻: " + str(start_time) ### データ取得 ---> # ファイルを開く f = open("train.txt", 'r') # データを入れる配列 train = [] for line in f: # 改行を除いてスペース区切りにする line = line.rstrip() l = line.split(" ") l = map(lambda n: int(n),l) #l=map(lambda n: 0 if n=="0" else 1,l) train.append(l) # numpy形式に変換 train = np.asarray(train) f.close() f = open("t10k.txt", 'r') test = [] for line in f: line = line.rstrip() l = line.split(" ") l = map(lambda n: int(n),l) #l=map(lambda n: 0 if n=="0" else 1,l) test.append(l) test = np.asarray(test) f.close() ### データ取得 ---< # ファイルを開く f = open("train.txt", 'r') # データを入れる配列 train = [] for line in f: # 改行を除いてスペース区切りにする line = line.rstrip() l = line.split(" ") l = map(lambda n: int(n),l) #l=map(lambda n: 0 if n=="0" else 1,l) train.append(l) # numpy形式に変換 train = np.asarray(train) f.close() f = open("t10k.txt", 'r') test = [] for line in f: line = line.rstrip() l = line.split(" ") l = map(lambda n: int(n),l) #l=map(lambda n: 0 if n=="0" else 1,l) test.append(l) test = np.asarray(test) f.close() ### データ取得 --- test_label=label_data(test[:,0]) test_image=image_data(test) print "精度" print(sess.run(accuracy, feed_dict={x: test_image, y_: test_label})) # 終了時刻 end_time = time.time() print "終了時刻: " + str(end_time) print "かかった時間: " + str(end_time - start_time)
実行
これを実行します
$ python tf_regression.py 開始時刻: 1459234322.4 --- 訓練開始 --- --- 訓練終了 --- 精度 0.9227 終了時刻: 1459234921.58 かかった時間: 599.178552866
精度はあまり良くありませんが計算できました