【问题标题】:How to replace an Embedding layer with a Time Distributed Dense after training?训练后如何用时间分布密集替换嵌入层?
【发布时间】:2017-01-24 17:55:25
【问题描述】:

我有以下问题:

  1. 我想使用 LSTM 网络进行文本分类。为了加快训练速度并使代码更清晰,我想在keras.Tokenizer 旁边使用Embedding 层来训练我的模型。

  2. 一旦我训练了我的模型 - 我想计算输出 w.r.t 的显着图。输入。为此,我决定用TimeDistributedDense 替换Embedding 层。

你知道什么是最好的方法吗?对于一个简单的模型,我可以简单地重建具有已知权重的模型 - 但我想让它尽可能通用 - 例如以替换未来的模型结构并使我的框架尽可能与模型无关。

【问题讨论】:

    标签: machine-learning nlp neural-network embedding keras


    【解决方案1】:

    您可以在训练后使用现有层创建新模型,而不会丢失训练的信息。创建模型不会覆盖值,它只是重新排列张量流。例如,如果您的模型如下所示:

    # Create model for training, includes Embedding layer
    in = Input(...)
    em = Embedding(...)
    l1 = LSTM(...)
    l2 = TimeDistributed(Dense(...))
    
    t_em = em(in)
    t_l1 = l1(t_em)
    t_l2 = l2(t_l1)
    
    model_train = Model(inputs=[in], outputs=[t_l2])
    model_train.compile(...)
    model_train.fit(...)
    
    # Create model for salience map, ignores Embedding layer
    t_l1 = l1(in)
    t_l2 = l2(in)
    model_saliency = Model(inputs=[in], outputs=[t_l2])
    

    附带说明,TimeDistributedDense 已弃用,请使用 wrappers.TimeDistributed

    【讨论】:

    • 但是如何将嵌入输出和输入形状强制相同?这些完全不同?
    • 您始终可以将模型的重要部分提取到自己的模型中,并在需要时为其提供Embedding 输入。模型可以像普通层/张量一样使用。
    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2021-01-18
    • 2020-05-29
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多