Начальное состояние или константы слоя 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