Numpy randint不是随机的吗?

时间:2017-02-13 13:49:11

标签: python random

情况:我有一个包含超过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中,数据不是随机顺序,这使得均值和标准不是很有代表性

1 个答案:

答案 0 :(得分:0)

在我看来,这与随机性无关,NumPy的random完全没问题。

在这个答案中我假设你正在训练某种神经网络,缩写为 ANN (人工神经网络)。

问题是,在一小批对象中“理解”常见模式几乎总是比在大型对象中更容易。这就是我们的大脑如何运作,这也是人工神经网络的运作方式。虽然这并不意味着您的ANN从较小批次中“理解”的内容适用于任何其他相同性质的对象集合。

例如,您可以使用6张猫和7只狗的照片教电脑区分猫和狗的照片。现在,当你给它一张前所未见过的猫的照片时,它可能无法说出任何具体内容,因为它还没有“看到”足够的猫狗,它无法概括

他们也可以简单地记住数据并为您提供有关训练集的精确准确性,但在测试数据上却非常糟糕。

因此,这是人工神经网络的一个非常重要且困难的问题,您可以尝试通过增加集合中的对象数量来解决这个问题,从而允许计算机进行概括