Ситуация: У меня есть большой набор данных с более чем 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 не очень редкими.
Могли бы вы также включить код, с которого вы создаете этот вывод? Это было бы полезно. – blacksite
RNG Numpy отлично. Это проблема вашего подхода к обучению. Поскольку вы вообще не указали какую-либо информацию, я полагаю, что это алгоритм обучения, который имеет высокую сложность и сложность модели при малом размере выборки. Это требует регуляции или увеличения размера выборки. При изменении набора данных существует еще много параметров, которые ведут себя по-другому. – sascha
Вы хотите выбрать 256 индексов, но '' 'size = total = 4096'''? – sascha