web-dev-qa-db-fra.com

Keras 2.x - Obtenez les poids de la couche

J'utilise Windows 10, Python 3.5 et tensorflow 1.1.0. J'ai le script suivant:

import tensorflow as tf
import tensorflow.contrib.keras.api.keras.backend as K
from tensorflow.contrib.keras.api.keras.layers import Dense

tf.reset_default_graph()
init = tf.global_variables_initializer()
sess =  tf.Session()
K.set_session(sess) # Keras will use this sesssion to initialize all variables

input_x = tf.placeholder(tf.float32, [None, 10], name='input_x')    
dense1 = Dense(10, activation='relu')(input_x)

sess.run(init)

dense1.get_weights()

J'ai l'erreur: AttributeError: 'Tensor' object has no attribute 'weights'

Qu'est-ce que je fais de mal et comment puis-je obtenir le poids de dense1? J'ai regardé this et this SO post, mais je ne peux toujours pas le faire fonctionner.

17
Toke Faurby

Si vous écrivez:

dense1 = Dense(10, activation='relu')(input_x)

Alors dense1 N'est pas une couche, c'est la sortie d'une couche. Le calque est Dense(10, activation='relu')

Donc, il semble que vous vouliez dire:

dense1 = Dense(10, activation='relu')
y = dense1(input_x)

Voici un extrait complet:

import tensorflow as tf
from tensorflow.contrib.keras import layers

input_x = tf.placeholder(tf.float32, [None, 10], name='input_x')    
dense1 = layers.Dense(10, activation='relu')
y = dense1(input_x)

weights = dense1.get_weights()
17
Francois

Si vous voulez obtenir des poids et des biais de toutes les couches, vous pouvez simplement utiliser:

for layer in model.layers: print(layer.get_config(), layer.get_weights())

Cela imprimera toutes les informations pertinentes.

Si vous voulez que les poids soient directement renvoyés sous forme de tableaux numpy, vous pouvez utiliser:

first_layer_weights = model.layers[0].get_weights()[0]
first_layer_biases  = model.layers[0].get_weights()[1]
second_layer_weights = model.layers[1].get_weights()[0]
second_layer_biases  = model.layers[1].get_weights()[1]

etc.

38
Onno Kampman

Si vous voulez voir comment les poids et les biais de votre couche changent avec le temps, vous pouvez ajouter un rappel pour enregistrer leurs valeurs à chaque époque de formation.

En utilisant un modèle comme celui-ci par exemple,

import numpy as np
model = Sequential([Dense(16, input_shape=(train_inp_s.shape[1:])), Dense(12), Dense(6), Dense(1)])

ajouter les callbacks ** kwarg lors du montage:

gw = GetWeights()
model.fit(X, y, validation_split=0.15, epochs=10, batch_size=100, callbacks=[gw])

où le rappel est défini par

class GetWeights(Callback):
    # Keras callback which collects values of weights and biases at each Epoch
    def __init__(self):
        super(GetWeights, self).__init__()
        self.weight_dict = {}

    def on_Epoch_end(self, Epoch, logs=None):
        # this function runs at the end of each Epoch

        # loop over each layer and get weights and biases
        for layer_i in range(len(self.model.layers)):
            w = self.model.layers[layer_i].get_weights()[0]
            b = self.model.layers[layer_i].get_weights()[1]
            print('Layer %s has weights of shape %s and biases of shape %s' %(
                layer_i, np.shape(w), np.shape(b)))

            # save all weights and biases inside a dictionary
            if Epoch == 0:
                # create array to hold weights and biases
                self.weight_dict['w_'+str(layer_i+1)] = w
                self.weight_dict['b_'+str(layer_i+1)] = b
            else:
                # append new weights to previously-created weights array
                self.weight_dict['w_'+str(layer_i+1)] = np.dstack(
                    (self.weight_dict['w_'+str(layer_i+1)], w))
                # append new weights to previously-created weights array
                self.weight_dict['b_'+str(layer_i+1)] = np.dstack(
                    (self.weight_dict['b_'+str(layer_i+1)], b))

Ce rappel va créer un dictionnaire avec tous les poids et biais de couche, étiquetés par les numéros de couche, afin que vous puissiez voir comment ils changent au fil du temps, au fur et à mesure de la formation de votre modèle. Vous remarquerez que la forme de chaque poids et le tableau de biais dépendent de la forme du calque du modèle. Un tableau de poids et un tableau de biais sont enregistrés pour chaque couche de votre modèle. Le troisième axe (profondeur) montre leur évolution dans le temps.

Nous avons utilisé ici 10 époques et un modèle avec des couches de 16, 12, 6 et 1 neurones:

for key in gw.weight_dict:
    print(str(key) + ' shape: %s' %str(np.shape(gw.weight_dict[key])))

w_1 shape: (5, 16, 10)
b_1 shape: (1, 16, 10)
w_2 shape: (16, 12, 10)
b_2 shape: (1, 12, 10)
w_3 shape: (12, 6, 10)
b_3 shape: (1, 6, 10)
w_4 shape: (6, 1, 10)
b_4 shape: (1, 1, 10)
1
Eric Muckley