web-dev-qa-db-fra.com

Comment donner une entrée constante aux keras

Mon réseau possède deux entrées de série chronologique. L'une des entrées a un vecteur fixe se répétant pour chaque pas de temps. Existe-t-il un moyen élégant de charger ce vecteur fixe dans le modèle une seule fois et de l'utiliser pour le calcul?

9
Yakku

Vous pouvez créer une entrée statique en utilisant l'argument tensor comme décrit par jdehesa, cependant le tensor doit être une variable Keras (pas tensorflow). Vous pouvez créer ceci comme suit:

from keras.layers import Input
from keras import backend as K

constants = [1,2,3]
k_constants = K.variable(constants)
fixed_input = Input(tensor=k_constants)
7
Alexander Measure

EDIT: Apparemment, la réponse ci-dessous ne fonctionne pas (de toute façon de nos jours). Voir Création d'une valeur constante dans Keras pour une réponse connexe.


En regardant la source (je n'ai pas pu trouver de référence dans la documentation), il semble que vous pouvez simplement utiliser Input et lui passer un tenseur Theano/TensorFlow constant.

from keras.layers import Input
import tensorflow as tf

fixed_input = Input(tensor=tf.constant([1, 2, 3, 4]))

Cela va "envelopper" le tenseur (en fait plus comme "l'étendre" avec des métadonnées) afin que vous puissiez l'utiliser avec n'importe quelle couche Keras.

2
jdehesa

Quelque chose à ajouter: lorsque vous venez de compiler le modèle, vous devez donner l'entrée constante comme entrée sinon le graphique se déconnecte

#your input
inputs = Input(shape = (input_shape,))

# an array of ones
constants = [1] * input_shape

# make the array a variable
k_constants = K.variable(constants, name = "ones_variable") 

# make the variable a tensor
ones_tensor = Input(tensor=k_constants, name = "ones_tensor")

# do some layers
inputs = (Some_Layers())(inputs)

# get the complementary of the outputs
output = Subtract()([ones_tensor,inputs])

model = Model([inputs, ones_tensor],output)
model.complie(some_params)

lorsque vous vous entraînez, vous pouvez simplement alimenter les données que vous avez, vous n'avez plus besoin de la couche constante.

J'ai constaté que peu importe ce que vous essayez, il est généralement plus facile d'utiliser simplement un calque personnalisé et de profiter de la puissance de numpy:

class Complementry(Layer):

    def __init__(self, **kwargs):
        super(Complementry, self).__init__(**kwargs)

    def build(self, input_shape):
        super(Complementry, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        return 1-x  # here use MyArray + x
1
Andrew Louw