我很困惑,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)
如上所述,我做了两个损失函数,一个是在model.compile()中用传统的MSE损失来计算输入和输出的MSE_loss,另一个损失也像MSE损失,但它计算的是中间层的MSE,可以运行,但我很疑惑,这两种不同的加损失方式,我的模型能清楚地知道它们是什么吗?
是的,你的 Model
知道它们是什么,确实。
的 loss
中指定的 model.compile
确保 MSE
之间 Y_Pred
和 Y_Actual
减少了,而 model.add_loss
的差异,确保 d_layer1
和 e_layer2
是减少。
这相当于在 model.compile
而 根本区别 之间 loss
所述 model.compile
和 model.add_loss
中所述的损失。model.compile
被限制在参数上。y_true
和 y_pred
而在 model.add_loss
,我们可以指定 Loss
对于任何数量的 Additional Tensors
在我们的项目中使用。
换句话说: model.add_loss
让我们可以写出更多的 complex losses
决于许多其他 tensors
但它的不便之处在于更多的依赖性。model
而 standard loss functions (those used inside model.compile)
任何型号都可以使用。
希望能帮到你。学习愉快!