"Entwicklungsfähigkeiten" Keras benutzerdefiniertes Objekt (Ebene, Bewertungsfunktion und Verlust)

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 werden  self.built = Trueund kann durch Aufrufen von ausgeführt werden  super([Layer], self).build() .
  • call(x): Hier wird die Funktionslogik der Schicht geschrieben. Sie müssen sich nur auf den ersten übergebenen Parameter konzentrieren  call : 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')
复制代码

 

 

Ich denke du magst

Origin juejin.im/post/7000406814005133348
Empfohlen
Rangfolge