wake-up-neo.com

Wie man Gewichtungen in Keras mit einem numpy-Array setzt?

Ich habe Probleme mit den Keras-Backend-Funktionen zum Einstellen von Werten. Ich versuche, ein Modell von PyTorch in Keras zu konvertieren, und ich versuche, die Gewichte des Keras-Modells festzulegen, aber die Gewichte scheinen nicht gesetzt zu werden. Hinweis: Ich setze mich nicht gerade mit np.ones ein, nur um das für ein Beispiel zu verwenden.

Ich habe versucht...

Laden eines vorhandenen Modells

import keras
from keras.models import load_model, Model
model = load_model(model_dir+file_name)
keras_layer = [layer for layer in model.layers if layer.name=='conv2d_1'][0]

Ein einfaches Modell erstellen

img_input = keras.layers.Input(shape=(3,3,3))
x = keras.layers.Conv2D(1, kernel_size=1, strides=1, padding="valid", 
use_bias=False, name='conv1')(img_input)
model = Model(img_input, x)
keras_layer = [layer for layer in model.layers if layer.name=='conv1'][0]

Dann set_weights oder set_value verwenden

keras_layer.set_weights([np.ones((1, 1, 3, 1))])

oder...

K.batch_set_value([(weight,np.ones((1, 1, 3, 1))) for weight in keras_layer.weights])

danach rufe ich eine der folgenden an:

K.batch_get_value([weight for weight in keras_layer.weights])
keras_layer.get_weights()

Und keine der Gewichte scheint eingestellt worden zu sein. Die gleichen Werte wie zuvor werden zurückgegeben.

[array([[[[  1.61547325e-06],
      [  2.97779252e-06],
      [  1.50160542e-06]]]], dtype=float32)]

Wie stelle ich die Gewichte einer Ebene in Keras mit einem numpy-Array von Werten ein?

6
DeltaLee

Was ist keras_layer in Ihrem Code?

Sie können Gewichte folgendermaßen einstellen:

model.layers[i].set_weights(listOfNumpyArrays)    
model.get_layer(layerName).set_weights(...)
model.set_weights(listOfNumpyArrays)

Dabei ist model eine Instanz eines vorhandenen Modells. Sie können die erwartete Länge der Liste und ihre Arrayformen mit der Methode get_weights() von den gleichen Instanzen oben sehen.

13
Daniel Möller

Die set_weights () - Methode von Keras akzeptiert eine Liste von numpy-Arrays. Was Sie an die Methode übergeben haben, scheint ein einzelnes Array zu sein .. Die Form sollte der Form der Ausgabe von get_weights () auf der entsprechen gleiche Schicht ..__ Hier ist der Code:

l=[]
x=np.array() #weights
y=np.array() #array of biases
l.append(x)
l.append(y)
loaded_model.layers[0].set_weights(l) #loaded_model.layer[0] being the layer

Dies funktionierte für mich und gibt die aktualisierten Gewichtungen beim Aufruf von get_weights () zurück.

4
Palak

Wenn Sie versuchen, ein Pytorch-Modell in ein Keras-Modell zu konvertieren, können Sie auch einen Pytorch2Keras - Konverter versuchen.

Es unterstützt Basisebenen wie Conv2d, Linear, Aktivierungen, einige elementweise Operationen usw. Sie können pytorch2keras/layers.py für Layer-Konvertierungsfunktionen folgen. 

0
nerox8664