嵌套顺序模型未接受训练

时间:2019-04-15 14:59:13

标签: python tensorflow tf.keras tensorflow2.0

我正在尝试建立几个预测不同市场发展的模型,每个模型都使用相同的编码器网络。 因此,我定义了一个共享的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模型仅建立一次,并作为encoder_model传递给每个MarketModel。 我的目标是让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网络传播?由于我只添加了两层,因此渐变应该不会消失,对吧?

0 个答案:

没有答案