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.
Google Colaboratory PyTorch 1.6.0
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))
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
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)
file_controler =FileControler()
Legen Sie das Stichprobenquellverzeichnis und das Verzeichnis fest, in das die Stichprobendateien kopiert werden sollen.
all_file_dir = './mnist_all/'
sampled_dir = './mnist_sampled/'
pattern = '*.png'
files_path = file_controler.get_file_path(all_file_dir, pattern)
print(len(files_path))
# 60000
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.
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