0

MSE 作为顺序模型中的损失函数,当数据长度 > 批量大小时无法正常工作。

让我们从数据长度 < 32 开始。在这种情况下它工作正常,接下来我们将对数据中的另外 3 个值执行相同的操作。

首先我们获取数据,然后计算 MSE,然后运行我们的简单序列模型的一个 epoch,损失函数 = MSE。我们将在这里看到损失函数返回是正确的。

在第二步中,我们将使用另外 3 个值再次执行此操作。模型返回的 MSE 会有所不同。

import tensorflow as tf
import numpy as np
from tensorflow import keras
# tf version : 2.2.0

mse = tf.keras.losses.MeanSquaredError()

xs = np.arange(-10,20,1,dtype="float32")
# from -10. to 19.

def hw_function(x) : 
    return (2 * x) - 1

ys = np.apply_along_axis(hw_function, 0, xs)
# from -21. to 37.
# len(ys) = 30

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
# model.weights

# e.g random weights ) bias = 0
# [<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[1.6994196]], dtype=float32)>,
# <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]

xxs=xs*model.weights[0][0][0]

mse(xxs, ys).numpy()
# MSE = 6.8929496 

model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(xs, ys, epochs=1)

# 1/1 [==============================] - 0s 2ms/step - loss: 6.8929
# <tensorflow.python.keras.callbacks.History at 0x7f9ab05130f0>
# we get MSE = 6.8929 that's perfect

我们做的完全一样,但是我们用 33 个值代替了 30 个值。当然权重是随机值

import tensorflow as tf
import numpy as np
from tensorflow import keras
# tf version : 2.2.0

mse = tf.keras.losses.MeanSquaredError()

xs = np.arange(-10,20,1,dtype="float32")
# from -10. to 22.
def hw_function(x) : 
    return (2 * x) - 1
ys = np.apply_along_axis(hw_function, 0, xs)
# from -21. to 43.
# len(ys) = 33

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
# model.weights
# e.g
# [<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-1.1775365]], dtype=float32)>,
# <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]

# bias = 0 
xxs=xs*model.weights[0][0][0]

mse(xxs, ys).numpy()
# we get 1241.7897

model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(xs, ys, epochs=1)

# 1/1 [==============================] - 0s 2ms/step - loss: 1249.6738
# <tensorflow.python.keras.callbacks.History at 0x7f9ab05130f0>
# we get MSE = 1249.6738 it's an error

这是我的问题。为什么,当数据长度 > 批量大小时,我们无法通过 MSE 获得正确的值作为顺序模型中的损失函数?

如果我使用 MAE 代替 MSE,它可以正常工作,当数据>批量大小时,模型返回的值是正确的。

它与批量大小有关。当数据长度 < 32 时,它工作正常(总是),但当它 > 32 时,每次 MSE 都会失败

4

1 回答 1

0

我不知道我是否完全理解您在此处尝试执行的操作,但您的问题与默认情况下 inmodel.fit(xs, ys, epochs=1)参数batch_size等于32.

这就是你的代码失败的原因,如果你在你正在做的实验中设置它64并增加你的ys维度,你的问题应该得到解决。

于 2020-06-15T09:55:02.460 回答