Source code for conmo.algorithms.multilayer_perceptron

import pandas as pd
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential

from conmo.conf import Label, RandomSeed
from conmo.algorithms.algorithm import PretrainedAlgorithm


[docs]class PretrainedMultilayerPerceptron(PretrainedAlgorithm):
[docs] def __init__(self, pretrained: bool, input_len: int, random_seed: int = None, path: str = None) -> None: super().__init__(pretrained, path) self.input_len = input_len if not self.pretrained: if random_seed != None: self.random_seed = random_seed else: self.random_seed = RandomSeed.RANDOM_SEED
[docs] def fit_predict(self, data_train: pd.DataFrame, data_test: pd.DataFrame, labels_train: pd.DataFrame, labels_test: pd.DataFrame) -> pd.DataFrame: self.model = None if not self.pretrained: # Set TensorFlow random seed tf.random.set_seed(self.random_seed) # Create new Multilayer Perceptron self.model = self.build_mlp(self) # Compile model self.model.compile(loss='mse', optimizer='adam', metrics=['mse']) # Train model with only train data self.model.fit(data_train.to_numpy(), labels_train.to_numpy( ), epochs=100, batch_size=32, validation_split=0.2, verbose=1) else: # If there is a pretrained model saved the is no reason to train # Load weights from disk self.load_weights() # Predict over test set pred = self.model.predict(data_test.to_numpy()) # Generate output dataframe return pd.DataFrame(pred, index=labels_test.index, columns=Label.BATTERIES_DEG_TYPES)
[docs] def load_weights(self) -> None: self.model = tf.keras.models.load_model(self.path, compile=False)
[docs] def build_mlp(self) -> Sequential: """ Auxiliary method for building the multilayer percetron. Returns ------- model: tf.keras.Model Keras model built. """ model = Sequential() model.add(Dense(64, input_dim=self.input_len, activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dense(3, activation='sigmoid')) return model