gpt4 book ai didi

python - 在组合网络的子网上使用两种损失

转载 作者:行者123 更新时间:2023-11-28 19:00:21 25 4
gpt4 key购买 nike

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

stacked networks

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

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)])

最佳答案

这是错误的使用 Keras 模型功能 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

这个组合模型的损失是损失 1 和损失 2 的组合。在编译模型时,您可以指定每个损失的权重以获得整体损失。如果你想要的损失是 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])

关于python - 在组合网络的子网上使用两种损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53295272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com