Keras中model.compile()和model.add_loss()的损失差异

3

我对model.compile()中的add_loss和传统的loss有什么区别感到困惑?

我的代码如下:

from time import time
import numpy as np
import random
from keras.models import Model
import keras.backend as K
from keras.engine.topology import Layer, InputSpec
from keras.layers import Dense, Input, GaussianNoise, Layer, Activation
from keras.models import Model
from keras.optimizers import SGD, Adam
from keras.utils.vis_utils import plot_model
from keras.callbacks import EarlyStopping


input_place = Input(shape=(128,))

e_layer1 = Dense(64,activation='relu')(input_place)
e_layer2 = Dense(32,activation='relu')(e_layer1)
hidden = Dense(16,activation='relu')(e_layer2)

d_layer1 = Dense(32,activation='relu')(hidden)
d_layer2 = Dense(64,activation='relu')(d_layer1)

output_place = Dense(128,activation='sigmoid')(d_layer2)

model = Model(inputs=input_place,outputs=output_place)

loss = K.mean(K.square(d_layer1 - e_layer2),axis = -1)

model.add_loss(loss)

model.compile(optimizer = 'adam',
              loss=['mse'],
              metrics=['accuracy'])

input_data = np.random.randn(1,128)

model.fit(input_data,
          input_data,
          epochs=5)

如上所述,我制作了两个损失函数,一个是传统的MSE损失,在model.compile()中用于计算输入和输出的MSE_loss,另一个损失也类似于MSE损失,但它计算了中间层的MSE。它可以运行,但我很困惑,使用这两种不同的方式添加损失,我的模型能清楚地知道它们是什么吗?

1个回答

2
是的,你的模型确实知道它们是什么。
在model.compile中指定的loss确保降低Y_Pred和Y_Actual之间的MSE,而model.add_loss确保降低d_layer1和e_layer2之间的差异。
这相当于在model.compile中指定了两个loss,但是model.compile中指定的loss和model.add_loss之间的基本区别在于,model.compile中指定的loss仅限于参数y_true和y_pred,而在model.add_loss中,我们可以指定与项目中使用的任意数量的其他张量相关的Loss。
换句话说,model.add_loss允许我们编写更复杂的依赖于许多其他张量的loss,但它的缺点是更依赖于模型,而标准损失函数(在model.compile中使用的那些)可以与任何模型一起使用。
希望这有所帮助。愉快学习!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接