我正在尝试建立几个模型来预测不同的市场发展,每个模型都使用相同的编码器网络。所以我定义了一个共享的 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
. 我的目标是让 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)
我错过了什么?梯度不应该也通过 Sequential LSTM 网络传播吗?因为我只添加了两层,所以渐变不应该消失,对吧?