** 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.
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
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.
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.
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.
Die Konfiguration ist wie folgt.
Das Lernen führte zu den folgenden Ergebnissen.
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()
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.
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()
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