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?
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)
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.
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