2017-10-11 2 views
0

J'essaie d'utiliser un réseau Keras (A) dans un autre réseau Keras (B). Je forme le réseau A en premier. Ensuite, je l'utilise dans le réseau B pour effectuer une régularisation. À l'intérieur du réseau B Je voudrais utiliser evaluate ou predict pour obtenir la sortie du réseau A. Malheureusement, je n'ai pas réussi à faire fonctionner cela, car ces fonctions attendent un tableau numpy, à la place, il reçoit une variable Tensorflow en entrée.passage avant keras avec variable tensorflow en entrée

Voici comment j'utilise le réseau A l'intérieur d'un régularisateur personnalisé:

class CustomRegularizer(Regularizer): 
    def __init__(self, model): 
     """model is a keras network""" 
     self.model = model 

    def __call__(self, x): 
     """Need to fix this part""" 
     return self.model.evaluate(x, x) 

Comment puis-je calculer une passe en avant avec un réseau Keras avec une variable tensorflow en entrée?

À titre d'exemple, voici ce que je reçois avec numpy:

x = np.ones((1, 64), dtype=np.float32) 
model.predict(x)[:, :10] 

Sortie:

array([[-0.0244251 , 3.31579041, 0.11801113, 0.02281714, -0.11048832, 
     0.13053198, 0.14661783, -0.08456061, -0.0247585 , 
0.02538805]], dtype=float32) 

Avec tensorflow

x = tf.Variable(np.ones((1, 64), dtype=np.float32)) 
model.predict_function([x]) 

Sortie:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-92-4ed9d86cd79d> in <module>() 
     1 x = tf.Variable(np.ones((1, 64), dtype=np.float32)) 
----> 2 model.predict_function([x]) 

~/miniconda/envs/bolt/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs) 
    2266   updated = session.run(self.outputs + [self.updates_op], 
    2267        feed_dict=feed_dict, 
-> 2268        **self.session_kwargs) 
    2269   return updated[:len(self.outputs)] 
    2270 

~/miniconda/envs/bolt/lib/python3.6/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata) 
    776  try: 
    777  result = self._run(None, fetches, feed_dict, options_ptr, 
--> 778       run_metadata_ptr) 
    779  if run_metadata: 
    780   proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 

~/miniconda/envs/bolt/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata) 
    952    np_val = subfeed_val.to_numpy_array() 
    953   else: 
--> 954    np_val = np.asarray(subfeed_val, dtype=subfeed_dtype) 
    955 
    956   if (not is_tensor_handle_feed and 

~/miniconda/envs/bolt/lib/python3.6/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 
    529 
    530  """ 
--> 531  return array(a, dtype, copy=False, order=order) 
    532 
    533 

ValueError: setting an array element with a sequence. 

Répondre

0

Je ne sais pas où la variable tensorflow arrive, mais si elle est là, vous pouvez le faire:

model.predict([sess.run(x)]) 

sess est la session de tensorflow, à savoir sess = tf.Session().

+0

J'ai ajouté un contexte à la façon dont le réseau est utilisé pour ma question. Je n'ai pas encore été capable d'adapter votre réponse pour résoudre mon problème. –

+0

Désolé, mais je pense que plus de détails sont encore nécessaires pour vous aider à déboguer. La seule chose à laquelle je peux penser est que vous pouvez essayer 'cr ([sess.run (x)])' et 'cr = CustomRegularizer (model)'. –