ディープラーニングのライブラリでKeras+TensorFlowを利用してみようと思い、チュートリアルを始めました。
MNISTやるんじゃなかった???
ディープラーニングのライブラリのTensorFlowを利用してMNISTをやろうと思っていたのですが、MNISTと同じようなチュートリアルですが、もう少し手ごたえがあるチュートリアルということでFashionMNISTというものが出てきました。
TensorFlowのチュートリアルにも、より手応えのある、と書いてあるのですが、MNISTに飽きたので、もっと見た目が面白いMNISTと同じような課題を出しておいたよ、と読める感じでもあります。
分類課題に入る前に、まずFashionMNISTがどのようなデータなのか、見ていきたいと思います。チュートリアル+私が疑問に感じたことを追記して書いていく感じになります。
参考にしたTensorFlowチュートリアルはこちらです。
こんな人の役に立つかも
・機械学習プログラミングを勉強している人
・TensorFlowのFashionMNISTのチュートリアルをやっている人
・Keras+TensorFlowで機械学習プログラミングを始めたい人
FashionMNISTのデータの全体像
FashionMNISTは、
・28×28のサイズで衣料品の画像データ
・訓練用に60000枚の画像
・テスト用に10000枚の画像
を持つデータセットです。
目的は、
「画像データから与えられた画像がどの種類の衣料品に該当するかを訓練して予測すること」
です。教師あり学習の分類課題になります。
28×28の画像データには色の濃さがあり、0~255までの値で表現されています。0が白く、255が黒く表現されティーシャツの絵が見えるようになっています。
以前Digitデータの手書き文字の分類を行った時のイメージと同じになります。
こんな感じの画像が訓練、テスト両方合わせて70000枚あるということですね。
なんだかかわいい画像だよ。
訓練データが60000枚は次のようなデータのイメージですね。
画像の種類は全部で10種類あり、数字で表現されています。
ラベル | 答えクラス |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Shirt |
7 | Sneaker |
8 | Bag |
9 | Ankle boot |
FashionMNISTデータの読み込み
Keras+tensorflowのimport
まずはtensorflowとkerasを読み込みます。チュートリアルでは、tensorflowに組み込まれたkerasを呼び出すのでkerasの呼び出し時には、「from tensorflow import keras」となっています。
# TensorFlow と tf.keras のインポート
import tensorflow as tf
from tensorflow import keras
この呼び出し方以外にも、単体のライブラリとしてのkerasを呼び出す方法もあるようです。今回はtensorflowを利用するので、このやり方がシンプルだと思います。kerasには、tensorflow以外のライブラリをバックエンドとして設定できるので、keras単体ライブラリも存在しています。
次に、ヘルパーライブラリと言っているのは、numpyとmatplotlibです。最後にtensorflowのバージョンを確認して完了です。
# ヘルパーライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
print(tf.__version__)
次のように、バージョンが表示されます。
2.2.0
また、答えのクラスをここで定義しておきます。sckit-learnのようにデータの中には含まれていないようです。
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
FashionMNISTの読み込み
FashionMNISTはkerasのデータセット内から呼び出せるようです。
「fashion_mnist.load_data()」という専用の呼び出し機能が存在していて、戻り値を次のようにすることで、「訓練データ」と「テストデータ」にそれぞれ分離してくれます。
fashion_mnist = keras.datasets.fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
上のプログラムでは、
・「X_train」に訓練データ
・「y_train」に訓練データの答え(ラベル)
・「X_test」にテストデータ
・「y_test」にテストデータの答え(ラベル)
が入ってきます。ちなみに、チュートリアルとは違う変数名にさせてもらいました。scikit-learnではこのようにしていましたので、こちらの名前が慣れているというだけの理由です^^;
まずは、データの数と、どのようなデータ構成なのかを確認してみます。numpyのshape機能でデータを見てみます。
#訓練データ
print(X_train.shape)
#訓練データの答え
print(y_train.shape)
28×28の画像が60000個あるのがわかります。また、答えデータ(ラベル)も同様に60000個存在しています。
(60000, 28, 28)
(60000,)
同様にテストデータの形状も確認です。
#テストデータ
print(X_test.shape)
#テストデータの答え
print(y_test.shape)
テストデータも28×28のデータで、10000個存在しています。
(10000, 28, 28)
(10000,)
画像データの確認
チュートリアルでは、最初の25個の画像をmatplotlibで表示していますが、Tシャツの形状が色々あって面白そうなので、Tシャツの画像のみを最初の25個分並べてみることにしました。
「X_traint_ts」という変数に「X_train[y_train==0]」という答えラベルが0のデータを取り出したものを作成します。それを25回forループで回しています。
plt.figure(figsize=(10,10))
X_train_ts = X_train[y_train==0]
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train_ts[i], cmap=plt.cm.binary)
plt.xlabel("T-shirt/top")
plt.show()
plt.xlabelの行では、全てTシャツなので、このように変更しておきます。
変な形もあるけど、分類できるのかな・・・