MNISTはどういったデータの構造をしているのかについて考える。
どうもたっきーです。
最近、研究のモチベーションは高いけど大学に行くモチベーションはとても低い。
モチベーション
機械学習初心者なので、MNISTの784次元配列+ラベルのデータセットを分類したい対象のN次元配列+ラベルのデータセットに入れ替えると既存のコードで機械学習が簡単にできる。。。等と安直な考えでいる。
そのためにはMNISTってどんなデータの形しているのかしる必要があるので検証してみる。
環境
準備
まずはインポート
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
MNISTデータを取得する。
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
すると以下が表示される。
データの内容を表にまとめると以下になる。
ファイル名 | データ |
train-images-idx3-ubyte.gz | 学習用画像データ |
train-labels-idx1-ubyte.gz | 学習用ラベルデータ |
t10k-images-idx3-ubyte.gz | テスト用画像データ |
t10k-labels-idx1-ubyte.gz | テスト用ラベルデータ |
中身を見ていく
a = mnist.train.next_batch(1)
mnist.train.next_batch()で学習用データからデータを取り出すメソッド。
引数は取り出すデータの数。
>>>print(a)
>>>print(type(a))<class 'tuple'>
これから取り出したデータの方はタプルで、a[0]に画像データ、a[1]にラベルデータが入っていることが分かる。
試しに print(a[0])をやってみると784個の配列が表示され、print(a[1])をやってみると10個の配列が表示される。
じゃあこれらのデータの型は?
>>>print(type(a[0]))<class 'numpy.ndarray'>>>>print(type(a[1]))
<class 'numpy.ndarray'>
numpy.ndarrayらしい。
↓ドキュメント
numpy.ndarray — NumPy v1.13 Manual
要するにNumpyの配列ってことかな??(わからん)
ちなみに画像データは0〜1の値をとり、0が白、1が黒になっている。
オリジナルのデータは0〜255の整数値で各ピクセルの濃度を表しているっぽい。
0〜1に変換して正規化しているっぽい(?)
ラベルデータは 「1-of-K」という方式で表現しているらしい。
例えば0なら[1,0,0,0,0,0,0,0,0,0]で、
2なら[0,0,1,0,0,0,0,0,0,0]と言った風のある要素だけが1で、それ以外が0なベクトルのこと。
配列の個数が分類したいデータの個数で、1のある位置がその要素。(語彙がないのでうまい表現が見つからない。)
画像データとラベルデータを分ける
以下のコードでimagesに画像データの配列、labelsにラベルデータの配列が入る。 とりあえず10個分のデータ入れてみる。
images, labels = mnist.train.next_batch(10)
中身の確認をしよう。
images
IN
print(images)
OUT
[[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]]
IN
print(len(images))
OUT
10
IN
print(type(images))
OUT
<class 'numpy.ndarray'>
ほう…imagesには784個のデータの配列が10個配列としてあって、型はnumpy.ndarrayって感じかな。
もっと深く見てみよう。
images[0]
IN
print(images[0])
OUT
IN
print(len(images[0]))
OUT
784
IN
print(type(images[0]))
OUT
<class 'numpy.ndarray'>
これからimagesに格納されている各配列はひとつ分の画像データに鳴っていることが分かる。型は<class 'numpy.ndarray'>。
もっと深く。
images[0][0]
IN
print(images[0][0])
OUT
0.0
IN
print(len(images[0][0]))
OUT
TypeError: object of type 'numpy.float32' has no len()
IN
print(type(images[0][0]))
OUT
<class 'numpy.float32'>
これから、imagesの配列になにが入ってるかわかった。型はnumpy.float32。
そりゃ、print(len(images[0][0]))はデータは配列じゃないのにエラー吐かれるわ。
ラベルデータに対しても似たような結果が得られた。
ただ、print(type(labels[0][0]))関してだけ、型が<class 'numpy.float64'>だった。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (17件) を見る
Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
- 作者: Sebastian Raschka,株式会社クイープ,福島真太朗
- 出版社/メーカー: インプレス
- 発売日: 2016/06/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
おわりに・今後・感想
今回得た配列を分類したいやつの配列に入れ替えるとどうなるのか試してみる。
このデータセットみたいに0〜1に正規化する必要があるのかな??
まぁ、そのデータセットどうやって作ろうかな…って感じではある。
(データセットってどうやってつくるのか…?)
numpy.ndarrayに分類対象の配列を入れたらいいのかな???
そしてそれに1-of-Kでラベルデータを付与すれば良い?
とりあえずMNISTライクなデータセット用意するところから始めたらいいのかな???
そもそも機械学習・深層学習はどの程度データがあればいいんや????
???ばかりが頭に浮かぶ…
機械学習畑の方、ぜひご教授ください…。
そういや関係ないけど、iPhone X発売されましたね。
ほしい。
あいひょーーーん・てん pic.twitter.com/kkidRbaYkC
— たっきー@ダサテプラP (@tacky0612) 2017年11月7日