Search code examples
pythonmachine-learningdeep-learning

fit function stops after epoch 1


I have implemented this function to fit the model

def fit_model(model, X_train_sequence_tensor,Y_train_sequence_tensor, epochs, val_set, time_windows, scaler):
    
    X_column_list = [item for item in val_set.columns.to_list() if item not in ['date', 'user', 'rank','rank_group', 'counts', 'target']]
    X_val_set = val_set[X_column_list].round(2)
                    
    X_val_set[X_val_set.columns] = scaler.transform(X_val_set[X_val_set.columns] )
    X_val_sequence = get_feature_array(X_val_set , X_column_list, time_windows)
    X_val_sequence_tensor = tf.convert_to_tensor(X_val_sequence, dtype=tf.float32)
    
    Y_column_list = ['target']                
    Y_val_set = val_set[Y_column_list].round(2)
    Y_val_sequence = get_feature_array(Y_val_set , Y_column_list, time_windows)
    Y_val_sequence_tensor = tf.convert_to_tensor(Y_val_sequence, dtype=tf.float32)

                    
    history = model.fit(X_train_sequence_tensor,Y_train_sequence_tensor, epochs, 
                        validation_data=(X_val_sequence_tensor, Y_val_sequence_tensor))
    return model, history

but when I call it as

fitted_model, history = fit_model(model, X_train_sequence_tensor,Y_train_sequence_tensor, 
                    epochs=100, val_set=val_set, time_windows=90, scaler=scaler)

it stops after the first epoch. It does not run for all the 100 as required.

I tried to call it outside of the function call and it worked.

`# Step 3.2 : Fit the model + We pass some validation for
                                                # monitoring validation loss and metrics
                                                # at the end of each epoch
                    X_val_set = val_set[X_column_list].round(2)
                    
                    #X_val_set.values = scaler.transform(X_val_set.values)
                    
                    X_val_set[X_val_set.columns] = scaler.transform(X_val_set[X_val_set.columns] )
                    X_val_sequence = get_feature_array(X_val_set , X_column_list, 90)
                    X_val_sequence_tensor = tf.convert_to_tensor(X_val_sequence, dtype=tf.float32)
                    
                    Y_val_set = val_set[Y_column_list].round(2)
                    Y_val_sequence = get_feature_array(Y_val_set , Y_column_list, 90)
                    Y_val_sequence_tensor = tf.convert_to_tensor(Y_val_sequence, dtype=tf.float32)

                    
                    training_history = cnn1d_bilstm_model.fit(X_train_sequence_tensor,Y_train_sequence_tensor, epochs=200, 
                                                            # We pass some validation for
                                                            # monitoring validation loss and metrics
                                                            # at the end of each epoch
                                                            validation_data=(X_val_sequence_tensor, Y_val_sequence_tensor))

What am I doing wrong?


Solution

  • If epochs is not explicitly passed, Python may use a default value, which could be None or another unintended value. Explicitly passing epochs=epochs ensures that the function uses the value intended by the caller.

    Here is updated code:

    def fit_model(model, X_train_sequence_tensor,Y_train_sequence_tensor, epochs, val_set, time_windows, scaler):
        
        X_column_list = [item for item in val_set.columns.to_list() if item not in ['date', 'user', 'rank','rank_group', 'counts', 'target']]
        X_val_set = val_set[X_column_list].round(2)
                        
        X_val_set[X_val_set.columns] = scaler.transform(X_val_set[X_val_set.columns] )
        X_val_sequence = get_feature_array(X_val_set , X_column_list, time_windows)
        X_val_sequence_tensor = tf.convert_to_tensor(X_val_sequence, dtype=tf.float32)
        
        Y_column_list = ['target']                
        Y_val_set = val_set[Y_column_list].round(2)
        Y_val_sequence = get_feature_array(Y_val_set , Y_column_list, time_windows)
        Y_val_sequence_tensor = tf.convert_to_tensor(Y_val_sequence, dtype=tf.float32)
        try:
            history = model.fit(X_train_sequence_tensor,
                                Y_train_sequence_tensor,
                                epochs=epochs, 
                                validation_data=(X_val_sequence_tensor, Y_val_sequence_tensor))
        except Exception as e:
            print(f"Training stopped due to an error: {e}")
                        
        
        return model, history
    
    
    fitted_model, history = fit_model(model, X_train_sequence_tensor,Y_train_sequence_tensor,  epochs=100, val_set=val_set, time_windows=90, scaler=scaler) 
    # Print Training History
    print("Training Completed Successfully!")