118 lines
3.6 KiB
Python
118 lines
3.6 KiB
Python
import tensorflow as tf
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
|
|
from keras.models import Sequential
|
|
from keras.layers import Dense, Dropout
|
|
from keras import regularizers
|
|
import numpy as np
|
|
import pandas as pd
|
|
from datetime import datetime
|
|
from importlib.metadata import version
|
|
|
|
from sacred import Experiment
|
|
from sacred.observers import FileStorageObserver
|
|
|
|
ex = Experiment("464903", interactive=True)
|
|
ex.observers.append(FileStorageObserver('my_runs'))
|
|
|
|
@ex.config
|
|
def my_config():
|
|
num_epochs = 200
|
|
dropout_layer_value = 0.3
|
|
|
|
@ex.capture
|
|
def prepare_info(num_epochs, dropout_layer_value, _run):
|
|
_run.info["num_epochs"] = num_epochs
|
|
_run.info["dropout_layer_value"] = dropout_layer_value
|
|
_run.info["training_ts"] = datetime.now()
|
|
|
|
@ex.main
|
|
def train_and_evaluate(num_epochs, dropout_layer_value, _run):
|
|
prepare_info()
|
|
|
|
ex.open_resource('./lettuce_dataset_updated.csv', "r")
|
|
|
|
dataset = pd.read_csv('./lettuce_dataset_updated.csv', encoding="ISO-8859-1")
|
|
|
|
print(version('tensorflow'))
|
|
print(version('scikit-learn'))
|
|
print(version('keras'))
|
|
print(version('pandas'))
|
|
|
|
ph_level = dataset['pH Level'].values.tolist()
|
|
temp_F = dataset['Temperature (F)'].values.tolist()
|
|
humid = dataset['Humidity'].values.tolist()
|
|
days = dataset['Growth Days'].values.tolist()
|
|
plant_id = dataset['Plant_ID'].values.tolist()
|
|
|
|
X = []
|
|
Y = []
|
|
|
|
id = plant_id[0]
|
|
temp_sum = 0
|
|
humid_sum = 0
|
|
ph_level_sum = 0
|
|
day = 1
|
|
|
|
for i in range(0, len(plant_id)):
|
|
if plant_id[i] == id:
|
|
temp_sum += temp_F[i]
|
|
humid_sum += humid[i]
|
|
ph_level_sum += ph_level[i]
|
|
day = days[i]
|
|
else:
|
|
temp = []
|
|
temp.append(temp_sum/day)
|
|
temp.append(humid_sum/day)
|
|
temp.append(ph_level_sum/day)
|
|
X.append(temp)
|
|
Y.append(day)
|
|
temp_sum = 0
|
|
humid_sum = 0
|
|
ph_level_sum = 0
|
|
day = 1
|
|
id = plant_id[i]
|
|
|
|
scaler = MinMaxScaler()
|
|
X = scaler.fit_transform(X)
|
|
|
|
X = np.array(X)
|
|
Y = np.array(Y)
|
|
|
|
encoder = OneHotEncoder(sparse=False)
|
|
y_onehot = encoder.fit_transform(Y.reshape(-1,1))
|
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.4, random_state=42)
|
|
|
|
model = Sequential([
|
|
Dense(8, activation='relu', input_dim=3, kernel_regularizer=regularizers.l2(0.04)),
|
|
Dropout(dropout_layer_value),
|
|
Dense(8, activation='relu', kernel_regularizer=regularizers.l2(0.04)),
|
|
Dropout(dropout_layer_value),
|
|
Dense(4, activation='softmax', kernel_regularizer=regularizers.l2(0.04)),
|
|
])
|
|
|
|
model.compile(optimizer='sgd',
|
|
loss='categorical_crossentropy',
|
|
metrics=['accuracy'])
|
|
|
|
history = model.fit(X_train, y_train, epochs=num_epochs, validation_data=(X_test, y_test), verbose=2)
|
|
|
|
test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=2)
|
|
|
|
print(history.history['val_accuracy'])
|
|
|
|
_run.log_scalar("train loss", history.history['loss'])
|
|
_run.log_scalar("train accuracy", history.history['accuracy'])
|
|
_run.log_scalar("test loss", test_loss)
|
|
_run.log_scalar("test accuracy", test_accuracy)
|
|
|
|
print(f"Dokładność testowa: {test_accuracy:.2%}")
|
|
|
|
model.evaluate(X_test, y_test)[1]
|
|
|
|
model.save('./model.keras')
|
|
ex.add_artifact("./model.keras")
|
|
|
|
ex.run()
|
|
print(my_config()) |