1. Benutzerdefinierte Ebene
Bei einfachen, zustandslosen benutzerdefinierten Vorgängen können Sie sie möglicherweise layers.core.Lambda
über Ebenen implementieren. Aber für benutzerdefinierte Ebenen, die trainierbare Gewichtungen enthalten, sollten Sie die Ebene selbst implementieren.
Dies ist ein Keras 2.0 , Keras-Ebenenskelett (wenn Sie eine alte Version verwenden, aktualisieren Sie bitte auf die neue Version). Sie müssen nur drei Methoden implementieren:
build(input_shape)
: Hier definieren Sie die Gewichte. Diese Methode muss festgelegt werdenself.built = True
und kann durch Aufrufen von ausgeführt werdensuper([Layer], self).build()
.call(x)
: Hier wird die Funktionslogik der Schicht geschrieben. Sie müssen sich nur auf den ersten übergebenen Parameter konzentrierencall
: den Eingabetensor, es sei denn, Sie möchten, dass Ihre Ebene Maskierung unterstützt.compute_output_shape(input_shape)
: Wenn Ihre Ebene die Form des Eingabetensors ändert, sollten Sie hier die Formänderungslogik definieren, die es Keras ermöglicht, automatisch die Form jeder Ebene abzuleiten.
from keras import backend as K
from keras.engine.topology import Layer
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, 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(MyLayer, self).build(input_shape) # 一定要在最后调用它
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
复制代码
Es ist auch möglich, Keras-Schichten mit mehreren Eingabetensoren und mehreren Ausgabetensoren zu definieren. Dazu sollten Sie davon ausgehen, dass sowohl die Eingabe als auch die Ausgabe der Methode build(input_shape)
, call(x)
und , Listen sind. compute_output_shape(input_shape)
Hier ist ein Beispiel, ähnlich wie oben:
from keras import backend as K
from keras.engine.topology import Layer
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
assert isinstance(input_shape, list)
# 为该层创建一个可训练的权重
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[0][1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # 一定要在最后调用它
def call(self, x):
assert isinstance(x, list)
a, b = x
return [K.dot(a, self.kernel) + b, K.mean(b, axis=-1)]
def compute_output_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_a, shape_b = input_shape
return [(shape_a[0], self.output_dim), shape_b[:-1]]
复制代码
Eine vorhandene Keras-Ebene ist ein gutes Beispiel für die Implementierung einer beliebigen Ebene. Zögern Sie nicht, den Quellcode zu lesen!
2. Benutzerdefinierte Bewertungsfunktion
Benutzerdefinierte Evaluierungsfunktionen sollten zur Kompilierzeit übergeben werden. Diese Funktion nimmt (y_true, y_pred)
als Eingabeparameter und gibt einen Tensor als Ausgabe zurück.
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
复制代码
3. Benutzerdefinierte Verlustfunktion
Benutzerdefinierte Verlustfunktionen sollten auch zur Kompilierzeit übergeben werden. Diese Funktion nimmt (y_true, y_pred)
als Eingabeparameter und gibt einen Tensor als Ausgabe zurück.
import keras.backend as K
def my_loss(y_true, y_pred):
return K.mean(K.squre(y_pred-y_true))#以平方差举例
model.compile(optimizer='rmsprop',
loss=my_loss,
metrics=['accuracy'])
复制代码
4. Behandeln Sie benutzerdefinierte Ebenen (oder andere benutzerdefinierte Objekte) in gespeicherten Modellen
Wenn das zu ladende Modell benutzerdefinierte Layer oder andere benutzerdefinierte Klassen oder Funktionen enthält, können diese custom_objects
über Parameter an den Lademechanismus übergeben werden:
from keras.models import load_model
# 假设你的模型包含一个 AttentionLayer 类的实例
model = load_model('my_model.h5', custom_objects={'AttentionLayer': AttentionLayer})
复制代码
或者,你可以使用 自定义对象作用域:
from keras.utils import CustomObjectScope
with CustomObjectScope({'AttentionLayer': AttentionLayer}):
model = load_model('my_model.h5')
复制代码