File size: 6,538 Bytes
a34aae9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os
import gradio as gr
import pandas as pd
from NeuralNetwork.NeuralNetwork import My_NeuralNetwork 

class NeuralNetwork_UI():
    def __init__(self):
        self.nn = My_NeuralNetwork()


    def get_interface(self) -> gr.Blocks:
        with gr.Blocks() as interface:
            self.__get_network_parameters_ui()
            self.__get_inputs_ui()
        return interface
    
    def __get_network_parameters_ui(self):
        def get_model_info(num_layer, epochs, correlation_treshold, *neurons):
            self.nn.num_layer = num_layer
            self.nn.epochs = epochs
            self.nn.correlation_treshold = correlation_treshold
            dimension = []
            for i in range(self.nn.num_layer):
                dimension.append(neurons[i])
            self.nn.dimension = tuple(dimension)
            return f"""Dimension: {self.nn.dimension}, Correlation treshold: {self.nn.correlation_treshold}, Epochs: {self.nn.epochs}"""

        def train_model():
            self.nn.train_model()
            image_path = os.path.abspath(os.path.join('app', 'NeuralNetwork', 'graph.png'))
            return f"Here are the features that will be necessary for the inputs : {self.nn.numeric_columns}", f"<img src='{image_path}'>"

        with gr.Column() as network_parameters_ui:
            gr.Markdown("# Network Parameters")
            slider = gr.Slider(1, self.nn.MAX_LAYERS, value=self.nn.num_layer, step=1.0, label="Number of Hidden Layers")
            gr.Markdown("Number of Neurons per Layer:")
            with gr.Row():
                nums = [gr.Number(label=f"Layer {i+1}", value=32) for i in range(self.nn.MAX_LAYERS)]                
            correlation_treshold = gr.Number(label="Correlation treshold", value=self.nn.correlation_treshold, step=0.01, minimum=0.01, maximum=1.00)
            epochs = gr.Number(label="Epochs", value=self.nn.epochs, step=1, minimum=1, maximum=1000)

            with gr.Group():
                gr.Markdown("Model info : ")
                model_info = gr.Markdown(f"""Dimension: {self.nn.dimension}, Correlation treshold: {self.nn.correlation_treshold}, Epochs: {self.nn.epochs}""")

            train_btn = gr.Button("Train model")
            res = gr.Markdown("")
            img_res = gr.Markdown("")

            slider.release(get_model_info, inputs=[slider, epochs, correlation_treshold] + nums, outputs=model_info)
            correlation_treshold.change(get_model_info, inputs=[slider, epochs, correlation_treshold] + nums, outputs=model_info)
            epochs.change(get_model_info, inputs=[slider, epochs, correlation_treshold] + nums, outputs=model_info)
            for num in nums:
                num.change(get_model_info, inputs=[slider, epochs, correlation_treshold] + nums, outputs=model_info)

            train_btn.click(train_model, outputs=[res, img_res])

        return network_parameters_ui
    

    def __get_inputs_ui(self):
        def predict(age, gender, weight, height, max_bpm, avg_bpm, resting_bpm, session_duration, calories_burned, workout_type, fat_percentage, workout_frequency, experience_level, bmi):
            data = {
                'Age': [age],
                'Gender_Male': [1.0 if gender=="Male" else 0.0],
                'Gender_Female': [1.0 if gender=="Female" else 0.0],
                'Weight (kg)': [weight],
                'Height (m)': [height],
                'Max_BPM': [max_bpm],
                'Avg_BPM': [avg_bpm],
                'Resting_BPM': [resting_bpm],
                'Session_Duration (hours)': [session_duration],
                'Calories_Burned': [calories_burned],
                'Workout_Type_Strength': [1.0 if workout_type=="Strength" else 0.0],
                'Workout_Type_Yoga': [1.0 if workout_type=="Yoga" else 0.0],
                'Workout_Type_Cardio': [1.0 if workout_type=="Cardio" else 0.0],
                'Workout_Type_HIIT': [1.0 if workout_type=="HIIT" else 0.0],
                'Fat_Percentage': [fat_percentage],  
                # 'Water_Intake (liters)': [None], # Column that the model will try to predict
                'Workout_Frequency (days/week)': [workout_frequency],
                'Experience_Level': [experience_level],
                'BMI': [bmi]
            }

            new_input = pd.DataFrame(data)
            water_intake = self.nn.predict(new_input)
            return f"Predicted Water_Intake (liters) : {water_intake}"


        with gr.Column() as inputs_ui:
            gr.Markdown("# Inputs")
            with gr.Row():
                age = gr.Number(label="Age", minimum=1, maximum=100, step=1, value=38)
                gender = gr.Dropdown(["Male", "Female"], label="Gender", value="Male")
                weight = gr.Number(label="Weight (kg)", minimum=0.0, maximum=1000.0, step=0.1, value=74.0)
                height = gr.Number(label="Height (m)", minimum=0.00, maximum=3.00, step=0.01, value=1.72)
                max_bpm = gr.Number(label="Max_BPM", minimum=0, maximum=1000, step=1, value=180)
                avg_bpm = gr.Number(label="Avg_BPM", minimum=0, maximum=1000, step=1, value=144)
                resting_bpm = gr.Number(label="Resting_BPM", minimum=0, maximum=1000, step=1, value=62)
                session_duration = gr.Number(label="Session_Duration (hours)", minimum=0.00, maximum=24.00, step=0.01, value=1.25)
                calories_burned = gr.Number(label="Calories_Burned", minimum=0.0, maximum=2000.0, step=0.1, value=905.5)
                workout_type = gr.Dropdown(["Yoga", "HIIT", "Cardio", "Strength"], label="Workout_Type", value="Strength")
                fat_percentage = gr.Number(label="Fat_Percentage", minimum=0.0, maximum=50.0, step=0.1, value=25.0)
                workout_frequency = gr.Number(label="Workout_Frequency (days/week)", minimum=1, maximum=5, step=1, value=3)
                experience_level = gr.Number(label="Experience_Level", minimum=1, maximum=3, step=1, value=2)
                bmi = gr.Number(label="BMI", minimum=0.0, maximum=100.0, step=0.1, value=25.0)

            predict_btn = gr.Button("Predict")
            gr.Markdown("# Outputs")
            res = gr.Markdown("")


            predict_btn.click(predict, inputs=[age, gender, weight, height, max_bpm, avg_bpm, resting_bpm, session_duration, calories_burned, workout_type, fat_percentage, workout_frequency, experience_level, bmi], outputs=res)
        return inputs_ui