Keras中model.compile()和model.add_loss()的损失之间的区别

时间:2019-10-08 17:18:20

标签: python tensorflow keras loss

我不知道add.loss和model.compile()中的传统损失之间有什么区别?

我的代码如下:

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)

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

1 个答案:

答案 0 :(得分:0)

是的,您的Model确实知道它们是什么。

loss中指定的model.compile确保减小MSEY_Pred之间的Y_Actual,并且model.add_loss确保差异d_layer1e_layer2之间的距离减少了。

这等效于在model.compile中指定两个损失,但lossmodel.compile中指定的model.add_loss之间的基本差异model.compile中指定的损耗仅限于参数y_truey_pred,而在model.add_loss中,我们可以针对任意数量的{{ 1}}用于我们的项目。

换句话说,Loss允许我们编写更多Additional Tensors,它们依赖于许多其他model.add_loss,但是它带来的不便是更加依赖complex losses ,而tensors仅适用于任何模型。

希望这会有所帮助。学习愉快!