【问题标题】:Use both losses on a subnetwork of combined networks在组合网络的子网络上使用两种损失
【发布时间】:2019-04-17 03:04:55
【问题描述】:

我正在尝试将两个网络堆叠在一起。我想分别计算每个网络的损失。例如在下图中; LSTM1 的损失应该是 (Loss1 + Loss2) 并且系统的损失应该只是 (Loss2)

我用上面的想法实现了一个像下面这样的网络,但不知道如何编译和运行它。

def build_lstm1():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h = LSTM(1024, return_sequences=True))(x)
    scores = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h)
    LSTM1 = Model(x, scores)
    return LSTM1


def build_lstm2():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h = LSTM(1024, return_sequences=True))(x)
    labels = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h)
    LSTM2 = Model(x, labels)
    return LSTM2




lstm1 = build_lstm1()
lstm2 = build_lstm2()


combined = Model(inputs = lstm1.input ,
                 outputs = [lstm1.output,
                            lstm2(lstm1.output).output)])

【问题讨论】:

  • 你能给出上面网络的详细结果吗?正确输入输入后,上述网络的结果是什么?
  • Feseoglu,这里有一个 keras 教程页面keras.io/getting-started/functional-api-guide/… 来解决你的问题。请告知我们它是否有效。

标签: python keras neural-network deep-learning lstm


【解决方案1】:

这是使用 Keras 的 Model 功能 API 的错误方式。此外,LSTM1 的损失也不可能作为 Loss1+ Loss2。它只会是 Loss1。同样对于 LSTM2,它只会是 Loss2。但是,对于组合网络,您可以将 Loss1 和 Loss2 的任何线性组合作为整体损失,即

Loss_overall = a.Loss1 + b.Loss2。其中 a,b 是非负实数

Model Functional API 的真正本质在于它允许您在单个模型中创建具有多个输出和多个输入的深度学习架构。

def build_lstm_combined():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h_1 = LSTM(1024, return_sequences=True))(x)
    scores = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h_1)
    h_2 = LSTM(1024, return_sequences=True))(h_1)
    labels = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h_2)
    LSTM_combined = Model(x,[scores,labels])
    return LSTM_combined

这个组合模型的损失是 Loss1 和 Loss2 的组合。在编译模型时,您可以指定每个损失的权重以获得整体损失。如果您想要的损失是 0.5Loss1 + Loss2,您可以这样做:

model_1 = build_lstm_combined()
model_1.compile(optimizer=Adam(0.001), loss = ['categorical_crossentropy','categorical_crossentropy'],loss_weights= [0.5,1])

【讨论】:

  • 作为Loss2,我的意思是系统的丢失。我现在编辑了我的问题,所以现在 lstm1 的损失应该是模型损失和 lstm1 损失,lstm2 的损失应该来自模型损失。
  • 我不知道你为什么要分别丢失 LSTM 1 和 LSTM 2,因为这是一个大模型的一部分。就任何神经网络的训练而言,无论多么复杂或任何 ML 模型,都只有一个损失。在我们的例子中,损失可能是不同部分的组合(损失 = 损失 1 + 损失 2),但在我们尝试最小化整体损失以获得最佳权重参数的过程中。我认为损失是指 LSTM 1 的中间输出,这反映在我的回答中。
猜你喜欢
  • 2019-03-14
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2021-08-01
  • 2019-02-20
  • 2017-10-19
  • 1970-01-01
相关资源
最近更新 更多