Keras に入門する 画像分類 Part.0 cifar10 を眺める

Kerasのサンプルを1つ理解 → 似たような問題を解決する何かを作ってみる、という流れでいくつか問題を解いていく、ということをしていきたい

最初は画像分類をしてみる。

サンプルはこれ

github.com

まだデータやコードを見ていないけれど、多分

  • 学習データとして犬とか猫とか車みたいなタグ(多分10種類)がつけられた画像が提供される
  • 画像とタグをもとに学習する
  • 新しい画像が猫なのか、犬なのか、車なのか、... を判別できるシステムを作る

みたいなことをするんだと思う。

なので、10種類くらいの画像の教師データから新規画像が何の画像なのか判別する方法をサンプルを通して学ぶ → 自分で似たようなテーマの問題を設定してそれを解くことができるシステムを作ってみる、ということをやってみる

ということで、今回は提供されるデータがどのような形式なのかを調べてみる

実行は基本的にGoogle Colaboratoryでやっていくつもり

今回は https://colab.research.google.com/drive/1T0-GO8EvEcY4qIeb686LTB9e4iwqUz1V

from keras.datasets import cifar10

data = cifar10.load_data()

data

を実行してみると

((array([[[[ 59,  62,  63],
           [ 43,  46,  45],
           [ 50,  48,  43],
           ...,
           [158, 132, 108],
           [152, 125, 102],
           [148, 124, 103]],
  
          [[ 16,  20,  20],
           [  0,   0,   0],
           [ 18,   8,   0],
           ...,
           [123,  88,  55],
           [119,  83,  50],
           [122,  87,  57]],
  
          [[ 25,  24,  21],
           [ 16,   7,   0],
           [ 49,  27,   8],
           ...,
           [118,  84,  50],
           [120,  84,  50],
           [109,  73,  42]],
  
          ...,

と出てくる

想像だけど、[ 59, 62, 63] とかが1pixelのRGBなんじゃないかと思うけど、それ以上のことがわからない

ので、公式ドキュメントを見てみる

データセット - Keras Documentation

from keras.datasets import cifar10

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

戻り値:
2つのタプル:
x_train, x_test: shape (num_samples, 3, 32, 32)または(num_samples, 32, 32, 3)のRGB画像データのuint8配列です.これはバックエンド設定のimage_data_formatがchannels_firstとchannels_lastのいずれなのかによって決まります.
y_train, y_test: shape (num_samples,) のカテゴリラベル(0-9の範囲の整数)のuint8配列.

とのことだ

なので、x_train, y_train, x_test, y_test に分割してみる

(x_train, y_train), (x_test, y_test) = data


len(x_train)

→ 50000

len(y_train)

→ 50000

多分学習用に50000枚の画像があって、x_trainには画像データが、y_trainにはその正解のタグが入ってるんだと思う

np.array(x_train).shape

→ (50000, 32, 32, 3)

画像は32x32のRGB画像なんだと思う とりあえず表示してみよう

f:id:uhiaha888:20180928210141p:plain

...1枚目が何なのかよくわからないけど、2枚目は多分トラックだし多分データの構造の解釈としては間違ってないだろう

これに対して、

np.array(y_train).shape

→ (50000, 1)

なので y_train は各画像のラベルを表すベクトルなんだろう

1枚目がなんなのか気になるので同じラベルがつけられている画像をいくつか見てみる

y_train[0]

→ [6]

np.where( y_train == [6] )

→ (array([    0,    19,    22, ..., 49962, 49966, 49996]),
 array([0, 0, 0, ..., 0, 0, 0]))

なんか思っていたのと違う(1つのarrayが返されると思っていたけど2個返ってきた)けど、とりあえず0, 19, 22, ... 49962, 49966, 49996は多分同じ種類の画像なんだろうからそれらを見てみる

f:id:uhiaha888:20180928211512p:plain

なるほど、カエルだ

ついでにx_test, y_testも一応確認しておこう

np.array(x_test).shape

→ (10000, 32, 32, 3)

np.array(y_test).shape

→ (10000, 1)

ということで、今回のサンプルは32x32のRGB画像とそのラベルになっているんだということがわかった

次回はサンプルを実際に動かしてこれらの画像を分類してみたい