Модель работает по-разному для model.fit и пользовательского цикла обучения - PullRequest
0 голосов
/ 01 августа 2020
model=model()
optimizer=tf.keras.optimizers.Adam()
batch_size=opt.b_size
n_batches = int(len(train_set) / opt.b_size)

for i in range(opt.epochs):
    loss_t=0
    loss_vt=0
    it=0
    for j in range(n_batches):
        with tf.GradientTape() as tape:
            tape.watch(model.trainable_variables)
            curr=train_set[it:it+batch_size]
            forward=model(curr,True)
            loss=tf.keras.losses.MeanAbsoluteError()(y_train[it:it+batch_size],forward)
            loss_t += loss

        grads=tape.gradient(loss,model.trainable_variables)
        optimizer.apply_gradients(zip(grads,model.trainable_variables))
        it+=batch_size

    # shuffling the test set
    index = np.arange(0, len(test_set))
    np.random.shuffle(index)
    test_set = test_set[index]
    y_test = y_test[index]
    loss_t=loss_t.numpy()
    
    # computing validation loss
    forward_v = model(test_set[:batch_size], False)
    loss_v = tf.keras.losses.MeanAbsoluteError()(y_test[:batch_size], forward_v)
    loss_v=loss_v.numpy()
    loss_t /= n_batches
    print("Loss: {} Validation loss: {} ".format( round(loss_t,4) , round(loss_v,4) ) )

Вышеупомянутый код является пользовательским обучением l oop модели.

model=model()
model.compile(tf.keras.optimizers.Adam(),tf.keras.losses.MeanAbsoluteError(),metrics=['accuracy'])
model.fit(train_set,y_train,batch_size=opt.b_size,epochs=opt.epochs,validation_data=(test_set,y_test))

В приведенном выше коде для обучения используется метод model.fit.

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

Пожалуйста, запустите train.py и train2.py на моем github с использованием следующего кода для репликации результатов:

  1. bash import_weights.sh
  2. python train.py --n_samples 1000 --b_size 50 для model.fit
  3. python train2.py --n_samples 1000 --b_size 50 для пользовательского обучения

Здесь также поднималась одна похожая проблема на tenorflow github , но Я не уверен, решена ли она.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...