模型对model.fit和自定义训练循环的执行方式有所不同

时间:2020-08-01 07:34:34

标签: python tensorflow machine-learning keras deep-learning

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 ,以复制结果:

  1. bash import_weights.sh
  2. python train.py --n_samples 1000 --b_size 50 for model.fit
  3. python train2.py --n_samples 1000 --b_size 50用于自定义培训

tenorflow github上也出现了类似的问题,但我不确定是否已解决。

0 个答案:

没有答案