Динамическое количество сложенных LSTM в пользовательской модели Tensorflow

#python #tensorflow #keras

Вопрос:

Я пытаюсь реализовать пользовательскую модель в tensorflow, расширяющую tf.keras.Класс модели.

Мне нужен способ добавить n сложенных слоев LSTM в модель.

Например, предполагая следующую реализацию

 class CustomizedLSTM(tf.keras.Model):
    def __init__(self, num_hidden_layers, vocab_size):
        super(CustomizedLSTM, self).__init__()
        self.embedding = tf.keras.layers.Embedding(vocab_size,300)
        self.first_lstm = tf.keras.layers.LSTM(256, activation="relu")
        self.first_dense = tf.keras.layers.Dense(64, activation="relu")
        self.classification_layer = tf.keras.layers.Dense(1, activation="sigmoid")

    def call(self, inputs):
        x = self.embedding(inputs)
        x = self.first_lstm(x)
        x = self.first_dense(x)
        return self.classification_layer(x)
 

Я хотел бы добавить возможность настройки количества скрытых слоев LSTM.
другими словами, я хотел бы создать модель с num_hidden_layers, сложенными LSTM.

Возможно ли это? Не могли бы вы, пожалуйста, помочь мне?

Ответ №1:

 class CustomizedLSTM(tf.keras.Model):
    def __init__(self, num_hidden_layers, dim_per_hidden, vocab_size):
        self.lstms = []
        super(CustomizedLSTM, self).__init__()
        self.embedding = tf.keras.layers.Embedding(vocab_size,300)
        '''
        To stack multiple LSTMs, it is mandatory for all the lower LSTMs to have 
        return_sequence=True, as they will be fed as input to the next LSTM.
        '''
        for i in range(num_hidden_layers):
            self.lstms.append(tf.keras.layers.LSTM(dim_per_hidden[i], activation="relu", return_sequences=True))
        '''
        The last lstm with return_sequences=False, you can change it according to 
        your needs.
        '''
        self.lstms.append(tf.keras.layers.LSTM(dim_per_hidden[i], activation="relu", return_sequences=False))
        self.first_dense = tf.keras.layers.Dense(64, activation="relu")
        self.classification_layer = tf.keras.layers.Dense(1, activation="sigmoid")

    def call(self, inputs):
        x = self.embedding(inputs)
        for layer in self.lstms:
            x = layer(x)
        x = self.first_dense(x)
        return self.classification_layer(x)
 

Я добавил еще один параметр, который вы можете учитывать — «dim_per_hidden».:
Этот параметр представляет собой список чисел для определения количества
нейронов каждого слоя lstm