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.
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```.
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.
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)
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