Вложенная последовательная модель не тренируется - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь построить несколько моделей, предсказывающих разные рыночные события, каждая из которых использует одну и ту же сеть кодировщика.Таким образом, я определил общую сеть LSTM следующим образом:

def build_LSTM(layer_1_units=64, layer_2_units=128, dense_units_1=16, dropout=0.2, end_activation='softmax', optimizer='Adam'):
  model = tf.keras.models.Sequential([
      kl.LSTM(layer_1_units, return_sequences=True, input_shape=(SEQ_LEN, 56), name='Encoder/LSTM_1'),
      kl.LSTM(layer_2_units, name='Encoder/LSTM_2'),
      kl.BatchNormalization(name='Encoder/BatchNorm'),
      kl.Dropout(dropout, name='Encoder/Dropout'),
      kl.Dense(dense_units_1, activation='relu', name='Encoder/Dense')
  ])
  return model

Я также определил класс для каждого рынка, который имеет следующую модель в качестве члена:

class MarketModel(tf.keras.Model):

  def __init__(self, encoder_model, name):
    super(MarketModel, self).__init__()
    self.dense1 = kl.Dense(64, activation='relu', name=name + '/Dense_1')
    self.out = kl.Dense(2, activation='softmax', name=name + '/Out')
    self.encoder = encoder_model

  def call(self, inputs):
    x = self.encoder(inputs)
    x = self.dense1(x)
    return self.out(x)

Пока все хорошовсе модели могут быть обучены на их соответствующих данных.Модель LSTM создается один раз и передается каждой MarketModel как encoder_model.Моя цель - научить LSTM создавать скрытое пространство, которое затем используется дополнительными плотными слоями для прогнозирования.Однако, проверив гистограммы, я понял, что вес сети энкодера не меняется вообще.

Я проверил trainable_variables, и все слои перечислены, так что в теории это должно работать, верно?Я также сохранил веса энкодера перед тренировочным шагом с помощью

old_enc_weights = tf.identity(market.model.encoder.layers[4].weights[0])

и сравнил их с весами после тренировки

print(market.model.encoder.layers[4].weights[0] - old_enc_weights)

и, конечно же, веса не изменились вообще (распечатанный результат содержит только 0)

Чего мне не хватает?Разве градиент не должен распространяться и через последовательную сеть LSTM?Поскольку я добавляю только два слоя, градиент не должен исчезать, верно?

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