Ich habe einen Datensatz mit Bildern erstellt, die von ImageNet stammen, und versucht, sie zu klassifizieren.
Mit demselben Code gibt es Zeiten, in denen es funktioniert, und Zeiten, in denen es nicht funktioniert, und ich bin mir nicht sicher, warum. [^ 1] Klicken Sie hier für das Notizbuch: https://gist.github.com/juntaki/263d9c43c0509c6610bdf95a59867e99 [^ 1]: Keras-Fehler? Das Folgende ist eine Beschreibung der Notizen.
Speichern Sie die von ImageNet gesuchte URL-Liste an einem geeigneten Ort und laden Sie das Bild herunter. Verwerfen Sie solche mit ungewöhnlich geringer Kapazität oder Textdateien, da sie fehlgeschlagen sind.
cat ../urllist | xargs wget -T1
Für RGB-Bilder müssen Sie etwa [3 (RGB), 50 (vertikal), 50 (horizontal)] ausführen, um an Keras zu übergeben. Da die mit Image.open () gelieferte [50,50,3] ist, wird die Reihenfolge mit transpose () geändert. Das Argument bedeutet, [0,1,2] in [2,0,1] zu ändern.
im_reading = np.array( Image.open(i).resize((50,50)))
im_reading = im_reading.transpose(2,0,1)
Darüber hinaus muss es für die Eingabe in Keras ein np.array von [Sample, 3,50,50 (RGB-Bild)] sein Ich habe einen Datensatz erstellt, indem ich ihn an ein leeres Array angehängt habe. Im Gegensatz zum Python-Array müssen Sie zuerst die Matrixgröße definieren. Da der dtype des Bildes uint8 ist, kann es mit imshow () nur dann gut als Bild angezeigt werden, wenn es mit unsigned ausgerichtet ist (obwohl es anscheinend kein Problem gibt, wenn es nur lernt) [^ 2].
[^ 2]: Das Laden dauert sehr lange, daher sollte es einen besseren Weg geben. Es wird nicht bestätigt, dass bei jeder Speicherung eine Speicherkopie erstellt wurde.
image = np.empty((0,3,50,50), dtype=np.uint8)
...
image = np.append(image, [im_reading], axis=0)
Sie kann durch Rücksendung der getauschten Bestellung angezeigt werden.
plt.imshow( image[number].transpose(1,2,0) )
scikit-learn hat eine Funktion, die den Datensatz für Training und Test aufteilt. Da der Datensatz der Reihe nach angehängt wird, wird er vorher und nachher ordentlich geteilt. Wenn Sie diese Funktion jedoch bestehen, wird er zufällig aufgenommen und geteilt.
from sklearn.cross_validation import train_test_split
data_train, data_test, labels_train, labels_test = train_test_split(image, result, test_size=0.10, random_state=10)
Der Inhalt des Modells besteht aus einer Kombinationsebene und einem entsprechend geschichteten Max-Pooling.
model = Sequential()
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu" ,input_shape=(3, 50, 50) ))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))
model.summary()
model.compile(loss='binary_crossentropy', optimizer="adadelta", metrics=['accuracy'])
Es ist eine einfache Klassifizierung von zwei Klassen, aber ich konnte eine Genauigkeit von 90% erzielen, indem ich ein richtig ausgewähltes beschriftetes Bild las.
Recommended Posts