Tensorflow 为什么洗牌数据可以提供更高的准确性?

Tensorflow 为什么洗牌数据可以提供更高的准确性?,tensorflow,neural-network,Tensorflow,Neural Network,在Tensorflow中,我为2个图像类问题编写了一个大模型。我的问题与以下代码片段有关: X, y, X_val, y_val = prepare_data() probs = calc_probs(model, session, X) accuracy = float(np.equal(np.argmax(probs, 1), np.argmax(y, 1)).sum()) / probs.shape[0] loss = log_loss(y, probs) X是一个np.shape数组:

在Tensorflow中,我为2个图像类问题编写了一个大模型。我的问题与以下代码片段有关:

X, y, X_val, y_val = prepare_data()
probs = calc_probs(model, session, X)
accuracy = float(np.equal(np.argmax(probs, 1), np.argmax(y, 1)).sum()) / probs.shape[0]
loss = log_loss(y, probs)
X是一个np.shape数组:(25000244244,3)。该代码导致精度=0.5834(接近随机精度),损失=2.7106。但是 当我洗牌数据时,在第一行之后添加以下3行:

sample_idx = random.sample(range(0, X.shape[0]), 25000)
X = X[sample_idx]
y = y[sample_idx]
,结果变得方便:准确度=0.9933,损耗=0.0208。 为什么洗牌数据可以提供更高的准确性?或者是什么原因呢

函数calc_probs主要是一个运行调用:

probs = session.run(model.probs, feed_dict={model.X: X})
更新: 经过数小时的调试,我发现对单个图像进行评估会得到不同的结果。例如,如果多次运行以下代码行,每次都会得到不同的结果:

session.run(model.props, feed_dict={model.X: [X[20]])
我的数据通常是经过排序的,X首先包含1类样本,然后是2类样本。在calc_probs函数中,我按顺序使用每批数据运行。因此,在没有洗牌的情况下,每次运行都有一个类的数据。
我还注意到,使用随机洗牌,如果批量非常小,我会得到随机精度。

在随机Kaczmarz算法的上下文中,这是有数学依据的。常规Kaczmarz算法是一种古老的算法,可以看作是最小二乘问题上的非随机SGD,如果使用随机化,可以保证更快的收敛速度,请遵循

中的参考资料。谢谢,我知道这一点,我同意你的看法。但是我的模型已经训练过了,我在这里说的是用混合数据和非混合数据来评估它。对不起,如果问题不清楚的话。嗯,你的前进道具每次都会给出不同的结果?听起来有点奇怪,你用的是什么样的网络?我用的是InceptionV3。批量规范化有什么有趣的地方吗?