[PYTHON] Ich habe versucht, CNN mit Resnet fein abzustimmen

Feinabstimmung mit Python Resnet

** In diesem Artikel wird die Feinabstimmung mit Resnet vorgestellt. ** **.

Diesmal ist es normal, um zu überprüfen, wie effektiv die Feinabstimmung ist Ich möchte [mit CNN erstelltes Modell] und [fein abgestimmtes Modell] vergleichen.

Entwicklungsumgebung

Ich habe mit Google Colab gelernt, werde es aber auch mit lokalen Annahmen als möglich beschreiben. python : 3.7.0 keras : 2.4.3 tensorflow : 2.2.0

Was ist Resnet?

Resnet ist ein [erlerntes] neuronales Faltungsnetzwerk, das mehr als 1 Million Blätter in einer Datenbank namens Imagenet umfasst. Und dieses Netzwerk, auch Resnet 50 genannt, hat 50 Schichten und kann in 1000 Kniekategorien eingeteilt werden.

Was ist Feinabstimmung?

Umschulung der Gewichte des gesamten Modells mit den trainierten Netzwerkgewichten als Anfangswert. Daher möchten wir einen besseren Diskriminator schaffen, indem wir nach Verwendung des oben genannten Resnet50 neu lernen.

Bild zu verwenden

Es schien interessant zu sein, also habe ich versucht, 3 Arten japanischer Zigaretten zu verwenden. ** Mobius: 338 Blatt ** ** Sieben Sterne: 552 Blatt ** ** Winston: 436 Blatt **

Diesmal handelt es sich um eine Überprüfung der Feinabstimmung, sodass das obige Bild aus dem Internet abgerufen wurde.

Normales CNN

Die Konfiguration ist wie folgt. 1.png

Das Lernen führte zu den folgenden Ergebnissen. tobacco_dataset_reslut.jpg

Es ist ziemlich schlecht, weil wir keine Vorverarbeitung wie das Zuschneiden des Bildes durchgeführt haben. Liegt es in den Testdaten bei [60%]?

Quelle

normal_cnn.py


from PIL import Image
import numpy as np
import glob
import os
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import MaxPooling2D
from keras.layers import  Conv2D, Flatten, Dense, Dropout
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

root = "tobacco_dataset"
folder = os.listdir(root)
image_size = 224
dense_size = len(folder)
epochs = 30
batch_size = 16

X = []
Y = []
for index, name in enumerate(folder):
    dir = "./" + root + "/" + name
    print("dir : ", dir)
    files = glob.glob(dir + "/*")
    print("number : " + str(files.__len__()))
    for i, file in enumerate(files):
      try:
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size, image_size))
        data = np.asarray(image)
        X.append(data)
        Y.append(index)
      except :
          print("read image error")

X = np.array(X)
Y = np.array(Y)
X = X.astype('float32')
X = X / 255.0

Y = np_utils.to_categorical(Y, dense_size)
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.15)

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(image_size, image_size, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(dense_size, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

result = model.fit(X_train, y_train, validation_split=0.15, epochs=epochs, batch_size=batch_size)

x = range(epochs)
plt.title('Model accuracy')
plt.plot(x, result.history['accuracy'], label='accuracy')
plt.plot(x, result.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), borderaxespad=0, ncol=2)

name = 'tobacco_dataset_reslut.jpg'
plt.savefig(name, bbox_inches='tight')
plt.close()


Feinabstimmung mit Resnet

Da die Komposition ziemlich tief ist und nicht auf Qiita eingefügt werden kann, werde ich die URL beschreiben https://github.com/daichimizuno/cnn_fine_tuning/blob/master/finetuning_layer.txt

Zusätzlich zum ursprünglichen Resnet werden die Aktivierungsfunktion Relu und Dropout um 0,5 hinzugefügt. Übrigens sind die folgenden Quellen die Quellen bei Verwendung von Resnet. Es scheint, dass Keras eine Bibliothek für Resnet enthält.


ResNet50 = ResNet50(include_top=False, weights='imagenet',input_tensor=input_tensor)

Das Lernen führte zu den folgenden Ergebnissen. resnet_tobacco_dataset_reslut.jpg

Liegt es in den Testdaten bei [85%]?

Quelle

resnet_fine_tuning.py


from PIL import Image
import numpy as np
import glob
import os
from keras.utils import np_utils
from keras.models import Sequential, Model
from keras.layers import Flatten, Dense,Input, Dropout
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from keras.applications.resnet50 import ResNet50
from keras import optimizers

root = "tobacco_dataset"
folder = os.listdir(root)
image_size = 224
dense_size = len(folder)
epochs = 30
batch_size = 16

X = []
Y = []
for index, name in enumerate(folder):
    dir = "./" + root + "/" + name
    print("dir : ", dir)
    files = glob.glob(dir + "/*")
    print("number : " + str(files.__len__()))
    for i, file in enumerate(files):
      try:
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size, image_size))
        data = np.asarray(image)
        X.append(data)
        Y.append(index)
      except :
          print("read image error")

