使用相同的数据重新训练会返回不同的准确度

数据挖掘 机器学习 神经网络 张量流
2021-09-19 00:27:29

我正在使用 TensorFlow 来训练一个简单的神经网络(3 个连续的密集层)。问题是每次我从头开始重新训练时,准确性都会发生很大变化。我知道,由于权重是随机初始化的,它可能并不总是达到完全相同的精度;但是,我在测试集上的准确率范围为 4%。

这种变化使得无法检查网络的不同配置或数据的不同预处理步骤是否工作得更好或更差,因为配置/预处理是一个好/坏的主意,或者只是因为我对随机初始权重感到幸运/不幸。

这是 5 次连续训练 + 测试的准确度示例。数字是:

  1. 训练集上的精度
  2. 验证拆分的准确性 (20%)
  3. 测试集的准确性
  4. MSE
        1.  2.  3.  4.
Run #1: 95  91  74  20
Run #2: 94  92  75  18
Run #3: 94  91  74  20
Run #4: 94  92  73  20
Run #5: 94  91  77  17

我还发现训练、验证和测试集的准确性之间没有相关性,这让我感到困惑。

我尝试了 ANN 的不同配置、更长的训练、更短的训练、更大和更小的验证拆分、不同的优化器......似乎没有什么能让我在重新训练中获得更稳定的准确性。我在这里发布的数字是我能得到的最好的数字。

4%的范围是正常的吗?有没有办法避免那些次优的培训?这可能是与局部最小值有关的问题吗?

3个回答

我建议应用非随机权重初始化,以查看随机初始化的影响。

例如,您可以使用 Nguyen-Widrow 权重初始化。

def initnw(layer):
"""
Nguyen-Widrow initialization function

:Parameters:
    layer: core.Layer object
        Initialization layer
"""
ci = layer.ci
cn = layer.cn
w_fix = 0.7 * cn ** (1. / ci)
w_rand = np.random.rand(cn, ci) * 2 - 1
# Normalize
if ci == 1:
    w_rand = w_rand / np.abs(w_rand)
else:
    w_rand = np.sqrt(1. / np.square(w_rand).sum(axis=1).reshape(cn, 1)) * w_rand

w = w_fix * w_rand
b = np.array([0]) if cn == 1 else w_fix * np.linspace(-1, 1, cn) * np.sign(w[:, 0])

# Scaleble to inp_active
amin, amax  = layer.transf.inp_active
amin = -1 if amin == -np.Inf else amin
amax = 1 if amax == np.Inf else amax

x = 0.5 * (amax - amin)
y = 0.5 * (amax + amin)
w = x * w
b = x * b + y

# Scaleble to inp_minmax
minmax = layer.inp_minmax.copy()
minmax[np.isneginf(minmax)] = -1
minmax[np.isinf(minmax)] = 1

x = 2. / (minmax[:, 1] - minmax[:, 0])
y = 1. - minmax[:, 1] * x
w = w * x
b = np.dot(w, y) + b

layer.np['w'][:] = w
layer.np['b'][:] = b

return

来源:https ://pythonhosted.org/neurolab/_modules/neurolab/init.html

另一方面,请记住,局部最小值算法(梯度下降、Adam Optimizer 等)曾经有一些随机行为,例如在起点的定义或特定的噪声参数(如 epsilon)中。

问题的一个可能原因是您使用均方误差 (MSE) 作为分类问题的损失函数。

通常,对于分类,您将使用分类交叉熵。

如果您在训练集上获得 95% 的准确率,但在测试集上只有 75%,这表明严重的过度拟合,您列出的任何措施都可能无法解决。

验证结果与训练如此接近,但与测试相差甚远,这也令人怀疑。当您在训练期间更改验证集时,通常会发生这种情况,这意味着实际上根本没有验证集。或者,如果您一遍又一遍地训练,直到在验证集上获得所需的准确度,这也是过度拟合的一个原因。