1. Transfer Learning
from keras.applications import VGG16
from keras.models import Sequential
from keras.layers import Dense, Flatten
# Laden eines vortrainierten Modells ohne die oberste Schicht
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Erstellen eines neuen Modells und Hinzufügen des vortrainierten Modells als Basismodell
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Kompilieren des Modells
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Ausgabe der Modellzusammenfassung
print(model.summary())
Ausgabe:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
vgg16 (Functional) (None, 7, 7, 512) 14714688
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
dense (Dense) (None, 256) 6422784
_________________________________________________________________
dense_1 (Dense) (None, 1) 257
=================================================================
Total params: 21,139,729
Trainable params: 21,139,729
Non-trainable params: 0
_________________________________________________________________
In diesem Beispiel verwenden wir das vortrainierte VGG16-Modell als Basismodell und fügen eine neue dichte Schicht hinzu, um das Modell für eine binäre Klassifikationsaufgabe anzupassen.
2. Feintuning vortrainierter Modelle
Feintuning ist eine Technik, bei der ein vortrainiertes Modell weiter trainiert wird, um es an eine spezifische Aufgabe anzupassen. Dabei werden einige Schichten des vortrainierten Modells "eingefroren", sodass ihre Gewichte nicht aktualisiert werden, während andere Schichten weiter trainiert werden.
Beispiel:
from keras.applications import VGG16
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.optimizers import Adam
# Laden eines vortrainierten Modells ohne die oberste Schicht
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Einfrieren der ersten 15 Schichten
for layer in base_model.layers[:15]:
layer.trainable = False
# Erstellen eines neuen Modells und Hinzufügen des vortrainierten Modells als Basismodell
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Kompilieren des Modells mit einem kleineren Lernrate
model.compile(optimizer=Adam(learning_rate=1e-5), loss='binary_crossentropy', metrics=['accuracy'])
# Ausgabe der Modellzusammenfassung
print(model.summary())
Ausgabe:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
vgg16 (Functional) (None, 7, 7, 512) 14714688
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
dense (Dense) (None, 256) 6422784
_________________________________________________________________
dense_1 (Dense) (None, 1) 257
=================================================================
Total params: 21,139,729
Trainable params: 6,427,784
Non-trainable params: 14,711,945
_________________________________________________________________
In diesem Beispiel frieren wir die ersten 15 Schichten des VGG16-Modells ein und feintunen die restlichen Schichten mit einer kleineren Lernrate.
3. Benutzerdefinierte Schichten und Modelle
In Keras können Sie benutzerdefinierte Schichten und Modelle erstellen, indem Sie die Layer- und Model-Klassen unterklassenweise erweitern. Dies ermöglicht es Ihnen, komplexe und spezialisierte Netzwerke zu bauen.
Beispiel: Benutzerdefinierte Schicht
from keras.layers import Layer
from keras import backend as K
class CustomLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(CustomLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(CustomLayer, self).build(input_shape)
def call(self, inputs):
return K.dot(inputs, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
# Verwendung der benutzerdefinierten Schicht in einem Modell
model = Sequential()
model.add(Dense(32, input_dim=100, activation='relu'))
model.add(CustomLayer(10))
model.add(Dense(1, activation='sigmoid'))
# Kompilieren des Modells
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Ausgabe der Modellzusammenfassung
print(model.summary())
Ausgabe:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 32) 3232
_________________________________________________________________
custom_layer (CustomLayer) (None, 10) 330
_________________________________________________________________
dense_1 (Dense) (None, 1) 11
=================================================================
Total params: 3,573
Trainable params: 3,573
Non-trainable params: 0
_________________________________________________________________
In diesem Beispiel erstellen wir eine benutzerdefinierte Schicht CustomLayer, die eine einfache gewichtete Matrixmultiplikation durchführt.
4. Benutzerdefinierte Trainingsschleifen
Keras bietet auch die Möglichkeit, benutzerdefinierte Trainingsschleifen zu erstellen, die mehr Kontrolle über den Trainingsprozess ermöglichen. Dies ist besonders nützlich, wenn Sie spezielle Anforderungen haben, die über die Standard-fit-Methode hinausgehen.
Beispiel:
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
# Erstellen eines einfachen Modells
model = Sequential([
Dense(64, activation='relu', input_shape=(32,)),
Dense(1, activation='sigmoid')
])
# Definieren von Verlustfunktion und Optimierer
loss_fn = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam()
# Trainingsschleife
epochs = 5
for epoch in range(epochs):
print(f'Start of epoch {epoch}')
for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
with tf.GradientTape() as tape:
logits = model(x_batch_train, training=True)
loss_value = loss_fn(y_batch_train, logits)
grads = tape.gradient(loss_value, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
if step % 100 == 0:
print(f'Loss at step {step}: {loss_value.numpy()}')
In diesem Beispiel definieren wir eine benutzerdefinierte Trainingsschleife, die die Gradienten berechnet und die Modellgewichte manuell aktualisiert.
Diese detaillierten Erklärungen und Beispiele sollten Ihnen helfen, fortgeschrittene Techniken in Keras zu verstehen und in Ihren eigenen Projekten anzuwenden.