Я пытаюсь установить начальное состояние в кодере, который состоит из двунаправленного слоя LSTM
, равным 0. Однако, если я введу одну матрицу 0, я получу сообщение об ошибке, говорящее о том, что двунаправленный слой должен быть инициализирован списком тензоров (имеет смысл). Когда я пытаюсь скопировать эту матрицу 0 в список, содержащий два из них (чтобы инициализировать оба RNNs
), я получаю сообщение об ошибке, что форма ввода неверна. Что мне здесь не хватает?
class Encoder(tf.keras.Model):
def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):
super(Encoder, self).__init__()
self.batch_sz = batch_sz
self.enc_units = enc_units
self.embedding = keras.layers.Embedding(vocab_size, embedding_dim)
self.lstmb = keras.layers.Bidirectional(lstm(self.enc_units, dropout=0.1))
def call(self, x, hidden):
x = self.embedding(x)
output, forward_h, forward_c, backward_h, backward_c = self.lstmb(x, initial_state=[hidden, hidden])
return output, forward_h, forward_c, backward_h, backward_c
def initialize_hidden_state(batch_sz, enc_units):
return tf.zeros((batch_sz, enc_units))
Я получаю ошибку:
ValueError: An `initial_state` was passed that is not compatible with `cell.state_size`. Received `state_spec`=[InputSpec(shape=(128, 512), ndim=2)]; however `cell.state_size` is [512, 512]
Примечание: выход функции initialize_hidden_state
подается на параметр hidden
для функции вызова.