X = np.array(X)
Y = np.array(Y)
X = X.astype('float32')
X = X / 255.0

Y = np_utils.to_categorical(Y, dense_size)
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.15)

input_tensor = Input(shape=(image_size, image_size, 3))
ResNet50 = ResNet50(include_top=False, weights='imagenet',input_tensor=input_tensor)

top_model = Sequential()
top_model.add(Flatten(input_shape=ResNet50.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(dense_size, activation='softmax'))

top_model = Model(input=ResNet50.input, output=top_model(ResNet50.output))
top_model.compile(loss='categorical_crossentropy',optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),metrics=['accuracy'])

top_model.summary()
result = top_model.fit(X_train, y_train, validation_split=0.15, epochs=epochs, batch_size=batch_size)

x = range(epochs)
plt.title('Model accuracy')
plt.plot(x, result.history['accuracy'], label='accuracy')
plt.plot(x, result.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), borderaxespad=0, ncol=2)

name = 'resnet_tobacco_dataset_reslut.jpg'
plt.savefig(name, bbox_inches='tight')
plt.close()


Zusammenfassung

Beim Vergleich von normalem CNN und Feinabstimmung können Sie feststellen, dass sich die Feinabstimmung seit etwa Epoche 10 stark verbessert hat. Da dies ein Umlernen mit Resnet ist, stelle ich mir vor, dass es sich in dem Teil ausbreiten wird, in dem die korrekte Antwortrate von Resnet zunimmt und die Diskriminierung von Zigaretten beeinflusst, aber eine detailliertere Analyse erforderlich ist. ..

In jedem Fall war das Ergebnis jedoch in Bezug auf die Tabakbeurteilung erheblich höher als das eines normalen CNN. Ich denke, dass noch bessere Ergebnisse erzielt werden, wenn Sie Bilder auswählen und eine Vorverarbeitung durchführen. Wenn Sie also können, versuchen Sie es bitte!

【Github】 https://github.com/daichimizuno/cnn_fine_tuning

Bitte weisen Sie auf Fehler oder unklare Punkte hin. das ist alles

Recommended Posts

Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe versucht, mit PyCaret zu clustern
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, Harry Potters Gruppierungshut mit CNN umzusetzen
Ich habe versucht, Sätze mit summpy zusammenzufassen
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Ich habe versucht, DeepPose mit PyTorch zu implementieren
Verschiedene Feinabstimmungen mit Mobilenet v2
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, Sätze mit GPT-2 zu generieren
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe Linebot mit Flasche (Anaconda) + Heroku ausprobiert
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, DeepPose mit PyTorch PartⅡ zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht zu kratzen
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe PyQ ausprobiert
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe mit TensorFlow eine nicht negative Matrixzerlegung (NMF) versucht
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe versucht, Python-ähnliche Schleifen mit BigQuery Scripting zu verarbeiten
Ich habe versucht, mit PartiQL und MongoDB verbunden zu spielen
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden