2016-10-02 3 views
0

Итак, у меня есть следующие массивы numpy.Для вычисления точности не выполняется

  • Х набор проверки, X_val: (47151, 32, 32, 1)
  • у валидации набор (метки), y_val_dummy: (47151, 5, 10)
  • у набора предсказания проверки, y_pred: (47151, 5, 10)

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

y_pred_list = model.predict(X_val) 
correct_preds = 0 
# Iterate over sample dimension 
for i in range(X_val.shape[0]):   
    pred_list_i = [y_pred_array[i] for y_pred in y_pred_array] 
    val_list_i = [y_val_dummy[i] for y_val in y_val_dummy] 
    matching_preds = [pred.argmax(-1) == val.argmax(-1) for pred, val in zip(pred_list_i, val_list_i)] 
    correct_preds = int(np.all(matching_preds)) 

total_acc = correct_preds/float(x_val.shape[0]) 
+0

Не должно быть '[y_pred [i] для y_pred в y_pred_array] вместо этого и аналогичным образом для следующего шага? – Divakar

+0

@Divakar Спасибо, да. Ха-ха. – Ritchie

ответ

0

Вы Основная проблема заключается в том, что вы генерации огромного количества очень больших списков нет реальных оснований

for i in range(X_val.shape[0]): 
    # this line generates a 47151 x 5 x 10 array every time   
    pred_list_i = [y_pred_array[i] for y_pred in y_pred_array] 

То, что происходит в том, что итерация над й Numpy перебирает массив более медленный изменяющийся индекс (т.е. самый левый), поэтому каждое понимание списка работает на 47 тыс. записей.

Незначительно лучше бы

for i in range(X_val.shape[0]):   
    pred_list_i = [y_pred for y_pred in y_pred_array[i]] 
    val_list_i = [y_val for y_val in y_val_dummy[i]] 
    matching_preds = [pred.argmax(-1) == val.argmax(-1) for pred, val in zip(pred_list_i, val_list_i)] 
    correct_preds = int(np.all(matching_preds)) 

Но вы по-прежнему копирования много массивов никакой реальной цели. Следующий код должен делать то же самое, без бесполезного копирования.

correct_preds = 0.0 
for pred, val in zip(y_pred_array, y_val_dummy): 
    correct_preds += all(p.argmax(-1) == v.argmax(-1) 
         for p, v in zip(pred, val)) 
total_accuracy = correct_preds/x_val.shape[0] 

Это предполагает, что ваши критерии для правильного прогнозирования точны. Возможно, вы полностью избегаете явного цикла с помощью нескольких вызовов np.argmax, но вам придется работать самостоятельно.

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