Tensorflow 矩阵机器学习的均方误差损失

Tensorflow 矩阵机器学习的均方误差损失,tensorflow,keras,loss,mse,Tensorflow,Keras,Loss,Mse,我有一个模型,每个历元后有N输入和6输出 我的输出看起来像,[x y z xx yy zz],我想最小化每个术语的MSE。然而,我注意到,当我使用MSE作为损失函数时,它只是取整个集合的平方和的平均值。你必须创建一个等于MSE的张量并最小化它 mse = tf.reduce_mean(tf.square(outputs)) train_step = tf.train.*Optimizer(...).minimize(mse) for _ in range(iterations): sess.

我有一个模型,每个历元后有
N
输入和
6
输出


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

你必须创建一个等于MSE的张量并最小化它

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

我想他们的意思是一样的。让我们用
[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])
您可以看到,两者最终都最小化了相同的数量


如果你的六个输出是独立变量,我认为这是正确的,因为你将它们建模为六个不同的输出,带有六个基本事实标签。

那么你的输出是几个输出的串联?为什么不将串联排除在外,为每个输出使用一个损耗?您的模型可以有多个输出。@DwightTemple您是否一直在关注这个问题的讨论?如果我已经回答了你的问题,请将其标记为已接受。如果没有,让我知道是否有误解。这实际上是我开始做的。我把我的模型放在一个循环中,然后一次拟合一个变量。我是keras的新手,我不确定如何实现多个输出。tensorflow可以,但这是在[keras]标签中发布的,所以你的答案似乎离题了。你可以很方便地忽略向量维度,这是这里的问题。它实际上是
平均值(平均值((pred-true)**2,轴=-1,轴=0)
@nemo我没有忽略这个维度。他的输出是一个6维向量,从
x
zz
。我的答案中有六个维度(现在有点编辑)。无论如何,让我们考虑一下你的表达方式。最小化
mean(mean((pred-true)**2,axis=-1),axis=0)
意味着优化器将尝试最小化
mean((pred-true)**2,axis=-1)
中的每个项,反过来最小化
(pred-true)**2中的每个项,因为每个项都是独立变量(我假设它们是独立变量,除非明确说明)。请参阅。毫无疑问,优化器将优化这些,而不考虑总和。我的问题更多的是平均值被接管的维度。分离输出将导致单个标准化
(1/(N*N_x)f(x)+1/(N*N_y)+f(y)+……)
,而组合输出将减少到
(1/(N*(N_x+N_y+…)…
这是不等价的。@nemo好吧。现在我想我明白我们的不同之处了。你认为这六个输出中的每一个都是多维的。这就是为什么你有
nux,nuy,…,nuzz
。但是,我认为OP的设置并不相似。他有六个输出,所以最后一个FC层有六个神经元。我假设这六个神经元中的每一个都是多维的tputs是一个标量。所以在我的例子中,
nux,…,nuzz
都等于一。我可能会在有时间的时候用简洁的方式写下来。是的。否则这个问题就没有意义了,因为正如你所描述的,如果这些是单个神经元,那么就没有问题。只有当输出是多个层的串联时呃,有个问题。不管怎样,讨论得很好。我们看看OP到底想要什么。