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 с использованием следующего кода для репликации результатов:
bash import_weights.sh
python train.py --n_samples 1000 --b_size 50
для model.fit python train2.py --n_samples 1000 --b_size 50
для пользовательского обучения
Здесь также поднималась одна похожая проблема на tenorflow github , но Я не уверен, решена ли она.