【问题标题】:是否可以从已经训练好的顺序模型中拆分和重用层?
【发布时间】:2022-01-23 06:15:47
【问题描述】:

我对 Keras 还很陌生,但一直在尝试使用 Keras 中的自动编码器来探索大型数据集的底层维度。此处显示了一个简化版本,省略了导入、激活函数等:

input_dim = 2000
hidden_dim = 300
encoding_dim = 50
output_dim = input_dim

inputs = keras.Input(shape=(input_dim,))
hidden1 = layers.Dense(hidden_dim)(inputs)
encoded = layers.Dense(encoding_dim)(hidden1)
hidden2 = layers.Dense(hidden_dim)(encoded)
decoded = layers.Dense(output_dim)(hidden2)
mymodel = keras.Model(inputs=inputs, outputs=decoded)

经过一番努力,我成功地训练了上述模型,因为它在在输入端再现输出方面做得不错。但我迟到了,我想看看是什么通过了瓶颈,以及它如何影响最终输出。

我的问题:是否可以追溯性地拆分模型中经过训练的编码器和解码器部分并分别调用它们,还是我需要从一开始就这样设置并从头开始训练?

【问题讨论】:

  • 你到底想看什么?给定输入的激活?
  • 除其他外,我可能想使用编码器的输出作为可能的输入算法(DL 与否)来估计其他相关变量。

标签: keras autoencoder


【解决方案1】:

为每个输入获取编码器输出的一种方法是创建一个新的 NN 直到该层。您可以使用get_weightsset_weights 方法从训练好的模型中获取权重,并设置新中间模型的权重。例如:

int_model = keras.Sequential()

for l in range(encoder_layer + 1):
    int_layer = mymodel.layers[l]
    int_model.add(Dense(
        int_layer.output_shape[1],
        input_dim=int_layer.input_shape[1],
        activation=int_layer.activation)
    )
    int_model.layers[l].set_weights(int_layer.get_weights())
int_model.compile(loss=mymodel.loss)

然后您可以为所有输入运行int_model.predict(),该输出将是编码器层。

【讨论】:

  • 这看起来很有希望。所以 compile() 步骤不会重新初始化权重?无论如何设置 trainable=False 是个好主意吗?
  • 这似乎对我不起作用,尽管我正在通过一些可能的修复。输入层是否需要区别对待?我应该将索引引用[1] 应用于input_shapeoutput_shape[0]
  • 它不会重新初始化权重 - 层负责初始化 (keras.io/api/layers/core_layers/dense)。我之前没有在实践中使用 trainable=false ,但这对我来说听起来很合理——尤其是为了便于调试
  • 输入和输出形状索引是[1] 而不是[l]
  • 忽略我关于 [0][1] 的问题——现在无法编辑原始评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多