Начальное состояние или константы слоя RNN не могут быть определены с помощью комбинации тензоров Кераса и тензоров, отличных от Кераса.

Как мы знаем, декодер принимает скрытые состояния кодера в качестве исходного состояния...

encoder_output , state_h, state_c = LSTM(cellsize,  return_state=True)(embedded_encoder_input)
encoder_states = [state_h, state_c]

decoder_lstm = LSTM(cellsize,  return_state=True, return_sequences=True)
decoder_outputs, state_dh, state_dc = decoder_lstm(embedded_decoder_inputs, initial_state=encoder_states)

Предположим, я хочу заменить исходное состояние декодера на encoder_output и функции от меня из других ресурсов.

encoder_states = [encoder_output , my_state]

Но я сталкиваюсь со следующей ошибкой:

ValueError: Начальное состояние или константы слоя RNN не могут быть заданы с помощью комбинации тензоров Кераса и тензоров не-Кераса ("Тензор Кераса" - это тензор, который был возвращен слоем Кераса, или Input)

Хотя я печатаю state_h & stat_c & encoder_output & my_state, все они имеют одинаковый тип и форму, например:

state_h:  Tensor("lstm_57/while/Exit_2:0", shape=(?, 128), dtype=float32)
my_state:  Tensor("Reshape_17:0", shape=(?, 128), dtype=float32)

Что я понимаю, что он не будет принимать входные данные, не произведенные из предыдущего слоя, и как тензор Кераса?

Обновить

После преобразования тензора в тенор Кераса появилась новая ошибка:

ValueError: входные тензоры в модель должны поступать из keras.layers.Input, Получено: Тензор ("Reshape_18:0", shape=(?, 128), dtype=float32) (отсутствуют метаданные предыдущего слоя).

1 ответ

Я думаю, вы смешали тензор тензора и кераса. Хотя результаты state_h а также my_state являются тензорными, они на самом деле разные. Ты можешь использовать K.is_keras_tensor() различать их. Пример:

import tensorflow as tf
import keras.backend as K
from keras.layers import LSTM,Input,Lambda

my_state = Input(shape=(128,))
print('keras input layer type:')
print(my_state)
print(K.is_keras_tensor(my_state))

my_state = tf.placeholder(shape=(None,128),dtype=tf.float32)

print('\ntensorflow tensor type:')
print(my_state)
print(K.is_keras_tensor(my_state))

# you may need it
my_state = Lambda(lambda x:x)(my_state)
print('\nconvert tensorflow to keras tensor:')
print(my_state)
print(K.is_keras_tensor(my_state))

# print
keras input layer type:
Tensor("input_3:0", shape=(?, 128), dtype=float32)
True

tensorflow tensor type:
Tensor("Placeholder:0", shape=(?, 128), dtype=float32)
False

convert tensorflow to keras tensor:
Tensor("lambda_1/Identity:0", shape=(?, 128), dtype=float32)
True
Другие вопросы по тегам