Как исправить мой код, который используется на этапе проверки? - PullRequest
0 голосов
/ 31 января 2019

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

Я пытался каждый раз использовать одну выборку для подачи в сеть и получил одинаковую точность в наборе вали.Но когда я каждый раз использую партию сэмплов, скажем, 256, акваурин не равен.

процесс обучения

count = 1 
while 1:

    #get training_data
    if (count - 1) % 5200 == 0:
        train_set,train_label = get_traindata(eng, 70)

    tset,tlabel = train_set,train_label
    tset_num = tset.shape[0]

    #split and train
    num_batches = tset_num // batch_size
    order = np.random.choice(tset_num, num_batches * batch_size,replace = False)
    train_data_subset = tset[order,:]
    train_labels_subset = tlabel[order]

    for step in range(num_batches):

        offset = step * validation_size
        feed_dict = {
                    x: train_data_subset[offset:offset+batch_size,:],
                    y: train_labels_subset[offset:offset+batch_size],
                    }
        _, tloss, tacc,gd = sess.run([train_op,loss, accuracy,grad_norm], 
                                     feed_dict=feed_dict)
        if (count-1) % 200 == 0:


            #get validationset
            if (count-1) % 1400 == 0:
                vset,vlabel = get_validata(eng, 20)
                vnum_batches = vset.shape[0] // validation_size
                order = np.random.choice(vset.shape[0], vnum_batches * validation_size,replace = False)  #shuffled
                va_data_subset = vset[order,:]
                va_labels_subset = vlabel[order]

            loss_list = []
            error_list = []
            loss_list_s = []
            error_list_s = []
            for stepv in range(vnum_batches):
               offsetv = stepv * validation_size
               feed_dict_shuffle = {
                    x: va_data_subset[offsetv:offsetv+validation_size,:],
                    y: va_labels_subset[offsetv:offsetv+validation_size],
                    }
               vloss_s, vacc_s = sess.run([loss, accuracy], feed_dict=feed_dict_shuffle)
               loss_list_s.append(vloss_s)
               error_list_s.append(vacc_s)
               feed_dict = {
                    x: vset[offsetv:offsetv+validation_size,:],
                    y: vlabel[offsetv:offsetv+validation_size],
                    }
               vloss, vacc = sess.run([loss, accuracy], feed_dict=feed_dict)
               loss_list.append(vloss)
               error_list.append(vacc)
            #the performance in the shuffled vali-set
            vloss_s = np.mean(loss_list_s)
            vacc_s = np.mean(error_list_s)
            #the performance in the unshuffled vali-set
            vloss = np.mean(loss_list)
            vacc = np.mean(error_list)

Теоретически порядок набора значений не влияетрезультат.

1 Ответ

0 голосов
/ 31 января 2019

Я предполагаю, что вы используете отбрасывание или пакетную нормализацию.В любом случае вам нужно передать переменную tenorflow bool параметру обучения во время вывода.Поскольку порядок, похоже, влияет на результаты, я собираюсь предположить, что пакетная нормализация:
https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization.
feed feed = False с заполнителем тензорного потока

...