例如,假设有一个五个标量作为输出的回归问题,其中每个输出的范围大致相同。在Keras中,我们可以使用不带激活函数(向量回归)的5个输出密集层来对此建模:
output_layer = layers.Dense(5, activation=None)(previous_layer)
model = models.Model(input_layer, output_layer)
model.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])
总损失(公制)是否仅仅是单个损失(公制)的总和?这是否等效于以下多输出模型,其中输出具有相同的隐式损耗权重?在我的实验中,我没有观察到任何明显的差异,但想确保我不会错过任何基本知识。
output_layer_list = []
for _ in range(5):
output_layer_list.append(layers.Dense(1, activation=None)(previous_layer))
model = models.Model(input_layer, output_layer_list)
model.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])
在第一个解决方案中,是否有一种简便的方法将权重附加到输出上,就像在多输出模型的情况下指定loss_weights
一样?
答案 0 :(得分:1)
是的,两者都是等效的。要在第一个模型中复制loss_weights
功能,可以定义自己的自定义损失函数。遵循以下原则:
import tensorflow as tf
weights = K.variable(value=np.array([[0.1, 0.1, 0.1, 0.1, 0.6]]))
def custom_loss(y_true, y_pred):
return tf.matmul(K.square(y_true - y_pred), tf.transpose(weights))
,并在编译时将此函数传递给loss
参数:
model.compile(optimizer='rmsprop', loss=custom_loss, metrics=['mse'])
答案 1 :(得分:1)
这些模型是相同。要回答您的问题,让我们看一下mse loss:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
K.mean
函数您可以说这是输出向量中所有元素的总和。