web-dev-qa-db-fra.com

Comment définir des poids dans Keras avec un tableau numpy?

J'ai des problèmes avec les fonctions principales de Keras pour définir les valeurs. J'essaie de convertir un modèle de PyTorch en Keras et j'essaie de définir les poids du modèle de Keras, mais les poids ne semblent pas être en train de se définir. Remarque: je ne suis pas en train de paramétrer avec np.ones, je ne me sers que de cela, par exemple.

J'ai essayé...

Chargement d'un modèle existant

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]

Créer un modèle simple

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]

Puis en utilisant set_weights ou set_value

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

ou...

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

j'appelle ensuite l'un des suivants:

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

Et aucun des poids ne semble avoir été défini. Les mêmes valeurs que précédemment sont renvoyées.

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

Comment définir les poids d'une couche dans Keras avec un tableau numpy de valeurs?

6
DeltaLee

Quel est keras_layer dans votre code?

Vous pouvez définir des poids de ces manières:

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

model est une instance d'un modèle existant. Vous pouvez voir la longueur attendue de la liste et ses formes de tableau en utilisant la méthode get_weights() à partir des mêmes instances ci-dessus.

13
Daniel Möller

La méthode set_weights () de keras accepte une liste de tableaux numpy. Ce que vous lui avez transmis ressemble à un tableau unique . La forme de ce dernier doit être identique à celle de la sortie de get_weights () même couche . Voici le 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

Cela a fonctionné pour moi et renvoie les poids mis à jour lors de l'appel de get_weights ().

4
Palak

Si vous essayez de convertir le modèle Pytorch en modèle Keras, vous pouvez également essayer un convertisseur Pytorch2Keras .

Il supporte les couches de base comme Conv2d, Linéaire, Activations, certaines opérations élément par élément, etc. Vous pouvez suivre pytorch2keras/layers.py pour les fonctions de conversion de couche. 

0
nerox8664