[PYTHON] Passen Sie Modell / Ebene / Metrik mit TensorFlow an

Einführung

Wenn Sie ein Modell selbst in TensorFlow implementieren, ist es praktisch, die bereits vorbereiteten Klassen zu erben, aber das Verständnis hat lange gedauert. Vergessen Sie es also nicht.

Bestätigte Umgebung

Modellanpassung

Erstellt mit Bezug auf [Offizielles Tutorial](https://www.tensorflow.org/tutorials/customization/custom_layers?hl=ja#model: Kombination von Ebenen). Fügen Sie nach dem Durchlaufen der beiden Faltungsebenen die Eingabewerte hinzu, um einen Restblock zu erstellen, dessen Ausgabegröße halb so groß ist wie die Eingabe.

from tf.keras.layers import Conv2D, BatchNormalization, Add, Activation

class ResidualBlock(tf.keras.Model):
    
    def __init__(self, filters, kernel_size=2, block_name=''):

        #Magie
        super(ResidualBlock, self).__init__()

        #Passen Sie die Größe an die Ausgabe an, um Eingabewerte hinzuzufügen
        self.conv0 = Conv2D(filters, 1, strides=2, padding='same', name=block_name+'_conv0')
        self.bn0 = BatchNormalization(name=block_name+'_bn0')

        #Faltschicht (1. Schicht halbiert Größe)
        self.conv1 = Conv2D(filters, kernel_size, strides=2, padding='same', activation='relu', name=block_name+'_conv1')
        self.bn1 = BatchNormalization(name=block_name+'_bn1')
        self.conv2 = Conv2D(filters, kernel_size, padding='same', activation='relu', name=block_name+'_conv2')
        self.bn2 = BatchNormalization(name=block_name+'_bn2')
        
        #Eingabe und Ausgabe hinzufügen
        self.add = Add(name=block_name+'_add')
        self.out = Activation('relu', name=block_name+'_out')
        
    def call(self, x):
        
        shortcut = self.conv0(x)
        shortcut = self.bn0(shortcut)
        
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.conv2(x)
        x = self.bn2(x)
       
        x = self.add([shortcut,x])
        x = self.out(x)
        
        return x

Erstellen Sie die erforderlichen Ebenen mit `__init__``` und implementieren Sie den Berechnungsablauf mit` call```.

Ebenenanpassung

Benutzerdefinierte Modelle und Modelle, die mit `` tf.keras.applications``` erstellt wurden, können mit `tf.keras.models.Sequential``` kombiniert werden, um neue Modelle zu erstellen. Es gibt Zeiten, in denen Sie auf die Ebenen im Modell zugreifen möchten, z. B. beim Erstellen einer Heatmap. Es scheint jedoch, dass Sie dies nicht tun können, solange Sie es selbst überprüfen. Erstellen Sie daher eine einzelne Ebene, die die Ausgabe des Modells unverändert zurückgibt.

class IdentityLayer(tf.keras.layers.Layer):
    def __init__(self):
        super(IdentityLayer, self).__init__()
    def call(self, x):
        return x

Fast das gleiche wie das Anpassen eines Modells.

Passen Sie Metriken an

Erstellt mit Bezug auf Offizielle API. Erstellen Sie True Positives für kategoriale Ein- und Ausgaben.

class TP_metric(tf.keras.metrics.Metric):

    def __init__(self, name='TP', **kwargs):
        
        #Magie
        super(TP_metric, self).__init__(name=name, **kwargs)
        #Definition interner Variablen
        self.value = self.add_weight(name='tp', initializer='zeros')

    def update_state(self, y_true, y_pred, sample_weight=None):

        # one_Konvertieren Sie den heißen Vektor in ein Array von Beschriftungen
        y_true = tf.argmax(y_true, axis=-1)
        y_true = tf.cast(y_true, K.floatx())
        y_pred = tf.argmax(y_pred, axis=-1)
        y_pred = tf.cast(y_pred, K.floatx())
        
        #Wenn sowohl der wahre Wert als auch der vorhergesagte Wert 1 sind, erhöht sich TP um 1.
        tmp = tf.equal(tf.add(y_true, y_pred), 2)
        tmp = tf.cast(tmp, K.floatx())

        #Interne Variablen aktualisieren
        self.value.assign_add(tf.reduce_sum(tmp))

    def result(self):
        return self.value

Es ist ziemlich laut (obwohl es Python ist), also versuche es häufig zu besetzen. Zuerst habe ich versucht, es mit Sparse Categorical kompatibel zu machen, aber aus irgendeinem Grund war die Form von "y_true" dieselbe wie "y_pred". Passen Sie stattdessen den Etikettendatensatz an.

def one_hot(x):
    return tf.one_hot(x,Anzahl der Kategorien)

label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(label_list, tf.int32))
label_ds = label_ds.map(one_hot)

Bonus

Jetzt, da ich sowohl tf 1.x als auch tf 2.x verwende, habe ich das Gefühl, ein wenig über "eifrige Ausführung" zu verstehen.

Recommended Posts

Passen Sie Modell / Ebene / Metrik mit TensorFlow an
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Zundokokiyoshi mit TensorFlow
Brechen Sie Blöcke mit Tensorflow
Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().
Daten mit TensorFlow lesen
Bootsrennen Vorhersage mit TensorFlow
Modellbefestigung mit lmfit
Regression mit einem linearen Modell
Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung
Versuchen Sie eine Regression mit TensorFlow
Echtzeit-Bilderkennung auf Mobilgeräten mithilfe des TensorFlow-Lernmodells
Übersetzen Erste Schritte mit TensorFlow
Sprachvorhersagemodell von TensorFlow
Verwenden Sie TensorFlow mit Intellij IDEA
Ungefähre Sinusfunktion mit TensorFlow
TensorFlow Tutorial-Sequenztransformationsmodell (Übersetzung)
Aktienkursprognose mit Tensorflow
Kalibrieren Sie das Modell mit PyCaret
TensorFlow Tips-Ported Lasagne NIN Layer
Versuchen Sie TensorFlow MNIST mit RNN
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 4 heraus. ~ Lassen Sie uns mit dem trainierten Modell ~ vorhersagen
Erstellen eines sequentiellen Tensorflow-Modells mit einem zu MNIST hinzugefügten Originalbild