Тензор потока: tf.rnn.raw_rnn - fn_loop не вызывается? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь использовать пользовательскую функцию для loop_fn в raw_rnn, но есть странный

"raise TypeError("loop_fn must be a callable")"  # Exception thrown?

Вызов:

callable_loop_fn = loop_fn(
    time=time,
    previous_output=None,
    previous_state=None,
    previous_loop_state=None,
    _W=W, _b=b,
    _decoder_lengths=decoder_lengths,
    _pad_step_embedded=pad_step_embedded,
    _eos_step_embedded=eos_step_embedded,
    _encoder_final_state=encoder_final_state)

# using the functions for the attention decoder
decoder_outputs_ta, decoder_final_state, decoder_loop_state = tf.nn.raw_rnn(decoder_cell, callable_loop_fn)

Определение:

def loop_fn(time, previous_output, previous_state, previous_loop_state, _W, _b, _decoder_lengths, _pad_step_embedded, _eos_step_embedded, _encoder_final_state):
if previous_state is None:
    assert previous_output is None and previous_state is None
    return loop_fn_initial(_decoder_lengths, _eos_step_embedded, _encoder_final_state)
else:
    return loop_fn_transition(time, previous_output, previous_state, previous_loop_state, _W, _b, _decoder_lengths, _pad_step_embedded)

Кто-нибудь знает, что это может быть?Я думал, что функция, которую я предоставляю, вызывается или я что-то не так понял?

1 Ответ

0 голосов
/ 03 июня 2018

callable_loop_fn не является функцией, поэтому не вызывается.

В частности, callable_loop_fn - это значение, возвращаемое loop_fn(), которое, в свою очередь, возвращает либо вывод loop_fn_initial(), либо вывод loop_fn_initial().Очевидно, что ни одна из этих двух функций не возвращает функцию, поэтому генерируется исключение loop_fn must be a callable.

В соответствии с TF API вы должны написать:

def loop_fn(time, cell_output, cell_state, loop_state):
    ...
    return (
        elements_finished, 
        next_input, 
        next_cell_state,
        emit_output, 
        next_loop_state
    )

Изатем передайте его tf.nn.raw_rnn:

raw_rnn(decoder_cell, loop_fn)

Обратите внимание, что вы должны соблюдать число и порядок аргументов, которые loop_fn ожидает получить, в противном случае вы получите ошибку на Unexpected argument дляфункция loop_fn.Следовательно, ваша реализация должна быть переставлена ​​так, чтобы принимать только 4 аргумента.

...