Как установить начальное состояние для двунаправленного слоя LSTM в Keras? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь установить начальное состояние в кодере, который состоит из двунаправленного слоя 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 для функции вызова.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Я закончил тем, что не использовал двунаправленную оболочку, а просто создал 2 LSTM слоя, один из которых получил параметр go_backwards=True и объединил выходные данные, если это кому-нибудь поможет.Я думаю, что двунаправленная оболочка Keras в настоящий момент не может справиться с подобными вещами.

0 голосов
/ 05 июня 2019

Если еще не слишком поздно, я думаю, ваша initialize_hidden_state функция должна быть:

def initialize_hidden_state(self): init_state = [tf.zeros((self.batch_sz, self.enc_units)) for i in range(4)] return init_state

0 голосов
/ 03 апреля 2019

Вы вводите размер состояния (batch_size, hidden_units), и вы должны ввести состояние с размером (hidden_units, hidden_units).Также у него должно быть 4 начальных состояния: 2 для 2-го состояния и еще 2, потому что у вас есть один прямой и один обратный проход из-за двунаправленного.

Попробуйте изменить это:

def initialize_hidden_state(batch_sz, enc_units):
    return tf.zeros((batch_sz, enc_units))

К

def initialize_hidden_state(enc_units, enc_units):
    init_state = [np.zeros((enc_units, enc_units)) for i in range(4)]
    return init_state

Надеюсь, это поможет

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