最大化 keras 模型的 MSE

Emm*_*mma 11 python maximize neural-network keras tensorflow

我有一个生成对抗网络,其中鉴别器通过 MSE 最小化,生成器应该最大化。因为两者都是追求相反目标的对手。

generator = Sequential()
generator.add(Dense(units=50, activation='sigmoid', input_shape=(15,)))
generator.add(Dense(units=1, activation='sigmoid'))
generator.compile(loss='mse', optimizer='adam')

generator.train_on_batch(x_data, y_data)
Run Code Online (Sandbox Code Playgroud)

我必须适应什么才能获得从高 MSE 值中获利的生成器模型?

Gee*_*ode 5

更新:

原始MSE实现如下所示:

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(y_pred - y_true), axis=-1)
Run Code Online (Sandbox Code Playgroud)

我认为正确的最大化损失函数:

def mean_squared_error_max(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(1 / (y_pred - y_true)), axis=-1)
Run Code Online (Sandbox Code Playgroud)

这样我们总是得到一个正的损失值,就像 MSE 函数的情况一样,但效果相反。

更新 2: 最初我写道,由于优化方法的基本概念,简单地否定损失的直观第一个想法不会给出我们预期的结果(您可以在此处阅读有趣的讨论)。在我仔细检查了这两种方法后,特定学习任务的结果(注意:我没有进行全面测试)是这两种方法都使损失最大化,尽管该-loss方法收敛得更快一些。由于此处描述的可能问题,我不确定它是否总是提供最佳解决方案或任何解决方案。如果有人有其他经验,请告诉我。

因此,如果有人也想尝试一下-loss

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return - K.mean(K.square(y_pred - y_true), axis=-1)
Run Code Online (Sandbox Code Playgroud)


额外细节:

OP写道:

我有一个生成对抗网络,其中鉴别器通过 MSE 最小化,生成器应该最大化。因为两者都是追求相反目标的对手。

来自 Ibragil 提供的链接:

同时,生成器正在创建新的合成图像,并将其传递给鉴别器。这样做是希望它们也能被认为是真实的,即使它们是假的。生成器的目标是生成可通过的手写数字:撒谎而不被发现。鉴别器的目标是将来自生成器的图像识别为假图像。


所以这是一个不适定的问题:

GAN 中,我们的最终目标是训练我们的两个对手,即鉴别器生成器,以尽可能地相互对抗。这意味着,两个基础学习算法有不同的任务,但它们可以达到最优解的损失函数是相同的,binary_crossentropy,模型的任务是最小化这个损失。

一个鉴别模型的编译方法:

self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
Run Code Online (Sandbox Code Playgroud)

一个发电机模型的编译方法:

self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
Run Code Online (Sandbox Code Playgroud)

这就像两个跑步者的目标一样,即使他们是这项任务的竞争者,也要尽量缩短到达终点的时间。

所以“相反的目标”并不意味着相反的任务,即最小化损失(即最小化跑步者示例中的时间)。

我希望它有帮助。


Man*_*ano 5

这个问题对我来说不是很清楚。我想你想最大化而不是最小化,同时使用 MSE 的标准。

您可以实现自己的自定义损失函数,该函数计算 -MSE ;翻转损失的符号,从而实现梯度下降方向的翻转。

def negative_mse(y,yhat): 
    return - K.mean(K.sum(K.square(y-yhat)))

model.compile(loss=negative_mse, optimizer='adam')
Run Code Online (Sandbox Code Playgroud)

另一种选择是简单地提供一个消极的学习步骤 - 但我不确定 Keras 允许你这样做。值得一试。