Передать несимвольный тензор в слой Keras Lambda - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь передать объект RNNCell в лямбда-слой Keras, чтобы я мог использовать слой Tensorflow в модели Keras следующим образом.

conv_cell = ConvGRUCell(shape = [14, 14],
                       filters = 32,
                       kernel = [3,3],
                       padding = 'SAME')

def convGRU(inputs, cell, length):
    output, final = tf.nn.bidirectional_dynamic_rnn(
            cell, cell, x, length, dtype=tf.float32)
    output = tf.concat(output, -1)
    final = tf.concat(final, -1)
    return [output, final]

lm = Lambda(lambda x: convGRU(x[0], x[1], x[2])([input, conv_cell, length])

Однако я получаю сообщение об ошибке, чтоconv_cell не является символическим тензором (это пользовательский слой, основанный на GRUCell Tensorflow).

Есть ли способ передать ячейку в лямбда-слой?Я заставил его работать с functools.partial, но он не может сохранить / загрузить модель, потому что не может получить доступ к функции внутри модели.

1 Ответ

0 голосов
/ 19 сентября 2019
def convGRU(cell, length): # if length is produced by the model, use it with the inputs    
    def inner_func(inputs):
        code...
    return inner_func

lm = Lambda(convGRU(cell, length))(input)

Для сохранения / загрузки вам нужно использовать custom_objects = {'convGRU': convGRU, 'cell':cell, 'length': length} и т. Д. Все, что Керас не знает автоматически, должно быть в custom_objects для загрузки сохраненной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...