――Dies ist das Ergebnis meiner eigenen Studienaufzeichnung über maschinelles Lernen und tiefes Lernen. ――Dieses Mal klassifiziert Google Colaboratory zwei Arten von Bilddaten. Beurteilen Sie "mein Kind (Hund)" und "außer meinem Kind (Hund)" auf dem Bild des Shiba-Hundes. ――Beschreiben Sie so weit wie möglich die Teile, die aufgrund verschiedener Fehler gestolpert sind, und beschreiben Sie sie so, dass jeder sie leicht reproduzieren kann. ――Dies ist das erste Mal, dass Sie einen Artikel über Qiita veröffentlichen. Wenn Sie also Hinweise oder Korrekturen haben, teilen Sie uns dies bitte mit.
――Die Personen, die Deep Learning studieren und verschiedene Analysen durchführen möchten, aber keine Kenntnisse und Informationen haben und in und um Google Colaboratory auf verschiedene Weise gestolpert sind und die Analyse nicht wie erwartet abläuft (Artikel für fortgeschrittene Benutzer von Bali Bali) Nicht!)
――Ich habe 2018 angefangen, maschinelles Lernen zu studieren, und seit 2019 bin ich ein Mitglied der Gesellschaft, das hauptsächlich samstags und sonntags studiert, wenn es keine Arbeit gibt, und mich auf tiefes Lernen konzentriere. ――Ich habe keine Erfahrung als Ingenieur und arbeite als Mitglied der Gesellschaft. Ich habe keine Chance, maschinelles Lernen in der Praxis anzuwenden, aber je mehr ich studiere, desto mehr werde ich vom tiefen Charme dieses Fachs abhängig und im September 2019 ** JDLA Deep Learning für Engeneer 2019 # Ich habe 2 **. ――Ich möchte Erfahrungen in verschiedenen Deep-Learning-Analysen sammeln und nehme derzeit an der Fallanalyse mit tatsächlichen Daten teil. ――Bei Ende März 2020 werde ich mich mit 18 Dienstjahren aus dem öffentlichen Dienst zurückziehen und ab April den Job zu einem Dateningenieur wechseln.
-: Closed_book: ** "Deep Learning mit Python und Keras" **: boy_tone1: Francois Chollet Übersetzt von Quipe Co., Ltd. Übersetzt von Yusuke Negago, veröffentlicht von My Navi Publishing Co., Ltd.
-Sie müssen ein ** Google-Konto ** haben.
** Schritt 1 Sammeln Sie Fotos zur Analyse, ändern Sie die Größe und laden Sie sie im Zip-Format auf Google Drive hoch ** ** Schritt 2 Erstellen Sie einen Arbeitsordner in Google Drive und dekomprimieren Sie die Daten. ** ** ** ** Schritt 3 Kopieren Sie die angegebene Anzahl von Shiba-Hundefotos (jeweils 50) in die Ordner Zug, Test und Validierung. ** ** ** ** Schritt 4 Modellbau ** ** Schritt 5 Lernen ** ** Schritt 6 Ergebnis ** ** Schritt 7 Datenerweiterung ** ** Schritt 8 Andere Anpassungsergebnisse (Änderung der Bildeingabegröße usw.) **
Lassen Sie mich zunächst mein Kind vorstellen, bevor ich mit dem Analyseverfahren fortfahre. Seit Januar 2020 bin ich eine 16-jährige Shiba. Der Name ist ** Mirin **. Der Name ist meine Frau, aber da es sich um einen japanischen Hund handelt, wurde er im japanischen Stil benannt. ** Schon ist dieser Mirin süß und süß! ** ** ** Es gibt viele niedliche Bilder dieses Mirins in der Zip-Datei für Analysedaten (mydog), die später veröffentlicht werden. Wir hoffen, dass Sie sich dies auch ansehen und gemeinsam die verschiedenen Ausdrucksformen unserer Mirin genießen (← ** Eltern-Idiot **).
――Ich habe Fotos von Mirin aus meinen Smartphone- und Digitalkamera-Ordnern gesammelt. Zu diesem Zeitpunkt habe ich den Zeitraum des Fotos ausgewählt, indem ich die Welpenperiode ausschloss und mich auf den Zeitraum von 12 bis 16 Jahren (aktuell) konzentrierte, um zu verhindern, dass die Anzahl der Merkmale verstreut wird.
――Da jedes Bild verschiedene Fotos enthält, ist es nicht für die Verwendung als Daten geeignet. Deshalb habe ich es so zugeschnitten, dass das Verhältnis nur des Hundeelements in einem Bild so hoch wie möglich ist. Schneiden Sie mit einer Fotoretuschier-Software (Photoshop Elements, Gimp usw.) mit einem Seitenverhältnis von 1: 1 gleichmäßig aus, ohne sich um die Bildgröße zu kümmern, und speichern Sie sie als Bilddatei (JPG-Datei). --Die ausgeschnittene Datei verwendet Software wie ** Verkleinerung **, und diesmal handelt es sich um ein 320 x 320 Pixel großes Bild. Ändern Sie die Größe in loser Schüttung als. Ich habe ** FlexRena84 ** zum Batch-Umbenennen von Bilddateien verwendet. ―― Bereiten Sie auf diese Weise 60 Bilddateien von Mirin und 60 anderen Shiba-Hunden vor, speichern Sie sie in den Ordnern "mydog" und "otherdogs" und erstellen Sie für jeden Ordner eine Zip-Datei.
Ich werde ein paar Fotos posten. ** Mirins Foto (mein Hund) **
** Fotos von anderen Shiba-Hunden (anderen Hunden) **
--Erstellen Sie einen Ordner in Google Drive, um Daten im Voraus zu speichern.
Starten Sie von hier aus Google Colaboratory und arbeiten Sie mit Colab.
Informationen für Erstbenutzer finden Sie unter ** hier **.
#Google Drive-Mount
from google.colab import drive
drive.mount('/content/drive')
# cd '/content/drive/'My Drive/'Colab Notebooks'Ändern Sie das aktuelle Verzeichnis in den Arbeitsordner in
%cd '/content/drive/'My Drive/Colab Notebooks/Self_Study/02_mydog_or_otherdogs/original_data
# mydog1.Zip entpacken
!unzip "mydog1.zip"
# otherdogs1.Zip entpacken
!unzip "otherdogs1".zip"
#Überprüfen Sie die Anzahl der entpackten Dateien
!ls ./original_data/mydog1 | wc -l
!ls ./original_data/otherdogs1 | wc -l
** Hinweis) Daten sollten vor der Dekomprimierung komprimiert und auf Google Drive hochgeladen werden. </ font> ** Ich habe versucht, ohne Komprimierung direkt auf Google Drive hochzuladen, aber es dauert sehr lange. Da die Operation im Labor ausgeführt wird, verwendet der Dekomprimierungsbefehl den Linux-Befehl, der mit "!" Beginnt. Eine Meldung wie diese wird angezeigt und die Datei wird dekomprimiert.
#Laden der erforderlichen Bibliotheken
import os, shutil
#Definieren Sie den gewünschten Dateipfad
# cd '/content/drive/'My Drive/'Colab Notebooks'Ändern Sie das aktuelle Verzeichnis in den Arbeitsordner in
%cd '/content/drive/'My Drive/Colab Notebooks/Self_Study/02_mydog_or_otherdogs
# original_Festlegen des Dateipfads des Datenordners
original_dataset_dir = 'original_data'
# original_data(Definitionsname'original_dataset_dir')Legen Sie die folgenden zwei Ordnerpfade fest.
original_mydog_dir = 'original_data/mydog'
original_otherdogs_dir = 'original_data/otherdogs'
# use_Festlegen des Dateipfads von Daten
base_dir = 'use_data'
# use_Datenordner(Definitionsname'base_dir')Legen Sie die folgenden drei Ordnerpfade fest. Erstellen Sie einen Ordner.
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)
#Im Zugordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
train_mydog_dir = os.path.join(train_dir, 'mydog')
os.mkdir(train_mydog_dir)
train_otherdogs_dir = os.path.join(train_dir, 'otherdogs')
os.mkdir(train_otherdogs_dir)
#Im Validierungsordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
validation_mydog_dir = os.path.join(validation_dir, 'mydog')
os.mkdir(validation_mydog_dir)
validation_otherdogs_dir = os.path.join(validation_dir, 'otherdogs')
os.mkdir(validation_otherdogs_dir)
#Im Testordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
test_mydog_dir = os.path.join(test_dir, 'mydog')
os.mkdir(test_mydog_dir)
test_otherdogs_dir = os.path.join(test_dir, 'otherdogs')
os.mkdir(test_otherdogs_dir)
#Zug für Zug_mydog_Kopieren Sie 30 Mydog-Dateien in das Verzeichnis
fnames = ['mydog{}.jpg'.format(i) for i in range(30)]
for fname in fnames:
src = os.path.join(original_mydog_dir, fname)
dst = os.path.join(train_mydog_dir, fname)
shutil.copyfile(src, dst)
#Validierung zur Validierung_mydog_Kopieren Sie 20 Mydog-Dateien nach dir
fnames = ['mydog{}.jpg'.format(i) for i in range(30,50)]
for fname in fnames:
src = os.path.join(original_mydog_dir, fname)
dst = os.path.join(validation_mydog_dir, fname)
shutil.copyfile(src, dst)
#Test für Test_mydog_Kopieren Sie 10 Mydog-Dateien nach dir
fnames = ['mydog{}.jpg'.format(i) for i in range(50,60)]
for fname in fnames:
src = os.path.join(original_mydog_dir, fname)
dst = os.path.join(test_mydog_dir, fname)
shutil.copyfile(src, dst)
#Zug für Zug_otherdogs_Kopieren Sie 30 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(30)]
for fname in fnames:
src = os.path.join(original_otherdogs_dir, fname)
dst = os.path.join(train_otherdogs_dir, fname)
shutil.copyfile(src, dst)
#Validierung zur Validierung_otherdogs_Kopieren Sie 20 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(30, 50)]
for fname in fnames:
src = os.path.join(original_otherdogs_dir, fname)
dst = os.path.join(validation_otherdogs_dir, fname)
shutil.copyfile(src, dst)
#Test für Test_otherdogs_Kopieren Sie 10 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(50, 60)]
for fname in fnames:
src = os.path.join(original_otherdogs_dir, fname)
dst = os.path.join(test_otherdogs_dir, fname)
shutil.copyfile(src, dst)
#Überprüfen Sie die Anzahl der in jedem Ordner gespeicherten Dateien
print('total training mydog images:', len(os.listdir(train_mydog_dir)))
print('total training otherdogs images:', len(os.listdir(train_otherdogs_dir)))
print('total validation mydog images:', len(os.listdir(validation_mydog_dir)))
print('total validation otherdogs images:', len(os.listdir(validation_otherdogs_dir)))
print('total test mydog images:', len(os.listdir(test_mydog_dir)))
print('total test otherdogs images:', len(os.listdir(test_otherdogs_dir)))
Die Anzahl der Dateien wird wie folgt angezeigt.
Die Größe des Eingabebildes in der Originaldatei beträgt 320 * 320, diesmal wird die Größe der Eingabe jedoch als 150 * 150 gelesen.
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
Die Modellkonfiguration wird folgendermaßen angezeigt.
from keras import optimizers
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
Diesmal wurde keine Datenerweiterung implementiert.
from keras.preprocessing.image import ImageDataGenerator
# rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
# target directory
train_dir,
# resized to 150x150
target_size=(150, 150),
batch_size=20,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50)
Wenn das Lernen beginnt, sieht die Anzeige folgendermaßen aus und die Berechnung wird fortgesetzt. (Es wird eine Weile dauern)
model.save('mydog_or_otherdogs_01a.h5')
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
Ergebnisdiagramm
Vor allem Genauigkeit
--Die Übertragungsgenauigkeit hat von Anfang an 100% erreicht.
Auf der anderen Seite über Verlust
Von oben trainieren wir die Zugdaten. Immerhin war die Anzahl der Daten ursprünglich gering, so dass das Ergebnis unvermeidlich ist.
Wenden wir dieses Modell mit dem folgenden Code auf die Testdaten an, um die Klassifizierungsgenauigkeit zu überprüfen. ** Hinweis) ImageDataGenerator schlägt ohne Konvertierung fehl, wenn der Zielordner keine zwei oder mehr Unterordner enthält. ** (In diesem Fall benötigen Sie zwei Unterordner, mydog und otherdogs) </ font>
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(150,150),
batch_size=50,
class_mode='binary')
test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test loss:', test_loss)
print('test acc:', test_acc)
test loss: 2.7508722241719563 test acc: 0.7666666607062022
Die Genauigkeit dieses Implementierungsergebnisses beträgt ca. 76%. Weitere Anpassungen sind erforderlich.
Verwenden wir weiterhin das vorherige Modell, führen Sie eine Datenerweiterung für die Zugdaten durch und trainieren Sie sie erneut. Der Code für den aufgefüllten Teil des ImageDataGenerator befindet sich unten.
#Aufgeblasene Zugdaten
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,)
#Validierungsdaten werden nicht aufgefüllt
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
# Target directory
train_dir,
# resized to 150x150
target_size=(150, 150),
batch_size=32,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=32,
class_mode='binary')
Lernen Sie das Modell mit 100 Epochen.
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50)
Speichern Sie das trainierte Modell.
model.save('mydog_or_otherdogs_01b.h5')
Das resultierende Diagramm ist unten dargestellt.
Wenden wir das trainierte Modell auf die Testdaten an und sehen die Klassifizierungsgenauigkeit. test loss: 2.480180886810025 test acc: 0.7499999996026357 Im Allgemeinen scheint das Auffüllen die Genauigkeit zu verbessern, aber in diesem Beispiel ist die Genauigkeit im Vergleich zum vorherigen etwas gesunken. Da die Anzahl der Datenproben ursprünglich gering ist, frage ich mich, ob dies der Fall ist.
Bisher wurde die Größe des Eingabebildes auf 150 x 150 Pixel eingestellt. Was passiert, wenn ich die Größe des Eingabebilds auf die Originalgröße von 320 x 320 Pixel ändere? Lassen Sie uns das Modell anhand des bisher erstellten Modells auf zwei Arten trainieren: ** ① ohne Datenerweiterung ** ** ② mit Datenerweiterung ** und sehen Sie sich die Implementierungsergebnisse an.
** * Hinzugefügt 2020/1/4 Da der numerische Wert falsch war, wurde der numerische Wert auf den richtigen korrigiert und der Kommentar ebenfalls überarbeitet. </ font> ** Die Klassifizierungsgenauigkeit der Testdaten ist wie folgt. Ergebnis von ① test loss: 1.6523902654647826 ~~(1.7524430536416669)~~ test acc: 0.75 ~~(0.8166666567325592)~~
Ergebnis von ② test loss: 2.102495942115784 ~~(1.382319548305386)~~ test acc: 0.75 ~~(0.8666666634877522)~~
Im Vergleich zur Eingabegröße von 150 Pixel gab es bei der Eingabegröße von 320 Pixel keinen großen Unterschied in Bezug auf Fehler und Genauigkeit. </ font>
Das nächste Mal möchte ich erneut analysieren, wenn ich die Anzahl der Bilddatenproben erhöhe.
Recommended Posts