情况:我有一个包含超过1800万个示例的大数据集。 我训练了几个模型,并希望跟踪准确性。
转发所有示例和计算精度时,这大约为83%。但这需要很长时间。
因此,我尝试对整个数据集的一小部分进行采样并计算其准确性。我希望看到大约相同的数字(约80%)
total = 4096
N = dataset.shape[0]
indices = np.random.randint(N-1, size=total)
batch = dataset[indices,:]
然而,现在输出看起来像这样,当它运行10'随机'批次:
> satisfied 4096/4096
> 1.0 satisfied 4095/4096
> 0.999755859375 satisfied 4095/4096
> 0.999755859375 satisfied 4094/4096
> 0.99951171875 satisfied 4095/4096
> 0.999755859375 satisfied 4095/4096
> 0.999755859375 satisfied 4094/4096
> 0.99951171875 satisfied 4096/4096
> 1.0 satisfied 4095/4096
> 0.999755859375 satisfied 4096/4096
> 1.0
所以这里的表现总是太好了,似乎只是从80%的好例子中抽样。我该怎么做才能使它真正随机,这样才能很好地了解准确性?
这也使得培训出错了,因为对于下一个培训批次,只会对好的例子进行抽样。
编辑:所以这不是培训本身!我有一个训练有素的模型,准确率为83%。我只使用这个模型来测试准确性。当测试小子集的准确度时,它总是提供99%或100%,即使对于100个随机批次也是如此。编辑: 我生成输出的代码得到99%或100%
def constraints_satisfied_v3(sess, model, dataset, pointclouds, instructions, trajectories, distances, is_training=0):
satisfied = 0
total = 4096
# Pick random examples
N = dataset.shape[0]
indices = np.random.randint(N-1, size=total)
batch = dataset[indices,:]
pdb.set_trace()
# Fill a feed dictionary with the actual set of images and labels
feed_dict = {model.input_pointcloud: pointclouds[batch[:,0],:],
model.input_language: instructions[batch[:,1],:],
model.input_traj: trajectories[batch[:,2],:],
model.input_traj_mv: trajectories[batch[:,3],:],
model.distances: distances[batch[:,2], batch[:,3]],
model.is_training: is_training}
loss_value,emb_pl,emb_t,emb_t_mv,sim_mv,sim = sess.run([model.loss,model.embeddings_pl,model.embeddings_t,model.embeddings_t_mv,model.sim_mv,model.sim],
feed_dict=feed_dict)
result = np.greater_equal(sim, distances[batch[:,2], batch[:,3]]+sim_mv)
satisfied = satisfied + np.sum(result)
print 'satisfied %d/%d' % (satisfied, total)
percentage = float(satisfied)/float(total)
#pdb.set_trace()
return percentage
编辑:好的,你有一个观点。当训练批次的采样方式相同时,模型仅对该数据进行训练。这就是为什么它在这些数据上几乎完美无缺。但问题仍然是如何从整个数据集中采样
所以这是获得83%准确度的版本
def constraints_satisfied_v2(sess, model, dataset, pointclouds, instructions, trajectories, distances, is_training=0):
satisfied = 0
total = 0
N = dataset.shape[0]
#indices = np.random.randint(N-1, size=int(total))
#batch = dataset[indices,:]
i = 10000
while i < N:
indices = np.arange(i-10000, i)
if i+10000 < N:
i = i+10000
else:
i = N
batch = dataset[indices,:]
# Fill a feed dictionary with the actual set of images and labels
feed_dict = {model.input_pointcloud: pointclouds[batch[:,0],:],
model.input_language: instructions[batch[:,1],:],
model.input_traj: trajectories[batch[:,2],:],
model.input_traj_mv: trajectories[batch[:,3],:],
model.distances: distances[batch[:,2], batch[:,3]],
model.is_training: is_training}
loss_value,emb_pl,emb_t,emb_t_mv,sim_mv,sim = sess.run([model.loss,model.embeddings_pl,model.embeddings_t,model.embeddings_t_mv,model.sim_mv,model.sim],
feed_dict=feed_dict)
result = np.greater_equal(sim, distances[batch[:,2], batch[:,3]]+sim_mv)
satisfied = satisfied + np.sum(result)
total = total + batch.shape[0]
print 'satisfied %d/%d' % (satisfied, total)
percentage = float(satisfied)/float(total)
return percentage
编辑:看起来constraints_satisfied_v2和constraints_satisfied_v3之间的区别与批量标准化的使用有关。在v3中,挑选随机样本,其对应于训练均值和标准统计,因此具有高性能。在v2中,数据不是随机顺序,这使得均值和标准不是很有代表性
答案 0 :(得分:0)
在我看来,这与随机性无关,NumPy的random
完全没问题。
在这个答案中我假设你正在训练某种神经网络,缩写为 ANN (人工神经网络)。
问题是,在一小批对象中“理解”常见模式几乎总是比在大型对象中更容易。这就是我们的大脑如何运作,这也是人工神经网络的运作方式。虽然这并不意味着您的ANN从较小批次中“理解”的内容适用于任何其他相同性质的对象集合。
例如,您可以使用6张猫和7只狗的照片教电脑区分猫和狗的照片。现在,当你给它一张前所未见过的猫的照片时,它可能无法说出任何具体内容,因为它还没有“看到”足够的猫狗,它无法概括。
他们也可以简单地记住数据并为您提供有关训练集的精确准确性,但在测试数据上却非常糟糕。
因此,这是人工神经网络的一个非常重要且困难的问题,您可以尝试通过增加集合中的对象数量来解决这个问题,从而允许计算机进行概括。