0

正如我们所知,解码器将编码器隐藏状态作为初始状态......

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 层的初始状态或常量不能用 Keras 张量和非 Keras 张量的混合来指定(“Keras 张量”是由 Keras 层返回的张量,或由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)

我理解它不会接受不是从前一层产生的输入,以及作为 Keras 张量的输入?

更新

将张量转换为 Keras 张量后,新错误:

ValueError:模型的输入张量必须来自 keras.layers.Input. 收到:Tensor("Reshape_18:0", shape=(?, 128), dtype=float32) (缺少前一层元数据)。

4

1 回答 1

2

我猜你混合了 tensorflow 张量和 keras 张量。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
于 2019-01-20T03:20:34.117 回答