在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.array:(25000,244,244,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函数中,我按顺序运行每批数据。因此,在没有改组的情况下,每次运行都有一个类的数据。 我还注意到,如果批量大小非常小,我会得到随机的准确性。
答案 0 :(得分:0)
在随机Kaczmarz算法的背景下,有一些数学上的理由。常规Kaczmarz算法是一种旧算法,可以看作是最小二乘问题的非混洗SGD,如果使用随机化,可以保证更快的收敛速度,遵循http://www.cs.ubc.ca/~nickhar/W15/Lecture21Notes.pdf中的引用