【问题标题】:Different Loss functions on different segments of a DNNDNN 不同部分的不同损失函数
【发布时间】:2020-07-26 20:24:16
【问题描述】:

是否可以在深度网络的不同“段”上定义不同的损失函数(在以下意义上):

假设我有一些输入-输出对 (x_n,y_n) 和 (x_n,z_n),我想训练一个来自 f_k∘...∘f_1 的深度网络(每个 f_i 都是一个前馈层) 这样

  • MSE(f_k∘...∘f_1(x_n) - y_n) 被最小化
  • MSE(f_k∘f_k-1(x_n) - z_n) 也被最小化。

类比/例子/直觉/动机:

假设我希望我的网络输出大约像 x^2 然后 f_k∘f_k-1(x_n)~~ x_n^2 和 z_n:= x_n^2。然后 f_k∘...∘f_1(x_n) 一个前馈网络,其输出层近似为函数 x^2。


如何在 TensorFlow/Keras 中做到这一点?

【问题讨论】:

  • with f_n∘f_n-1(x_n) 是指网络的输出/最终预测吗?
  • @MarcoCerliani 没错。我添加了一个示例来帮助阐明我的最终目标
  • _n for x_n, y_n, z_n 是否代表样本索引?还有_n for f_n 代表层号?如果是这样使用相同的字母有点混乱。
  • @KotaMori 好点,我修改了符号以使其更清晰,但是你是对的。
  • 如果你对两个输出使用相同的损失函数 (MSE),你不需要做任何事情。如果您有兴趣,您只能定义 2 输出的 loss_weight

标签: tensorflow optimization keras neural-network generative-adversarial-network


【解决方案1】:

您可以通过定义两个输出模型来实现这一点。 它基本上最小化了两个损失的加权平均值。

限制是第一层和第 (n-1) 层的输入形状必须相同,因为它们都接收相同的输入 x

from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Input

input_shape = (1,)
model1 = Sequential([
    Dense(5, activation="relu", input_shape=input_shape),
    Dense(8, activation="relu"),
    Dense(input_shape[0])
])

model2 = Sequential([
    Dense(15, activation="relu", input_shape=input_shape),
    Dense(1)
])

x = Input(input_shape)
y = model2(model1(x))
z = model2(x)
model = Model(inputs=x, outputs=[y, z])
model.compile("adam", "mean_squared_error", loss_weight=[0.5, 0.5])

import numpy as np
n = 1000
x = np.random.normal(size=n * input_shape[0]).reshape((n, input_shape[0]))
y = x**2
z = x**2

history = model.fit(x, [y, z], epochs=100)

可视化:

import matplotlib.pyplot as plt
plt.plot(history.history["loss"])

yhat, zhat = model.predict(x)
plt.scatter(x, yhat)
plt.scatter(x, zhat)

【讨论】:

  • 我怎样才能让它只报告“y”数据而不是“z”数据的​​测试集错误?
  • 制作测试集并提供给model.fit。然后在历史记录中,您应该分别看到每个损失以及总损失。我不知道如何压制其中之一。
  • 一切都很好,但它似乎与 RandomizedSearchCV 不兼容这是正常的吗?
  • 如果你在谈论来自sklearn 库的RandomSearchCV,它不应该变得不兼容,因为你的模型有多个输出。如果有的话,这是您如何将它与 tensorflow 模型一起使用的一个普遍问题。无论如何,这是一个单独的问题,如果您无法弄清楚,您应该打开一个新问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多