2017-01-18 3 views
0

Я использую keras и использую вывод слоя для некоторых модификаций. Перед тем, используя выход (переменный тензор) Я преобразовывая его Numpy массива и, таким образом, вызывая Eval() на нем, как показано ниже:Ошибка при вызове eval() в переменной тензора в keras

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

код не с следующей ошибкой:

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 

Я намерен вызывать функцию преобразования на выходе предыдущего слоя). Функция преобразования принимает вход как тензорную переменную и выполняет вычисление. Однако я также хочу визуализировать данные, и мне нужно вычислить bit_length для каждого его элемента.

Для примера Если слой A дает выход Y1. Этот вывод используется Lambda-слоем L1, и он вызывает метод преобразования. Пример кода:

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 

Я использовал подобную схему для преобразования веса слоя с помощью model.get_weights(). Метод get_weights() возвращает список массивов numpy и, следовательно, может легко перебирать каждый элемент и вычислять длину бита. Но в то время как преобразование вывода является проблемой, поскольку выход представляет собой тензорную переменную, и когда я вызываю eval() на нем, выдает ошибку, о которой я упоминал в предыдущем сообщении. Надеюсь, я смог очистить свои намерения.

ответ

1

Вам необязательно называть eval() вообще, ваш метод conversion_method должен выполняться с использованием символических функций (от keras.backend) и должен быть дифференцируемым.

Это не сработает, сеть не сможет обучаться с Keras/Theano.

+0

Спасибо за ответ. Я не совсем уверен, как я могу получить длину бит элементов в этой тензорной переменной. Можете ли вы предложить пример, если это возможно. – blackbug

+0

@blackbugThen вы должны предоставить метод calc_bit_lenth, чтобы мы могли найти его символическое представление. –

+0

Я обновил вопрос с помощью указанного метода. На самом деле это довольно просто. – blackbug

Смежные вопросы