[SWIFT] Führen Sie ein einfaches Modell aus, das mit Keras unter iOS mit CoreML erstellt wurde

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.

Was zu machen

Erstellen Sie anhand von zwei Zahlengruppen ein Modell, das das Ergebnis ihrer Addition vorhersagt.

<Abb. 1>

Verfahren

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> image.png

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. image.png

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.

Schließlich

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

Führen Sie ein einfaches Modell aus, das mit Keras unter iOS mit CoreML erstellt wurde
Verwenden des lokalen Netzwerks mit iOS 14
Ich habe mit Ruby On Rails ein Portfolio erstellt
Ich habe mit Spring Boot ein einfaches MVC-Beispielsystem erstellt
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt
[Rails] Ich habe eine einfache Kalender-Mini-App mit benutzerdefinierten Spezifikationen erstellt.
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.
Ein einfaches Beispiel für die Anzeige von QRCode auf einer Website mit JSP + ZXing
Ich habe mit Swing eine GUI erstellt
Führen Sie PureScript auf einem Docker-Container aus
Ich habe eine einfache Empfehlungsfunktion erstellt.
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst