【TF2】Keras load_dataで読み込んだ全データセットをローカル保存する (2) MNIST、Fashin-MNIST 画像への変換

TIPS ディープラーニング
スポンサーリンク

前回のCIFARに続いて、MNISTの画像保存について。
こちらはクセがなく処理がラクです。

 

はじめに

Keras のload_dataで読み込んだデータを可視化する方法。

(1) CIFAR10、CIFAR100 画像への変換方法
(2) MNIST、Fashin-MNIST 画像への変換方法
(3) IMDB Review、Reuters Topics テキストへの変換方法
(4) Boston Housing data のcsvへの変換方法

この記事では「(2) MNIST、Fasion-MNIST画像への変換方法」について書いています。

 

ソースコード一式

こちらに(1)~(4) すべてのコードを一括したファイルをアップしています。
コード見たほうが早いわーな方はどうぞ。

MaxiParadise/Save_TF_Keras_Dataset
Contribute to MaxiParadise/Save_TF_Keras_Dataset development by creating an account on GitHub.

 

MNIST、Fashion-MNIST の画像保存

from tensorflow.keras.datasets import mnist, fashion_mnist

# Load data from keras API
(x_train, y_train), (x_test, y_test) = mnist.load_data()

まず、load_data()で、train, testにデータを読み込みます。

y_train, y_testにはこの時点で、クラスIDがint配列として格納されています。
具体的には、[0,5,2,1,3・・・] のようにクラスIDが入っています。

MNISTでは
これらクラスIDがそのまま数字として割り当てられているので、
クラスID:0 のデータ(=「0」の画像)を0のフォルダに保存していきます。
他のクラスIDについても同様。

 

TrainデータとTestデータを分けて保存したいので、
まずは、”train” “test”というフォルダを生成、
その下に「0」から「9」までのフォルダを生成します。

OUT_DIR = 'mnist'
# make train/test dirs and class dirs
for cid in range(10):
    os.makedirs(os.path.join(OUT_DIR,'train', '{:d}'.format(cid)), exist_ok=True)
    os.makedirs(os.path.join(OUT_DIR,'test', '{:d}'.format(cid)), exist_ok=True)

 

あとは、
クラスIDを見ながら、numpy → Pillowで画像化して保存

Trainデータ、Testデータでそれぞれセット分繰り返すだけで完了。

# convert train data
for num, (x_data, y_data) in enumerate(zip(x_train, y_train)):
    # make file path
    fpath = os.path.join(OUT_DIR,'train', '{:d}'.format(y_data), 'train_{:05d}.png'.format(num))
    # convert numpy to pillow and save
    Image.fromarray(x_data).save(fpath)
# convert test data
for num, (x_data, y_data) in enumerate(zip(x_test, y_test)):
    # make file path
    fpath = os.path.join(OUT_DIR,'test', '{:d}'.format(y_data), 'test_{:05d}.png'.format(num))
    # convert numpy to pillow and save
    Image.fromarray(x_data).save(fpath)

 

以下のように保存されます。

Fashion-MNIST のクラス定義 保存

MNISTとの違いは、
「クラスIDが何に対応しているか」のみで、
画像保存コードはそのまま流用できます。

Fashion-MNISTは、10クラスのデータセットですが、
下記ページの表に示すようにクラスIDが割り振られています。

Basic classification: Classify images of clothing  |  TensorFlow Core
IDClass
0T-shirt/top
1Trouser
2Pullover
3Dress
4Coat
5Sandal
6Shirt
7Sneaker
8Bag
9Ankle boot

 

というわけで、“train” “test”それぞれのフォルダの下に、
「クラスID_クラス名」のフォルダを生成しておきます。
その中に画像を保存していくことにします。

OUT_DIR = 'fasion_mnist'

# Load data from keras API
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

# define class names from ex: https://www.tensorflow.org/tutorials/keras/classification
class_list = ['T-shirt_top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle_boot']

# make train/test dirs and class dirs
for cid, class_name in enumerate(class_list):
    os.makedirs(os.path.join(OUT_DIR,'train', '{:d}_{}'.format(cid,class_name)), exist_ok=True)
    os.makedirs(os.path.join(OUT_DIR,'test', '{:d}_{}'.format(cid,class_name)), exist_ok=True)

保存処理自体は、MNISTと同様、
クラスIDを見ながら、numpy → Pillowで画像化して保存

Trainデータ、Testデータでそれぞれセット分繰り返すだけです。
違いは、「保存フォルダパスの生成部分」のみ。

# convert train data
for num, (x_data, y_data) in enumerate(zip(x_train, y_train)):
    # make file path
    fpath = os.path.join(OUT_DIR,'train', '{:d}_{}'.format(y_data,class_list[y_data]), 'train_{:05d}.png'.format(num))
    # convert numpy to pillow and save
    Image.fromarray(x_data).save(fpath)

# convert test data
for num, (x_data, y_data) in enumerate(zip(x_test, y_test)):
    # make file path
    fpath = os.path.join(OUT_DIR,'test', '{:d}_{}'.format(y_data,class_list[y_data]), 'test_{:05d}.png'.format(num))
    # convert numpy to pillow and save
    Image.fromarray(x_data).save(fpath)

 

以下のように保存されます。

 

 

次回は、
(3) IMDB Review、Reuters Topics テキストへの変換方法
について
書きます。

 

 

最後まで読んでいただき、ありがとうございます!

ブックマーク登録、
ツイッターフォロー、
よろしくお願いいたします!🙇‍♂️🙇‍♂️
↓↓↓

👇 フォローボタン 👇
スポンサーリンク
マキシ's ディープパラダイス