diff --git a/lab7/simple_regression_lab7.py b/lab7/simple_regression_lab7.py new file mode 100644 index 0000000..33c6e4f --- /dev/null +++ b/lab7/simple_regression_lab7.py @@ -0,0 +1,89 @@ +import tensorflow as tf +from keras import layers +from keras.models import save_model +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import sys +from sacred import Experiment +from sacred.observers import FileStorageObserver +from sacred.observers import MongoObserver + +# Stworzenie obiektu klasy Experiment do śledzenia przebiegu regresji narzędziem Sacred +ex = Experiment() + +# Dodanie obserwatora FileObserver +ex.observers.append(FileStorageObserver('runs')) + +#Dodanie obserwatora Mongo +ex.observers.append(MongoObserver(url='mongodb://mongo_user:mongo_password_IUM_2021@localhost:27017', db_name='sacred')) + +# Przykładowa modyfikowalna z Sacred konfiguracja wybranych parametrów treningu +@ex.config +def config(): + units = 1 + learning_rate = 0.1 + + +# Reszta kodu wrzucona do udekorowanej funkcji train do wywołania przez Sacred, żeby coś było capture'owane +@ex.capture +def train(units, learning_rate, _run): + # Pobranie przykładowego argumentu trenowania z poziomu Jenkinsa + EPOCHS_NUM = int(sys.argv[1]) + + # Wczytanie danych + data_train = pd.read_csv('lego_sets_clean_train.csv') + data_test = pd.read_csv('lego_sets_clean_test.csv') + + # Wydzielenie zbiorów dla predykcji ceny zestawu na podstawie liczby klocków, którą zawiera + train_piece_counts = np.array(data_train['piece_count']) + train_prices = np.array(data_train['list_price']) + test_piece_counts = np.array(data_test['piece_count']) + test_prices = np.array(data_test['list_price']) + + # Normalizacja + normalizer = layers.Normalization(input_shape=[1, ], axis=None) + normalizer.adapt(train_piece_counts) + + # Inicjalizacja + model = tf.keras.Sequential([ + normalizer, + layers.Dense(units=units) + ]) + + # Kompilacja + model.compile( + optimizer=tf.optimizers.Adam(learning_rate=learning_rate), + loss='mean_absolute_error' + ) + + # Trening + history = model.fit( + train_piece_counts, + train_prices, + epochs=EPOCHS_NUM, + verbose=0, + validation_split=0.2 + ) + + # Wykonanie predykcji na danych ze zbioru testującego + y_pred = model.predict(test_piece_counts) + + # Zapis predykcji do pliku + results = pd.DataFrame( + {'test_set_piece_count': test_piece_counts.tolist(), 'predicted_price': [round(a[0], 2) for a in y_pred.tolist()]}) + results.to_csv('lego_reg_results.csv', index=False, header=True) + + # Zapis modelu do pliku standardowo poprzez metodę kerasa i poprzez metodę obiektu Experiment z Sacred + model.save('lego_reg_model') + ex.add_artifact('lego_reg_model_art') + + # Przykładowo zwracamy coś w charakterze wyników, żeby było widoczne w plikach zapisanych przez obserwator + hist = pd.DataFrame(history.history) + hist['epoch'] = history.epoch + _run.info["train_results"] = str(hist.tail()) + return hist.tail() + +@ex.automain +def main(units, learning_rate): + print(train()) \ No newline at end of file