Hier Python2.7.Es ist in 6 gemacht. Darüber hinaus verwenden wir hauptsächlich die folgenden Pakete.
Keras (2.0.4)
tensorflow (1.1.0)
Ich habe CNN mit Keras herausgefordert. Da es nicht interessant ist, nur den Beispieldatensatz zu verwenden, habe ich die von CNN aufgenommenen Bilder klassifiziert.
Hier nehmen wir an, dass der theoretische Teil von CNN bis zu einem gewissen Grad bekannt ist, und konzentrieren uns auf den Verarbeitungsteil. Die Analyseumgebung verwendet EC2 von AWS.
Darüber hinaus wird das Bild nach dem Ausschneiden des erforderlichen Teils ausgeführt. (Ich habe es mit OpenCV gemacht)
Ich wollte eine Umgebung erstellen, damit TensorFlow auf einer GPU ausgeführt werden kann, aber für Anfänger ist es schwierig ... Ich habe ein AMI (Bitfusion Ubuntu 14 TensorFlow), dessen Umgebung bereits auf AWS basiert, also verwende ich dieses. Die notwendigen Pakete sind bereits enthalten.
https://aws.amazon.com/marketplace/pp/B01EYKBEQ0
Das obige AMI enthält auch Python3, daher denke ich, dass es auch dort verwendet werden kann. (Es kostet Geld, überprüfen Sie diesen Punkt. Die Standard-EBS-Größe beträgt 100 GB. Seien Sie also auch dort vorsichtig.)
# coding:utf-8
import keras
from keras.utils import np_utils
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.preprocessing.image import array_to_img, img_to_array, list_pictures, load_img
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
Den Inhalt entnehmen Sie bitte der Homepage von Keras. Die Vorverarbeitung kann einfach mit keras.preprocessing durchgeführt werden.
temp_img = load_img('./test/test1.jpg', target_size=(64,64))
Jetzt können Sie das Bild laden. Sie können die Lesegröße auch mit target_size angeben. Da ein Bild mit einer festen Größe in das Modell eingegeben wird, richten Sie es hier aus, wenn die Größe des Bildes in der Vorverarbeitung nicht ausgerichtet ist.
Konvertieren Sie es in eine Matrix und geben Sie es in das Modell ein. Sie können ein Bild in eine Matrix konvertieren mit:
temp_img_array = img_to_array(temp_img)
Wenn man die Form für Form betrachtet, ist es (64, 64, 3). Ich denke, dies bedeutet, dass wir Informationen über die Farbe (RGB) jedes Pixels für ein 64x64-Bild haben.
Verwenden Sie diese nun, um ein Dataset zu erstellen. Hierbei wird angenommen, dass sich das Bild von Ziel A (z. B. eine Katze) im Ordner test1 und ein anderes Ziel B (z. B. ein Hund) im Ordner test2 befinden.
#Lesen Sie die Bilder im Ordner nacheinander
#Kategorie beginnt bei 0
X = []
Y = []
#Bild von Ziel A.
for picture in list_pictures('./test1/'):
img = img_to_array(load_img(picture, target_size=(64,64)))
X.append(img)
Y.append(0)
#Bild von Ziel B.
for picture in list_pictures('./test2/'):
img = img_to_array(load_img(picture, target_size=(64,64)))
X.append(img)
Y.append(1)
#In Array konvertieren
X = np.asarray(X)
Y = np.asarray(Y)
Bildinformationen werden in X eingegeben, und Klasseninformationen werden an Y gegeben. Normalisieren Sie als Nächstes die Pixelwerte und konvertieren Sie die Klassendaten (dies scheint als One-Hot-Ausdruck bezeichnet zu werden).
#Konvertieren Sie Pixelwerte von 0 in 1
X = X.astype('float32')
X = X / 255.0
#Klassenformat konvertieren
Y = np_utils.to_categorical(Y, 2)
#Trainingsdaten und Testdaten
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=111)
Nachdem wir einen Datensatz haben, erstellen wir ein Modell. Was das Modell betrifft, denke ich, dass es verschiedene Beispiele gibt, wenn Sie danach suchen, also baue ich es unter Bezugnahme auf diese.
#Erstellen Sie CNN
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) #2 Klassen
model.add(Activation('softmax'))
#kompilieren
model.compile(loss='categorical_crossentropy',
optimizer='SGD',
metrics=['accuracy'])
#Lauf. Ohne Ausgabe einstellen(verbose=0)。
history = model.fit(X_train, y_train, batch_size=5, epochs=200,
validation_data = (X_test, y_test), verbose = 0)
Sie können die Geschichte des Lernens in der Geschichte überprüfen. Im Folgenden wird die Genauigkeit von Trainingsdaten und Testdaten dargestellt.
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['acc', 'val_acc'], loc='lower right')
plt.show()
Wenden Sie es auf die Validierungsdaten an und wenden Sie es tatsächlich an, um eine Verwirrungsmatrix zu erstellen.
#Auf Testdaten anwenden
predict_classes = model.predict_classes(X_test)
#verschmelzen. Stellen Sie Ihre Daten wieder her
mg_df = pd.DataFrame({'predict': predict_classes, 'class': np.argmax(y_test, axis=1)})
# confusion matrix
pd.crosstab(mg_df['class'], mg_df['predict'])
Deep Learning hatte eine hohe Schwelle, aber ich dachte, es wäre einfacher zu schreiben, wenn ich Keras verwenden würde. Es ist auch einfach, die bereits erstellte Analyseumgebung zu verwenden.
Ich werde mich von nun an mit der Verfeinerung des Modells befassen. Da ich ein Anfänger bin, kann es einige Fehler geben, aber ich würde es begrüßen, wenn Sie auf etwas hinweisen könnten. Bis zum Ende Danke fürs Lesen.
Recommended Posts