[PYTHON] Erstellen Sie einen Datensatz, indem Sie zufällig MNIST-Daten auswählen

Überblick

Es wurde notwendig, mit einem Teil von MNIST anstelle des gesamten MNIST-Datensatzes zu trainieren. Aus diesem Grund habe ich ein Programm erstellt, das zufällig n Bilder aus 60.000 Trainingsdaten von MNIST extrahiert, sie für jede Klasse in Ordner aufteilt und die Bilder speichert.

Ausführungsumgebung

Google Colaboratory PyTorch 1.6.0

Implementierung

Speichern Sie MNIST im Bildformat

Laden Sie den MNIST-Datensatz herunter und speichern Sie ihn im Bildformat, um ihn zufällig aus dem Train-Datensatz zu extrahieren. Ich habe auf diese Seite verwiesen. Versuchen Sie, den Bildordner mit PyTorch zu verwenden

Importieren Sie zunächst die erforderlichen Module

import os
from PIL import Image
from torchvision.datasets import MNIST
import shutil
import glob
from pprint import pprint
import random
from pathlib import Path
from tqdm import tqdm

Wenn Sie nicht über das erforderliche Modul verfügen, installieren Sie es entsprechend mit pip oder conda.

Dann laden Sie MNIST herunter.

mnist_data = MNIST(root='./', train=True, transform=None, download=True)

Möglicherweise wird beim Herunterladen von mnist eine Benutzerwarnung angezeigt, aber keine Sorge, diesmal lernen Sie nicht mit dem heruntergeladenen mnist.

Speichern Sie das MNIST-Bild im PNG-Format aus der heruntergeladenen MNIST-Binärdatei.

def makeMnistPng(image_dsets):
    for idx in tqdm(range(10)):
        print("Making image file for index {}".format(idx))
        num_img = 0
        dir_path = './mnist_all/'
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        for image, label in image_dsets:
           if label == idx:
                filename = dir_path +'/mnist_'+ str(idx) + '-' + str(num_img) + '.png'
                if not os.path.exists(filename):
                    image.save(filename)
                num_img += 1
    print('Success to make MNIST PNG image files. index={}'.format(idx))

Führen Sie die Funktion aus.

makeMnistPng(mnist_data)

Dies speichert alle 600 Millionen Mnist-Bilder unter "mnist_all". Wenn Sie Bilder für jede Klasse speichern möchten, gehen Sie wie folgt vor.

def makeMnistPng(image_dsets):
    for idx in tqdm(range(10)):
        print("Making image file for index {}".format(idx))
        num_img = 0
        dir_path = './MNIST_PNG/' + str(idx)
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        for image, label in image_dsets:
            if label == idx:
                filename = dir_path +'/' + 'mnist_'+ str(idx) + '_' + str(num_img) + '.png'
                if not os.path.exists(filename):
                    image.save(filename)
                num_img += 1
    print('Success to make MNIST PNG image files. index={}'.format(idx))

Zufällige Stichprobe aus Dateien im Verzeichnis

Da ich alle Daten von mnist in einem Verzeichnis ablegen konnte, werde ich zufällig n Bilder von dort abtasten und sie in ein anderes Verzeichnis kopieren. Der Artikel, den ich als Referenz verwendet habe (fast so wie er ist), ist hier

Klassendefinition


class FileControler(object):
    def get_file_path(self, input_dir, pattern):
        #Dateipfad abrufen
        #Erstellen Sie ein Pfadobjekt, indem Sie ein Verzeichnis angeben
        path_obj = Path(input_dir)
        #Ordnen Sie Dateien im Glob-Format zu
        files_path = path_obj.glob(pattern)
        #Posix-Konvertierung zur Behandlung als Zeichenfolge
        files_path_posix = [file_path.as_posix() for file_path in files_path]
        return files_path_posix
    
    def random_sampling(self, files_path, sample_num, output_dir, fix_seed=True) -> None:
        #Stichproben
        #Pin Seed, um jedes Mal dieselbe Datei abzutasten
        if fix_seed is True:
            random.seed(0)
        #Geben Sie den Pfad der Dateigruppe und die Anzahl der Proben an
        files_path_sampled = random.sample(files_path, sample_num)
        #Erstellen, wenn kein Ausgabezielverzeichnis vorhanden ist
        os.makedirs(output_dir, exist_ok=True)
        #Kopieren
        for file_path in files_path_sampled:
            shutil.copy(file_path, output_dir)

Instanzerstellung

file_controler =FileControler()

Verzeichniseinstellungen

Legen Sie das Stichprobenquellverzeichnis und das Verzeichnis fest, in das die Stichprobendateien kopiert werden sollen.

all_file_dir = './mnist_all/'
sampled_dir = './mnist_sampled/'

Holen Sie sich den Pfad aller Dateien

