Cvičení – import a vyčištění dat z fotek
Když teď víme o čištění a oddělení dat, můžeme tyto principy použít na náš projekt klasifikace hornin.
Příprava dat
Potřebujeme vytvořit dvě datové sady z fotek NASA pro náš klasifikační projekt. Jedna datová sada je určená pro trénování a druhá je určená k testování. Než je načteme do datových sad pro zpracování, je potřeba obrázky vyčistit a oddělit. Data by se měla zpracovávat náhodným způsobem, a ne v přesném pořadí, v jakém byla poskytována NASA.
K přípravě dat použijeme kód, který provede tyto čtyři kroky:
- Krok 1. Získat data: Řekněte počítači, kam chcete získat data obrázku.
- Krok 2. Vyčistěte data: Oříznout obrázky na stejnou velikost.
- Krok 3. Oddělte data: Data oddělte náhodném prohazováním a náhodným výběrem.
- Krok 4. Načtení náhodných datových sad: Příprava náhodných vzorků pro trénovací a testovací datové sady
Krok 1: Získání dat
Potřebujeme dát počítači vědět, kde může data najít. V našem příkladu používáme obrázky hornin, které poskytuje NASA. Fotky jsme si už stáhli a uložili do složky Data , která je ve stejné složce projektu jako soubor Jupyter Notebook. Dáme počítači vědět, aby načetl data obrázku ze složky Data .
Krok 2: Vyčištění dat
Fotky hornin z NASA mají různé velikosti: malé, střední a velké. Obrázky ořízíme tak, aby byly stejné velikosti (224 × 224 pixelů). Změníme velikost imagí, protože počítače očekávají, že obrázky budou mít stejnou velikost. Pokud se velikosti obrázků liší, není pro počítače snadné je zpracovat. Třídu torchvision transforms.Compose
používáme ke změně velikosti obrázků na upřednostňované rozměry a uložení upravených obrázků do místních proměnných.
Krok 3: Oddělení dat
20 % vyčištěných obrázků je určené pro trénování a dalších 80 % je pro testování. Počítač by měl vybírat obrázky náhodným způsobem a neměl je používat v přesném pořadí, v jakém je poskytla NASA. K oddělení používáme dvě techniky: náhodné prohazování a náhodné výběry.
Vytvoříme indexový seznam, který odpovídá počtu obrázků. Tento seznam používáme k vyhledání indexu obrázku, který představuje 20 % dat. Toto umístění ukládáme do proměnné s názvem split
. Seznam indexů promícháme a pomocí umístění image vytvoříme split
dvě datové sady pro trénování a testování. Výsledné sady se skládají z obrázků, které jsou vyčištěny a jsou vybrány náhodně.
Tuto funkci používáme load_split_train_test
k získání prohazovaných dat pro trénování a testování.
Krok 4: Načtení náhodných datových sad
K načtení náhodných obrázků z našich dvou datových sad voláme SubsetRandomSampler
funkci z knihovny torch.utils.data.sampler. Načteme náhodné vzorky 16 obrázků.
Přidání kódu pro vyčištění a oddělení dat
Jsme připraveni přidat kód pro vyčištění a oddělení dat.
V editoru Visual Studio Code se vraťte do souboru Jupyter Notebook.
Do nové buňky přidejte následující kód pro import knihovny PIL (Python Imaging Library ). Tuto knihovnu použijeme k vizualizaci obrázků. Po přidání nového kódu spusťte buňku.
# Tell the machine what folder contains the image data data_dir = './Data' # Read the data, crop and resize the images, split data into two groups: test and train def load_split_train_test(data_dir, valid_size = .2): # Transform the images to train the model train_transforms = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.Resize(224), transforms.ToTensor(), ]) # Transform the images to test the model test_transforms = transforms.Compose([transforms.RandomResizedCrop(224), transforms.Resize(224), transforms.ToTensor(), ]) # Create two variables for the folders with the training and testing images train_data = datasets.ImageFolder(data_dir, transform=train_transforms) test_data = datasets.ImageFolder(data_dir, transform=test_transforms) # Get the number of images in the training folder num_train = len(train_data) # Create a list of numbers from 0 to the number of training images - 1 # Example: For 10 images, the variable is the list [0,1,2,3,4,5,6,7,8,9] indices = list(range(num_train)) # If valid_size is .2, find the index of the image that represents 20% of the data # If there are 10 images, a split would result in 2 # split = int(np.floor(.2 * 10)) -> int(np.floor(2)) -> int(2) -> 2 split = int(np.floor(valid_size * num_train)) # Randomly shuffle the indices # For 10 images, an example would be that indices is now the list [2,5,4,6,7,1,3,0,9,8] np.random.shuffle(indices) from torch.utils.data.sampler import SubsetRandomSampler # With the indices randomly shuffled, # grab the first 20% of the shuffled indices, and store them in the training index list # grab the remainder of the shuffled indices, and store them in the testing index list # Given our example so far, this would result is: # train_idx is the list [1,5] # test_idx is the list [4,6,7,1,3,0,9,8] train_idx, test_idx = indices[split:], indices[:split] # Create samplers to randomly grab items from the training and testing indices lists train_sampler = SubsetRandomSampler(train_idx) test_sampler = SubsetRandomSampler(test_idx) # Create loaders to load 16 images from the train and test data folders # Images are chosen based on the shuffled index lists and by using the samplers trainloader = torch.utils.data.DataLoader(train_data, sampler=train_sampler, batch_size=16) testloader = torch.utils.data.DataLoader(test_data, sampler=test_sampler, batch_size=16) # Return the loaders so you can grab images randomly from the training and testing data folders return trainloader, testloader # Using the function that shuffles images, # create a trainloader to load 20% of the images # create a testloader to load 80% of the images trainloader, testloader = load_split_train_test(data_dir, .2) # Print the type of rocks that are included in the trainloader print(trainloader.dataset.classes)
Po spuštění buňky by se ve výstupu měly zobrazit dva typy klasifikace hornin: ['Basalt', 'Highland']
.
Data vesmírných hornin se teď naimportují, vyčistí a oddělí. Jsme připraveni vytrénovat model s 80 % dat a spustit testy se zbývajícími 20 %.