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) ) )
上述代码是模型的自定义训练循环。
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方法进行训练。
但是当我在相同的火车数据集和具有相同参数的验证数据集上运行相同的代码时,尽管获得的损失完全相同,但在两种情况下,获得的验证损失却大不相同。
请使用以下代码在my github上运行 train.py 和 train2.py ,以复制结果:
bash import_weights.sh
python train.py --n_samples 1000 --b_size 50
for model.fit python train2.py --n_samples 1000 --b_size 50
用于自定义培训tenorflow github上也出现了类似的问题,但我不确定是否已解决。