Um die CoreML-Tools zu verstehen, dachte ich, es wäre gut, wenn ich ein einfaches Modell verwenden und das Modell nach Belieben ändern könnte. Ich werde das Verfahren erklären.
Erstellen Sie anhand von zwei Zahlengruppen ein Modell, das das Ergebnis ihrer Addition vorhersagt.
<Abb. 1>
Die Vollversion dieses Codes wird hier gespeichert. https://gist.github.com/TokyoYoshida/bab3d0396c05afce445852d2ae224cf4
** 1. Starten Sie Google Colab **
Gehen Sie zur Google Colaboratory-Website. Google Colaboratory
** 2. Installieren und importieren Sie, was Sie brauchen **
Tensorflow und Keras werden ebenfalls entsprechend der Version von coremltools installiert.
notebook
!pip install tensorflow==1.14.0
!pip install -U coremltools
!pip install keras==2.2.4
Importieren Sie dann die erforderlichen Module.
notebook
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import math
from keras.utils import np_utils
import keras
** 3. Mach dich bereit für Tensorboard **
Bei der Konvertierung mit CoreML Tools sind möglicherweise Modellinformationen erforderlich. Dazu müssen Sie das Modell bis zu einem gewissen Grad verstehen, aber bereit sein, es mit Tensorboard zu visualisieren, da es Ihnen hilft, die Informationen des Modells zu verstehen. (Dieses Mal mache ich selbst ein Modell, daher benötige ich keine Modellinformationen.)
Referenz: [TF] Verwendung von Tensorboard von Keras
notebook
!mkdir logs
tb_cb = keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
cbks = [tb_cb]
** 4. Mach ein Modell und trainiere **
Geben Sie Daten ein, um 10.000 Kombinationen von zwei Ganzzahlen zu erstellen. Da die Lehrerdaten diesmal als Klassifizierungsproblem behandelt werden, handelt es sich um 18 Arrays [0,1,2,3,4 ... 17,18]. (Weil 9 + 9 = 18 der Maximalwert als Kombination von Antworten ist) In diesem Array enthält nur der Antwortteil 1 und die anderen Teile 0. Diese Ausdrucksmethode heißt One-Hot-Ausdruck.
<Abb. 2>
Das Modell verwendet drei einfache, vollständig verbundene Schichten und die Aktivierungsfunktion verwendet Softmax.
Referenz: Hinzufügen einer Ziffer mit Keras
notebook
x = np.random.randint(0, 10, (10000,2))
y = np_utils.to_categorical(np.sum(x, axis=1))
model = Sequential()
model.add(Dense(512, activation='relu', input_dim=2))
model.add(Dense(256, activation='relu'))
model.add(Dense(y.shape[1]))
model.add(Activation("softmax"))
model.compile('rmsprop',
'categorical_crossentropy',
metrics=['accuracy'])
train_rate = 0.7
train_len = math.floor(len(x) * train_rate)
trainx = x[0:train_len]
trainy = y[0:train_len]
testx = x[train_len:]
testy = y[train_len:]
history = model.fit(trainx, trainy,
batch_size=128,
epochs=100,
verbose=1,
callbacks=cbks,
validation_data=(testx, testy))
Führen Sie den obigen Code aus, um mit dem Lernen zu beginnen.
notebook
7000/7000 [==============================] - 0s 54us/step - loss: 0.1705 - acc: 0.9677 - val_loss: 0.0172 - val_acc: 1.0000
Epoch 99/100
7000/7000 [==============================] - 0s 53us/step - loss: 0.0804 - acc: 0.9804 - val_loss: 0.0069 - val_acc: 1.0000
Epoch 100/100
7000/7000 [==============================] - 0s 57us/step - loss: 0.0745 - acc: 0.9806 - val_loss: 0.0062 - val_acc: 1.0000
Obwohl die Trainingsdaten und die Testdaten diesmal getrennt sind, ist das Verifizierungsergebnis (val_acc) durch die Testdaten nicht sehr zuverlässig, da tatsächlich Nebel vorhanden ist.
** 5. Versuchen Sie mit Tensorboard zu visualisieren **
Laden Sie Tensroboard und führen Sie es aus.
Aus irgendeinem Grund erhalte ich eine Fehlermeldung, wenn ich tensorboard-plugin-wit
nicht deinstalliere, also deinstalliere es.
notebook
%load_ext tensorboard
!pip uninstall tensorboard-plugin-wit
%tensorboard --logdir ./logs
Lernsituation
Diagramminformationen
Ebenen werden von unten (dichte_1), von oben (Aktivierung_1) usw. von unten nach oben eingegeben.
Schauen wir uns die Eingabeseite an (dens_1).
Sie können sehen, dass Operation ein Platzhalter ist und Daten hier eingegeben werden. dtype ist DT_FLOAT. Die Daten werden diesmal mit ganzen Zahlen erstellt, sie können jedoch auch Daten mit Brüchen oder weniger verarbeiten. Die Form ist {"dim": {"size": -1}, "size": 2]}. Mit anderen Worten ist es die Form von (-1,2). -1 bedeutet einen beliebigen Wert. 2 liegt daran, dass Sie eine Kombination aus zwei Buchstaben eingeben. In den Eingabedaten von <Abb.2> stimmt es überein, dass die Kombination von zwei Zahlen x die Anzahl der Testdaten (optional).
Schauen wir uns die Ausgabeseite an (Aktivierung_1). Da Aktivierung_1 eine Softmax-Funktion ist, wird das Berechnungsergebnis der Softmax-Funktion für die 19 Zahlen ausgegeben, die von der vorherigen Dichte_3 ausgegeben wurden, und für Verlust, Metriken und Training ausgegeben.
Modellinformationen können auch mit der Keras-Zusammenfassungsmethode ausgegeben werden. In Tensorboard waren die Schichten von unten nach oben, aber diese ist von oben nach unten.
notebook
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 512) 1536
_________________________________________________________________
dense_2 (Dense) (None, 256) 131328
_________________________________________________________________
dense_3 (Dense) (None, 19) 4883
_________________________________________________________________
activation_1 (Activation) (None, 19) 0
=================================================================
Total params: 137,747
Trainable params: 137,747
Non-trainable params: 0
** 6. Versuchen Sie, auf Notebook vorherzusagen **
Stellen Sie vor dem Ausführen unter iOS sicher, dass es auf Ihrem Notebook ordnungsgemäß funktioniert. Wenn Sie eine geeignete Kombination aus zwei Zahlen angeben, können Sie sehen, dass die Berechnung korrekt ist.
notebook
np.argmax(model.predict(np.array([[7,6]])),axis=1)
// array([13])
np.argmax(model.predict(np.array([[1,3]])),axis=1)
// array([4])
** 7. In Core ML konvertieren **
Speichern Sie das oben erstellte Modell. (Auch wenn Sie dies nicht tun, ist das Modell bereits erhalten, sodass Sie es unverändert in Core ML konvertieren können.)
notebook
model.save('my_model.h5')
Lesen und konvertieren.
notebook
from keras.models import load_model
keras_model = load_model('my_model.h5')
from coremltools.converters import keras as converter
#Erstellen Sie ein Klassifizierungsetikett für die Nummern der erwarteten Ergebnisse["0","1","2"..."18"]
class_labels = np.arange(0, 19).astype('unicode').tolist()
#Umwandlung
mlmodel = converter.convert(keras_model, #Modell konvertiert werden
output_names=['digitProbabilities'], #Geben Sie der erwarteten Ausgabe einen Namen. Es wird von swift als Variablenname zugänglich sein
class_labels=class_labels, #Etikett zur Klassifizierung der Prognoseergebnisse
predicted_feature_name='digit' #Geben Sie der Klassifizierungsausgabe einen Namen. Es wird von swift als Variablenname zugänglich sein
)
du sparst.
notebook
coreml_model_path = 'my_model.mlmodel'
mlmodel.save(coreml_model_path)
Der Code hier ist der gleiche wie der in diesem Buch geschriebene.
Einführung in die Kernpraxis der ML-Tools --iOS x DEEP LEARNING
** 8. Laden Sie das Core ML-Modell (.mlmodel-Datei) herunter **
Wählen Sie wie unten gezeigt aus dem Notebook und wählen Sie "Download" zum Herunterladen.
** 9. Drag & Drop zum Xcode-Projekt **
Starten Sie Xcode und erstellen Sie eine "Single View App" aus "Projekt erstellen".
Das Projekt, das ich dieses Mal gemacht habe, ist auf Github, also kannst du es verwenden. TokyoYoshida/CoreMLSimpleTest
Ziehen Sie die .mlmodel-Datei per Drag & Drop an einen beliebigen Ort in Ihrem Projekt.
Sie können die Vorschau anzeigen, indem Sie das Modell in Xcode auswählen.
Die Eingabe ist vom Typ MultiArray und benötigt zwei Doubes. Dies ergibt beispielsweise [2,3], wenn Sie 2 + 3 erwarten möchten. In der Ausgabe ist digitProbabilities Dictionary und die Zeichenfolge ist Key und Double ist Value. Dieses Element ist ein erwartetes Ergebnis, und die Wahrscheinlichkeit für jedes Nummernschild wird ausgegeben. Die Ziffer ist das Ergebnis der Anwendung des erwarteten Ergebnisses auf das Nummernschild.
Der MultiArray-Typ ist ein mehrdimensionales Array, das als Eingabe oder Ausgabe des in Core ML definierten Modells verwendet wird.
** 10. Inferenzcode mit Core ML schreiben **
Da es sich bei diesem Modell nicht um eine Bilderkennung handelt, werden wir Core ML direkt ohne Verwendung von Vision Framework betreiben. Schreiben Sie den Code in viewDidLoad von ViewController.
ViewController.swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let model = my_model()
//Machen Sie ein Zahlenpaar, das Sie vorhersagen möchten
let inputArray = try! MLMultiArray([2,3])
let inputToModel: my_modelInput = my_modelInput(input1: inputArray)
//Schließen
if let prediction = try? model.prediction(input: inputToModel) {
//Ergebnisausgabe
print(prediction.digit)
print(prediction.digitProbabilities)
}
}
}
** 11. Mach es **
Wenn ich die App starte, erscheint der Bildschirm der App nutzlos, aber es ist mir egal und ich schaue in die Ausgabespalte von Xcode.
Ergebnisausgabe
5
["13": 1.401298464324817e-45, "7": 4.403268860642129e-08, "16": 0.0, "12": 1.401298464324817e-45, "10": 1.401298464324817e-45, "4": 2.876720373024e-06, "11": 1.401298464324817e-45, "1": 1.2956196287086532e-23, "6": 6.624156412726734e-06, "8": 6.452452973902557e-18, "15": 1.401298464324817e-45, "2": 7.265933324842114e-14, "0": 1.0373160919090815e-33, "18": 0.0, "9": 1.7125880512063084e-34, "17": 0.0, "3": 1.129986526746086e-15, "14": 1.401298464324817e-45, "5": 0.9999904632568359]
Da wir 2 + 3 geben, wird 5 abgeleitet. Bei der Ausgabe von digitProbabilities wird die Wahrscheinlichkeit unter Verwendung jedes Labels als Schlüssel ausgegeben. Die Wahrscheinlichkeit, 5 zu sein, beträgt 0,9999904632568359, also fast 1. Die Wahrscheinlichkeit anderer Zahlen, zum Beispiel 13, beträgt 1,401298464324817e-45, aber dies ist 1,401298464324817 ✕ 10 nach der -45. Potenz, sodass das Ergebnis fast Null ist.
Hinweis veröffentlicht regelmäßig Informationen zur iOS-Entwicklung. Folgen Sie uns daher. https://note.com/tokyoyoshida
Wir senden einfache Tipps auf Twitter. https://twitter.com/jugemjugemjugem
Recommended Posts