Code: Select all
vgg16_lora = tf.keras.applications.vgg16.VGG16(weights="imagenet", input_shape=(224, 224, 3))
vgg16_lora.trainable = False
lora_model = tf.keras.Model(inputs=vgg16_lora.inputs, outputs=vgg16_lora.layers[-2].output)
lora_model.summary()
Dann versuche ich die LORA-Schicht wie folgt hinzuzufügen:
import math
class LoraLayer(tf.keras.Layer):
def __init__(self, original_layer, rank=8, trainable=False, **kwargs):
original_layer_config = original_layer.get_config()
name = original_layer_config["name"]
kwargs.pop('name', None)
super().__init__(name=name, trainable=trainable, **kwargs)
self.original_layer = original_layer
self.original_layer.trainable = False
self.A = tf.keras.layers.Dense(units=rank, use_bias=False, kernel_initializer=tf.keras.initializers.VarianceScaling(scale=math.sqrt(5), mode="fan_in", distribution="uniform"), trainable=trainable, name="lora_A")
self.B = tf.keras.layers.Dense(units=original_layer.output.shape[-1], kernel_initializer="zeros", trainable=trainable, name="lora_B")
def call(self, inputs):
original_outputs = self.original_layer(inputs)
lora_outputs = self.B(self.A(inputs))
return original_outputs + lora_outputs
lora_model._tracker.unlock()
lora_model.layers[-2] = LoraLayer(lora_model.layers[-2], rank=8, trainable=False)
lora_model._tracker.lock()
lora_model.summary()
< /code>
Meine Absicht mit diesem Code ist es, die vorletzte Schicht durch selbst zu ersetzen. Gemäß der Zusammenfassung des Modells geschieht dies jedoch nicht:
Falsch in meiner Implementierung? Vielleicht hat es etwas mit dem zu tun, was in diesem Problem erklärt wird, und es ist grundsätzlich unmöglich in Keras zu tun, oder gibt es einen Zwischenschritt, den ich fehlt, damit dies funktioniert?>