Sådan udvides MNIST-datasættet ved hjælp af tensorflow

Objektiv

Formålet med denne artikel er at:

  • Beskriv, hvordan man øger MNIST-cifrene ved hjælp af Tensorflow-pythonbiblioteket

Forudsætninger

I hele denne artikel antager vi, at:

  • Du kender python-programmeringssproget og dets syntaks
  • Du har installeret python på din maskine og er i stand til at installere relevante python-biblioteker på egen hånd
  • Du er bekendt med MNIST-datasættet og er i stand til at visualisere cifre ved hjælp af python

Hovedindhold

Trin 1. Import af MNIST-datasættet

I trin 1 importerer vi MNIST-datasættet ved hjælp af tensorflow-biblioteket. Det importerede datasæt bliver opdelt i tog / test og input / output arrays. Brug følgende kode til at importere MNIST-datasættet:

I [1]:

fra tensorflow.keras.datasets import mnist (X_train, Y_train), (X_test, Y_test) = mnist.load_data ()

Hvis du ikke er bekendt med importprocessen, så tjek følgende vejledninger:

  • https://mrdatascience.com/how-to-import-the-mnist-dataset-using-tensorflow/
  • https://mrdatascience.com/how-to-import-the-mnist-dataset-from-local-directory-using-tensorflow/

Trin 2. Identificer og plott baseline-cifre ved hjælp af Matplotlib

I trin 2 planlægger vi en undergruppe af MNIST-billederne for at hjælpe os med at forstå augmentationseffekterne på MNIST-datasættet. Brug følgende kode til at tegne et undergruppe af MNIST-billeder.

I [2]:

