2017-01-18 7 views
0

Ich benutze Keras und für einige Modifikationen eine Layer-Ausgabe verwenden. Vor, die Ausgabe mit (ein Tensor Variable) Ich bin es Umwandlung Array zu numpy und damit eval() aufrufen Sie darauf wie folgt:Fehler beim Aufrufen von eval() auf Tensor-Variable in Keras

def convert_output(orig_output): 
    conv_output = invoke_modifications(orig_output.eval(), 8) 

Der Code schlägt mit folgenden Fehler:

File "<ipython-input-11-df86946997d5>", line 1, in <module> 
    orig_output.eval() 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\gof\graph.py", line 516, in eval 
    self._fn_cache[inputs] = theano.function(inputs, self) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\compile\function.py", line 326, in function 
    output_keys=output_keys) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\compile\pfunc.py", line 486, in pfunc 
    output_keys=output_keys) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\compile\function_module.py", line 1783, in orig_function 
    output_keys=output_keys).create(
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\compile\function_module.py", line 1437, in __init__ 
    accept_inplace) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\compile\function_module.py", line 176, in std_fgraph 
    update_mapping=update_mapping) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\gof\fg.py", line 180, in __init__ 
    self.__import_r__(output, reason="init") 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\gof\fg.py", line 351, in __import_r__ 
    self.__import__(variable.owner, reason=reason) 
    File "C:\ENV\p34\lib\site-packages\theano-0.9.0.dev4-py3.4.egg\theano\gof\fg.py", line 396, in __import__ 
    variable=r) 
theano.gof.fg.MissingInputError: An input of the graph, used to compute InplaceDimShuffle{x,x,x,x}(keras_learning_phase), was not provided and not given a value.Use the Theano flag exception_verbosity='high',for more information on this error. 
Backtrace when the variable is created: 
    File "C:\Users\kak7lr\AppData\Roaming\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\_pydev_bundle\pydev_monkey_qt.py", line 71, in patched_import 
    return original_import(name, *args, **kwargs) 
    File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked 
    File "<frozen importlib._bootstrap>", line 1129, in _exec 
    File "<frozen importlib._bootstrap>", line 1471, in exec_module 
    File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed 
    File "C:\ENV\p34\lib\site-packages\keras\backend\theano_backend.py", line 23, in <module> 
    _LEARNING_PHASE = T.scalar(dtype='uint8', name='keras_learning_phase') # 0 = test, 1 = train 

Ich möchte eine Konvertierungsfunktion für die Ausgabe der vorherigen Ebene aufrufen. Die Konvertierungsfunktion nimmt die Eingabe als eine Tensorvariable und führt die Berechnung durch. Allerdings möchte ich auch die Daten visualisieren und ich muss bit_length auf jedem Element davon berechnen.

Für zB wenn Schicht A einen Ausgang Y1 gibt. Diese Ausgabe wird von der Lambda-Schicht L1 verwendet und ruft die Konvertierungsmethode auf. Beispielcode:

Y1 = layer A output 
Lambda(lambda x: conversion_method(x))(Y1) 

def conversion_method(input_tensor): 
    # do the conversion and also calc bit length 
    calc_integer_bits(input_tensor) 

def calc_integer_bits(X): 
    noib_list = list() 
    for pos, each in enumerate(X): 
     in_range = int(round(abs(each .max() - each .min()))) 
     bit_length = in_range.bit_length() 
     noib_list.append(bit_length) 
    return noib_list 

Ich verwendete ähnliches Schema für die Konvertierung der Schichtgewichte mit model.get_weights(). Die get_weights() -Methode gibt eine numpy Array-Liste zurück und könnte somit leicht auf jedes Element iterieren und die Bitlänge berechnen. Aber während der Konvertierung der Ausgabe ist ein Problem, da die Ausgabe eine Tensor-Variable ist und wenn ich eval() darauf aufrufen, gibt den Fehler, den ich im vorherigen Post erwähnt. Ich hoffe, ich konnte meine Absichten klären.

Antwort

1

Sie müssen eval() überhaupt nicht aufrufen, Ihre conversion_method sollte über symbolische Funktionen (die aus keras.backend) erfolgen und differenzierbar sein.

Es wird nicht funktionieren, sonst kann das Netzwerk nicht mit Keras/Theano trainiert werden.

+0

Danke für die Antwort. Ich bin mir nicht ganz sicher, wie ich die Bitlänge der Elemente innerhalb dieser Tensorvariablen erhalten kann. Können Sie, wenn möglich, ein Beispiel vorschlagen? – blackbug

+0

@blackbugDann sollten Sie die Methode calc_bit_lenth bereitstellen, damit wir eine symbolische Darstellung davon finden können. –

+0

Ich habe die Frage mit der genannten Methode aktualisiert. Es ist eigentlich ganz einfach. – blackbug

Verwandte Themen