pattern = '*.png'
files_path = file_controler.get_file_path(all_file_dir, pattern)

print(len(files_path))
# 60000

n Probenahme

sample_num = 100
file_controler.random_sampling(files_path, sample_num, sampled_dir)

sampled_files_path = file_controler.get_file_path(sampled_dir, pattern)
print(len(sampled_files_path))
# 100

Damit wurden n (diesmal 100) zufällig aus Mnist 60000 entnommen.

Einstufung

Wir werden die abgetasteten Bilder in Klassen unterteilen, damit sie als Datensatz für maschinelles Lernen verwendet werden können.

Holen Sie sich zunächst alle Dateinamen im abgetasteten Verzeichnis im Listenformat.

files = glob.glob("./mnist_sampled/*")

Der Operator in wird verwendet, um die Teilzeichenfolgen der Liste der Dateinamen zu bestimmen, und die Ordner werden nach Klassen unterteilt.

for i in range(10):
    os.makedirs(sampled_dir+str(i), exist_ok=True)
    for x in files:
        if '_' + str(i) in x:
            shutil.move(x, sampled_dir + str(i))

Das abgetastete Verzeichnis hat eine solche Verzeichnisstruktur.

./mnist_sampled
├── 0
├── 1
├── 2
├── 3
├── 4
├── 5
├── 6
├── 7
├── 8
└── 9

Jetzt können Sie mnist-Bilder nach dem Zufallsprinzip abtasten und klassifizieren, um einen Datensatz zu erstellen.

Recommended Posts

Erstellen Sie einen Datensatz, indem Sie zufällig MNIST-Daten auswählen
Erstellen von CSV-Beispieldaten mit Hypothese
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
So erstellen Sie während des Codierens schnell Beispieldaten für ein Array
Ich möchte eine Datei mit Python zufällig testen
Erstellen Sie eine Dummy-Datendatei
Schritte zum Erstellen eines Django-Projekts
So erstellen Sie ein Conda-Paket
Code, der zufällig eine Punktzahl generiert
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
5 Möglichkeiten zum Erstellen eines Python-Chatbots
So erstellen Sie eine Konfigurationsdatei
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
So erstellen Sie einen Klon aus Github
Erstellen Sie einen Bot, um Corona-Virus-Informationen zu retweeten
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
[MNIST] Konvertiert Daten für Keras in PNG
[Colab] So kopieren Sie einen riesigen Datensatz
Load_data wurde selbst erstellt, um Python MNIST-Beispielcode in Ihrem eigenen Dataset auszuführen
Verschiedene Möglichkeiten, ein Wörterbuch zu erstellen (Erinnerungen)
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
So erstellen Sie ein Repository aus Medien
Skript zum Erstellen einer Mac-Wörterbuchdatei
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
[Pandas-Beispielcode] Erstellung und Aggregation von Beispieldaten, die wie ein Kaufprotokoll aussehen
Aggregieren Sie die Anzahl der Schritte pro Tag aus den iPhone-Gesundheitsdaten, um eine CSV-Datei zu erstellen
Ich möchte eine WEB-Anwendung mit den Daten von League of Legends ① erstellen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
[Python] Listenverständnis Verschiedene Möglichkeiten zum Erstellen einer Liste
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
Ich möchte einfach ein Rauschmodell erstellen
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
Wenn Sie Word Cloud erstellen möchten.
Macht süchtig, wenn Kintone ein Datenspeicher ist
Erstellen Sie mit Kaitai Struct einen Binärdatenparser
So erstellen Sie Daten für CNN (Chainer)
Erstellen Sie einen Sub-Sub-Befehl mit dem Klick --netsted-Sub-Sub-Befehl -
Beispiel zum Zeichnen einer einfachen Uhr mit ebiten
Schritte zum Erstellen eines Twitter-Bots mit Python
Versuchen Sie, einen neuen Befehl unter Linux zu erstellen
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
[Hinweis] So erstellen Sie eine Ruby-Entwicklungsumgebung
So erstellen Sie ein 1-zeiliges Kivy-Eingabefeld
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
So erstellen Sie eine Rest-API in Django
Ein cooles Diagramm zur Datenanalyse von Wiire!
[PyTorch] Beispiel ⑧ ~ So erstellen Sie ein komplexes Modell ~
Erstellen Sie einen Befehl, um das Arbeitsprotokoll abzurufen
[Hinweis] So erstellen Sie eine Mac-Entwicklungsumgebung
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Verwendung von Fixture in Django zur Eingabe von Beispieldaten für das Benutzermodell
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Erstellen Sie eine Shogi-Score-Management-Anwendung mit Django 5 ~ DB-Daten an Vorlage übergeben ~
Ich habe versucht, einen Pandas-Datenrahmen zu erstellen, indem ich mit Python Informationen zum Lebensmittelrückruf abgekratzt habe