[PYTHON] Trier les données Fashion-MNIST et les enregistrer au format PNG

introduction

Faites-vous du machine learning? > Salutations

J'utilisais Chainer, mais pour une raison quelconque, j'ai décidé d'utiliser PyTorch ou Keras. Ainsi, le tutoriel d'apprentissage automatique est l'ensemble de données MNIST de nombres manuscrits, mais le tutoriel de TensorFlow utilise les données de Fashion-MNIST avec une légère torsion. Je suis.

Ce didacticiel est très simple, mais pour l'instant, il est utile de jeter un coup d'œil rapide sur les données que vous entraînez. Alors téléchargeons et trions Fashion-MNIST, les données utilisées pour le problème de classification des vêtements.

Je vais mettre le code ci-dessous.

https://github.com/kaityo256/fashion_mnist_dump

Comment utiliser

Exécutez-le. Je pense que vous avez besoin de TensorFlow version 2 ou ultérieure.

python fashion_mnist_dump.py 

Lors de l'exécution, les répertoires suivants seront creusés et les données avec les étiquettes correspondantes seront enregistrées dans les numéros de série.

test
├ Bag
├ Boot
├ Coat
├ Dress
├ Pullover
├ Sandal
├ Shirt
├ Sneaker
├ Top
└ Trouser

train
├ Bag
├ Boot
├ Coat
├ Dress
├ Pullover
├ Sandal
├ Shirt
├ Sneaker
├ Top
└ Trouser

Il existe 10 types d'étiquettes. Les données de test sont de 1 000 feuilles pour chaque étiquette, totalisant 10 000 feuilles, et les données de formation sont de 6 000 feuilles, totalisant 60 000 feuilles, pour un total de 70 000 feuilles.

Par exemple, les données de test Sandal

sandals.png

Si Robe

dresses.png

Il est trié et enregistré au format.

scénario

Le script est également court, je vais donc tout poster.

import os

import IPython
from PIL import Image
import numpy as np
import tensorflow as tf
from tensorflow import keras

fashion_mnist = keras.datasets.fashion_mnist
train, test = fashion_mnist.load_data()

dirnames = ['Top', 'Trouser', 'Pullover', 'Dress',
            'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Boot']


def save_img(filename, data):
    img = Image.new("L", (28, 28))
    pix = img.load()
    for i in range(28):
        for j in range(28):
            pix[i, j] = int(data[j][i])
    img2 = img.resize((28*5, 28*5))
    img2.save(filename)


def dump(data, dhead):
    for i in range(10):
        dname = "{}/{}".format(dhead, dirnames[i])
        if os.path.isdir(dname) is False:
            os.makedirs(dname)
    images, labels = data
    count = [0]*10
    for i in range(len(images)):
        index = labels[i]
        filename = "{}/{}/{}.png ".format(dhead, dirnames[index], count[index])
        save_img(filename, images[i])
        count[index] += 1
        print(filename)


dump(test, "test")
dump(train, "train")

Je ne pense pas que ce soit particulièrement difficile, mais je vais l'expliquer brièvement.

Tout d'abord, téléchargez les données.

fashion_mnist = keras.datasets.fashion_mnist
train, test = fashion_mnist.load_data()

fashion_mnist.load_data () renvoie les ensembles de données d'entraînement et de test.

Chaque ensemble de données se compose de données d'image et de données d'étiquette. Chacun est un tableau NumPy.

Alors

train_images, train_labels = train

Et ainsi de suite, vous pouvez obtenir l'image et l'étiquette.

L'image est un tableau NumPy avec des données de test de 10000 x 28 x 28 et des données d'entraînement de 60000 x 28 x 28. Puisque le type est ʻuint8`, c'est-à-dire un entier de 0 à 255, vous pouvez l'enregistrer sous forme d'image en utilisant la luminosité de l'échelle de gris telle quelle. La fonction suivante fait cela.

def save_img(filename, data):
    img = Image.new("L", (28, 28))
    pix = img.load()
    for i in range(28):
        for j in range(28):
            pix[i, j] = int(data[j][i])
    img2 = img.resize((28*5, 28*5))
    img2.save(filename)

Créez une image en niveaux de gris de 28 x 28 pixels avec ʻImage.new ("L", (28, 28)) ʻ et obtenez les données de pixels avec ʻimg.load () . Tout ce que vous avez à faire maintenant est d'insérer un tableau NumPy dans ces données (vous devrez le convertir en ʻint).

Puisqu'il est un peu petit tel qu'il est, il est agrandi 5 fois et enregistré avec ʻimg.resize ((28 * 5, 28 * 5)) `.

La fonction dump (data, dhead) est appelée en mettant le nom du fichier et les données dans ce save_img.

data est une donnée de test ou de formation, et dhead est un test ou une formation, et elles se distinguent par le nom du répertoire.

Ce n'est pas particulièrement difficile, mais lors de son utilisation pour l'apprentissage, il est plus pratique de convertir ces données en données réelles de -1,0 à 1,0, par exemple, et de les aplatir à 784 données unidimensionnelles au lieu de données bidimensionnelles 28x28. Bon (CNN serait peut-être préférable de rester en deux dimensions).

Résumé

J'ai utilisé TensorFlow / Keras pour obtenir les données Fashion-MNIST, les trier et les enregistrer sous forme de fichier. Il est intéressant de jeter un coup d'œil rapide sur les données. Par exemple

J'ai pensé: "Oh, c'est Gap." 83.png

Il y a des choses que les humains ne comprennent pas même s'ils les voient [^ 1] 804.png

Quelque chose comme un pantalon 10.png

Après tout, il y a des choses que je ne comprends pas ... 20.png

[^ 1]: La bonne réponse (étiquette) est un sac.

Quoi qu'il en soit, la bibliothèque de machine learning progresse rapidement et il est difficile de rattraper son retard ...

Recommended Posts

Trier les données Fashion-MNIST et les enregistrer au format PNG
Image en niveaux de gris et enregistrer au format csv
Traitement des données 1 Formatage des données et entrée / sortie de fichier
Comment déguiser un fichier ZIP en fichier PNG
Crop Numpy.ndarray et enregistrez-le en tant qu'image
Crypter et enregistrer les données sur jupyter et décrypter si nécessaire
Histoire de l'analyse d'image du fichier PDF et de l'extraction de données
Créez un conteneur Docker et enregistrez le png depuis altair