2017-02-13 7 views
0

Ситуация: У меня есть большой набор данных с более чем 18 миллионами примеров. Я тренирую несколько моделей и хочу отслеживать точность.Нисходящий рэндинт не очень случайный?

При пересылке всех примеров и точности вычислений это составляет около 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 процентов хороших примеров. Что я могу сделать, чтобы сделать его действительно случайным, чтобы он дал хорошее представление о точности?

Это также обуславливает неудачу, потому что для следующей учебной партии отбираются только хорошие примеры.

EDIT: так что речь идет не о самой тренировке! У меня есть обученная модель с 83-процентной точностью. Я использую только эту модель для проверки точности. При точности тестирования на небольших подмножествах он всегда дает 99 или 100 процентов, даже для 100 случайных партий.

Edit: И код, который я генерировать выходной сигнал с, который получает 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 

Edit: Хорошо, у вас есть точка. Когда учебные партии отбираются таким же образом, что модель обучается только этим данным. Именно по этой причине он почти идеально подходит по этим данным. Но вопрос остается, как выборки из всего набора данных

Так что это версия, что получить точность 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 

Edit: это, кажется, разница между constraints_satisfied_v2 и constraints_satisfied_v3 должна сделать с использованием пакета нормализация. В v3 выбираются случайные выборки, которые соответствуют статистике обучения и статистике std, что обеспечивает высокую производительность. В v2 данные не находятся в произвольном порядке, что делает среднее значение и std не очень редкими.

+0

Могли бы вы также включить код, с которого вы создаете этот вывод? Это было бы полезно. – blacksite

+0

RNG Numpy отлично. Это проблема вашего подхода к обучению. Поскольку вы вообще не указали какую-либо информацию, я полагаю, что это алгоритм обучения, который имеет высокую сложность и сложность модели при малом размере выборки. Это требует регуляции или увеличения размера выборки. При изменении набора данных существует еще много параметров, которые ведут себя по-другому. – sascha

+0

Вы хотите выбрать 256 индексов, но '' 'size = total = 4096'''? – sascha

ответ

0

Это не имеет ничего общего со случайностью, на мой взгляд, и random NumPy отлично справляется.

В этом ответе я предполагаю, что вы тренируетесь какую-то нейронной сети, сокращенно ANN (искусственная нейронная сеть) здесь.

Проблема заключается в том, что почти всегда проще «разобраться» с обычными образцами в небольшой партии объектов, чем в большой. Вот как работает наш мозг, и так работают ANN. Хотя это не означает, что то, что ваш ANN «понял» из небольшой партии, относится к любой другой коллекции объектов того же характера.

Например, вы можете научить компьютер различать кошек и собак на фотографиях, используя 6 фотографий кошек и 7 собак.Теперь, когда вы даете ему фотографию кота, которую он никогда раньше не видел, он может не сказать ничего конкретного, потому что он не «видел» достаточно кошек и собак, он не смог найти generalize.

Они также могут просто запомнить данные и дать вам увлекательную точность на тренировочном наборе, но с ошибкой на тестовые данные.

Итак, это очень важная и сложная проблема ANN, которую вы можете попытаться решить ... путем увеличения количества объектов в наборе, что позволяет компьютеру обобщать.

+0

Хотя не очень научный (что может быть важно обсудить), i утверждают, что это совершенно противоположно «Проблема», почти всегда легче «понять» общие шаблоны в небольшой партии объектов, чем в большой. «Но я разделяю ваше чтение некоторой высокой сложности классификатор ведет себя по-разному на небольших наборах данных. – sascha

+0

Я сделал редактирование, это не имеет никакого отношения к обучению модели. Я использовал уже подготовленную модель. – Derk

+0

@ Derk, вы тренировали модель по данным, которые вы используете для проверки точности? Он мог бы запомнить некоторые из этих данных и просто выплюнуть копии правильных ответов. – ForceBru

Смежные вопросы