# import matplotlibs pyplot-bibliotek for at visualisere MNIST-billeder importere matplotlib.pyplot som plt% matplotlib inline
# definer antallet af billeder, der skal vises num_row = 2 num_col = 8 num = num_row * num_col
# få billeder billeder = X_train [0: num] labels = Y_train [0: num]
# plotbilleder fig, akser = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row))
for i inden for rækkevidde (num): ax = akser [i // num_col, i% num_col] ax.imshow (billeder [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (labels) [i])) plt.tight_layout () plt.show ()

Hvis du ikke er bekendt med visualiseringskoden, der er præsenteret ovenfor, så tjek følgende tutorial:

  • https://mrdatascience.com/how-to-plot-mnist-digits-using-matplotlib/

Trin 3. Forstå billedforstørrelse og teknikker, der er relevante for MNIST

Det originale MNIST-datasæt indeholder centraliserede, lodrette og normaliserede cifre i størrelse. Realistisk set vil håndskrevne cifre sjældent opfylde disse kriterier i applikationer i den virkelige verden. I stedet vil nogle cifre være større, mindre, roteret eller skæve mere end andre. For at oprette en robust ciffergenkendelsesmodel er det i din interesse at udvide MNIST-datasættet og fange disse typer adfærd. I trin 3 vil vi gennemgå de forskellige typer augmentation-teknikker, vi kan bruge til at forbedre MNIST-cifret datasæt. I denne tutorial vil vi bruge klassen ImageDataGenerator, der er tilgængelig i Tensorflow.Keras-pythonbiblioteket. Du kan finde mere information om denne klasse her: https://keras.io/preprocessing/image/.

Rotation

Den første type transformation, vi vil undersøge, er "rotation". Billedrotationstransformationer udføres vha. Argumentet rotation_range i klassen ImageDataGenerator. Denne parameter bruges til tilfældigt at rotere billeder omkring billedets centroid opad i rotations_range-vinklen. Koden nedenfor kan bruges til at rotere MNIST-billeder.

I [3]:

# angiv den maksimale rotations_range vinkel rotation_range_val = 30
# import relevant bibliotek fra tensorflow.keras.preprocessing.image import ImageDataGenerator
# oprette klasseobjektet datagen = ImageDataGenerator (rotation_range = rotation_range_val)
# monter generatoren datagen.fit (X_train.reshape (X_train.shape [0], 28, 28, 1))
# definér antal rækker & kolonner num_row = 2 num_col = 8 num = num_row * num_col
# plot før udskrivning ('FØR: \ n') # plotbilleder fig1, akser1 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for i inden for rækkevidde (num): ax = axes1 [i // num_col, i% num_col] ax.imshow (X_train [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (Y_train [i])) plt.tight_layout () plt .at vise()
# plot efter udskrivning ('AFTER: \ n') fig2, axes2 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for X, Y i datagen.flow (X_train.reshape (X_train) .form [0], 28, 28, 1), Y_train.reshape (Y_train.shape [0], 1), batch_size = num, shuffle = False): for i inden for området (0, num): ax = axes2 [ i // num_col, i% num_col] ax.imshow (X [i] .reshape (28,28), cmap = 'grå_r') ax.set_title ('Label: {}'. format (int (Y [i]) ))) break plt.tight_layout () plt.show ()

Flytte

Den anden type transformation, vi vil undersøge, er “skift”. Billedskifttransformationer udføres ved hjælp af bredden_skift_range og højde_forskyvning_rangen. Disse parametre bruges til at oversætte billedet lodret eller vandret. Koden nedenfor kan bruges til at skifte MNIST-billeder.

I [4]:

# angiv bredde- og højdeforskydningsargumenter width_shift_val = 0.25 height_shift_val = 0.25
# import relevant bibliotek fra tensorflow.keras.preprocessing.image import ImageDataGenerator
# Opret klasseobjekt datagen = ImageDataGenerator (bredde_skift_range = bredde_skift_val, højde_forskyvning_range = højde_forskyvning_val)
# monter generatoren datagen.fit (X_train.reshape (X_train.shape [0], 28, 28, 1))
# definér antal rækker & kolonner num_row = 2 num_col = 8 num = num_row * num_col
# plot før udskrivning ('FØR: \ n') # plotbilleder fig1, akser1 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for i inden for rækkevidde (num): ax = axes1 [i // num_col, i% num_col] ax.imshow (X_train [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (Y_train [i])) plt.tight_layout () plt .at vise()
# plot efter udskrivning ('AFTER: \ n') fig2, axes2 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for X, Y i datagen.flow (X_train.reshape (X_train) .form [0], 28, 28, 1), Y_train.reshape (Y_train.shape [0], 1), batch_size = num, shuffle = False): for i inden for området (0, num): ax = axes2 [ i // num_col, i% num_col] ax.imshow (X [i] .reshape (28,28), cmap = 'grå_r') ax.set_title ('Label: {}'. format (int (Y [i]) ))) break plt.tight_layout () plt.show ()

Klippe

Den tredje type transformation, vi vil undersøge, er “forskydning”. Billedforskydningstransformationer udføres vha. Argumentet shear_range. Forskydningstransformationen bruges til at fortrænge pixels i en fast retning (tilfældigt valgt op til shear_range-værdi) med et beløb, der er proportionalt med dets underskrevne afstand fra linjen, der er parallel med denne retning og går gennem oprindelsen. Koden nedenfor kan bruges til at klippe MNIST-billeder.

I [5]:

# angiv forskydningsargumentet shear_range_val = 45
# import relevant bibliotek fra tensorflow.keras.preprocessing.image import ImageDataGenerator
# oprette klasseobjekt datagen = ImageDataGenerator (shear_range = shear_range_val)
# monter generatoren datagen.fit (X_train.reshape (X_train.shape [0], 28, 28, 1))
# definér antal rækker & kolonner num_row = 2 num_col = 8 num = num_row * num_col
# plot før udskrivning ('FØR: \ n') # plotbilleder fig1, akser1 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for i inden for rækkevidde (num): ax = axes1 [i // num_col, i% num_col] ax.imshow (X_train [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (Y_train [i])) plt.tight_layout () plt .at vise()
# plot efter udskrivning ('AFTER: \ n') fig2, axes2 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for X, Y i datagen.flow (X_train.reshape (X_train) .form [0], 28, 28, 1), Y_train.reshape (Y_train.shape [0], 1), batch_size = num, shuffle = False): for i inden for området (0, num): ax = axes2 [ i // num_col, i% num_col] ax.imshow (X [i] .reshape (28,28), cmap = 'grå_r') ax.set_title ('Label: {}'. format (int (Y [i]) ))) break plt.tight_layout () plt.show ()

Zoom

Den endelige type transformation, vi vil undersøge, er “zoom”. Billedzoomtransformationer udføres vha. Argumentet zoom_range. Zoomtransformationen bruges til at skalere billedet tilfældigt op eller ned i lodret og / eller vandret retning. Koden nedenfor kan bruges til at zoome MNIST-billeder.

I [6]:

# angiv zoomargumentet zoom_range_val = [0.5,1.5]
# import relevant bibliotek fra tensorflow.keras.preprocessing.image import ImageDataGenerator
# Opret klasseobjekt datagen = ImageDataGenerator (zoom_range = zoom_range_val)
# monter generatoren datagen.fit (X_train.reshape (X_train.shape [0], 28, 28, 1))
# definér antal rækker & kolonner num_row = 2 num_col = 8 num = num_row * num_col
# plot før udskrivning ('FØR: \ n') # plotbilleder fig1, akser1 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for i inden for rækkevidde (num): ax = axes1 [i // num_col, i% num_col] ax.imshow (X_train [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (Y_train [i])) plt.tight_layout () plt .at vise()
# plot efter udskrivning ('AFTER: \ n') fig2, axes2 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for X, Y i datagen.flow (X_train.reshape (X_train) .form [0], 28, 28, 1), Y_train.reshape (Y_train.shape [0], 1), batch_size = num, shuffle = False): for i inden for området (0, num): ax = axes2 [ i // num_col, i% num_col] ax.imshow (X [i] .reshape (28,28), cmap = 'grå_r') ax.set_title ('Label: {}'. format (int (Y [i]) ))) break plt.tight_layout () plt.show ()

Trin 4. Udvid Datasættet MNIST

Endelig kan vi kombinere alle de tidligere nævnte transformationer for at opnå unikke cifrepræsentationer, der nu kan bruges til at forbedre ciffergenkendelsesmodelpræstation.

I [7]:

# angiv argumenterne rotation_range_val = 30 bredde_skift_val = 0,25 højde_skift_val = 0,25 shear_range_val = 45 zoom_range_val = [0.5,1.5]
# import relevant bibliotek fra tensorflow.keras.preprocessing.image import ImageDataGenerator
# oprette klasseobjektet datagen = ImageDataGenerator (rotation_range = rotation_range_val, bredde_skift_range = bredde_skift_val, højde_skift_range = højde_skift_val, zoom_range = zoom_range_val,)
# monter generatoren datagen.fit (X_train.reshape (X_train.shape [0], 28, 28, 1))
# definér antal rækker & kolonner num_row = 4 num_col = 8 num = num_row * num_col
# plot før udskrivning ('FØR: \ n') # plotbilleder fig1, akser1 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for i inden for rækkevidde (num): ax = axes1 [i // num_col, i% num_col] ax.imshow (X_train [i], cmap = 'grå_r') ax.set_title ('Label: {}'. format (Y_train [i])) plt.tight_layout () plt .at vise()
# plot efter udskrivning ('AFTER: \ n') fig2, axes2 = plt.subplots (num_row, num_col, figsize = (1,5 * num_col, 2 * num_row)) for X, Y i datagen.flow (X_train.reshape (X_train) .form [0], 28, 28, 1), Y_train.reshape (Y_train.shape [0], 1), batch_size = num, shuffle = False): for i inden for området (0, num): ax = axes2 [ i // num_col, i% num_col] ax.imshow (X [i] .reshape (28,28), cmap = 'grå_r') ax.set_title ('Label: {}'. format (int (Y [i]) ))) break plt.tight_layout () plt.show ()

Resumé

Efter at have læst dette dokument, skal du:

  • Ved, hvordan du bruger ImageDataGenerator
  • Forstå, hvordan rotations-, forskydnings-, forskydnings- og zoomtransformationer kan bruges til at øge MNIST-datasættet

Referencer

[1] LeCun, Y. (nd). Den MNIST DATABASE. Hentet 5. januar 2020 fra http://yann.lecun.com/exdb/mnist/.

[2] tf.keras.datasets.mnist.load_data: TensorFlow Core r2.1. (Nd). Hentet 9. januar 2020 fra https://www.tensorflow.org/api_docs/python/tf/keras/datasets/mnist/load_data.

[3] Forbehandling af billeder. (Nd). Hentet 12. januar 2020 fra https://keras.io/preprocessing/image/.

Opret forbindelse til Mr Data Science:

mrdatascience.com, GitHub, Medium, YouTube