【问题标题】:MSE Loss for matrix Machine Learning矩阵机器学习的 MSE 损失
【发布时间】:2017-03-22 20:27:48
【问题描述】:

我有一个模型,每个 epoch 后都有 N 输入和 6 输出。

我的输出看起来像[x y z xx yy zz],我想最小化每个术语的 MSE。但是,我注意到当我使用 MSE 作为损失函数时,它只是取整个集合的平方和的平均值。

【问题讨论】:

  • 所以你的输出是几个输出的串联?为什么不将连接排除在外,并为每个输出使用损失?您的模型可以有多个输出。
  • @DwightTemple 你有关注这个问题的讨论吗?如果我已经回答了您的问题,请将其标记为已接受。如果没有,请告诉我是否有误解。
  • 这实际上是我开始做的。我将模型放入一个循环中,然后一次拟合一个变量。我是 keras 的新手,我不确定如何实现多个输出。

标签: tensorflow keras loss mse


【解决方案1】:

我认为它们的含义相同。让我们用[x_i, y_i, z_i, xx_i, yy_i, zz_i] 表示您对i^th 样本的预测。真实值用[t_x_i, t_y_i, t_z_i, t_xx_i, t_yy_i, t_zz_i]表示

在一批N 样本中,您想要最小化:

L = \sum_i=1^N ((x_i-t_x_i)^2)/N + ... + \sum_i=1^N ((zz_i-t_zz_i)^2)/N 

MSE 损失将最小化以下情况:

L = (1/N) * \sum_i=1^N ((1/6) * [(x_i - t_x_i)^2 + ... + (zz_i-t_zz_i)^2])

你可以看到两者最终都最小化了相同的数量。

如果您的六个输出是自变量,我认为这将成立,因为您将它们建模为具有六个基本事实标签的六个不同输出。

【讨论】:

  • 您可以方便地忽略向量维度,这就是这里的问题。其实是mean(mean((pred-true)**2,axis=-1), axis=0)
  • @nemo 我没有忽略维度。他的输出是一个 6 维向量,从 xzz。我的答案中包含所有六个维度(现在进行了一些编辑)。无论如何,让我们考虑一下您的表达方式。最小化mean(mean((pred-true)**2,axis=-1), axis=0) 意味着优化器将尝试最小化mean((pred-true)**2,axis=-1) 中的每个术语,进而最小化(pred-true)**2 中的每个术语,因为每个术语都是自变量(除非明确说明,否则我假设它们是独立变量)。见this
  • 毫无疑问优化器会优化这些,不管总和如何。我的问题更多的是平均值被接管的维度。拆分输出会导致单独的标准化(1/(N*N_x) f(x) + 1/(N*N_y) + f(y) + ...),而合并后会减少到(1/(N*(N_x+N_y+...)) ...,这是不等价的。
  • @nemo 好的。现在我想我明白我们的不同之处了。你认为这六个输出中的每一个都是多维的。这就是为什么你有N_x, N_y, ..., N_zz。但是,我认为 OP 的设置并不相似。他有六个输出,所以最后一个 FC 层中有六个神经元。我假设这六个输出中的每一个都是标量。所以在我的例子中,N_x, ..., N_zz 都等于一。一旦有时间,我可能会以简洁的方式写下来。
  • 是的。否则,这个问题的意思是没有意义的,因为正如你所描述的,如果这些是单个神经元,那么就没有问题。只有当输出是多个层的串联时才会出现问题。总之很好的讨论。我们会看看 OP 真正想要什么。
【解决方案2】:

您必须创建一个等于 MSE 的张量并将其最小化。

mse = tf.reduce_mean(tf.square(outputs))
train_step = tf.train.*Optimizer(...).minimize(mse)
for _ in range(iterations):
  sess.run(train_step ... )

【讨论】:

  • 对于 tensorflow 可以,但这已发布在 [keras] 标签中,因此您的答案似乎离题了。
猜你喜欢
  • 1970-01-01
  • 2019-04-05
  • 2021-04-15
  • 2019-05-23
  • 1970-01-01
  • 2019-06-11
  • 2017-12-16
  • 2016-11-11
  • 2019-03-07
相关资源
最近更新 更多