Source code for utilities.dnn_settings
"""
Class to set and store some important characteristics of a Keras DNN
"""
import warnings
warnings.formatwarning = lambda msg, *args, **kwargs: f'\n{msg}\n'
[docs]class DnnSettings:
"""
Class to set and store some important characteristics of a Keras DNN.
:param layers: List or tuple of integers, that indicate the number of neurons in each internal dense layer.
:type layers: list[int] or tuple[int]
:param val_fraction: Fraction of the training dataset used for validation.
:type val_fraction: float
:param epochnum: Number of epochs for the training.
:type epochnum: float
:param learning_rate: Value given as learning rate to the Adam optimizer.
:type learning_rate: float
:param batch_size: Size of the batches used in the training.
:type batch_size: int
:param dropout: Drop probability in the AlphaDropout layer.
:type dropout: float
:param verbose: Set how verbose the training is on shell.
:type verbose: int
"""
[docs] def __init__(self, layers=(75, 60, 45, 30, 20), val_fraction=0.5,
epochnum=200, learning_rate=0.001, batch_size=128,
dropout=0, verbose=2):
"""
Constructor method
"""
self._layers = layers
self._val_fraction = val_fraction
self._epochnum = epochnum
self._learning_rate = learning_rate
self._batch_size = batch_size
self._dropout = dropout
self._verbose = verbose
@property
def layers(self):
return self._layers
@property
def val_fraction(self):
return self._val_fraction
@property
def epochnum(self):
return self._epochnum
@property
def learning_rate(self):
return self._learning_rate
@property
def batch_size(self):
return self._batch_size
@property
def dropout(self):
return self._dropout
@property
def verbose(self):
return self._verbose
@layers.setter
def layers(self, neurons_list):
if type(neurons_list) is not list and type(neurons_list) is not tuple:
msg = f'***WARNING*** \nLayers {neurons_list} given is NOT a list/tuple! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif len(neurons_list)==0:
msg = f'***WARNING*** \nLayers {neurons_list} given has length 0! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._layers = neurons_list
@val_fraction.setter
def val_fraction(self, frac):
if type(frac) is not float:
msg = f'***WARNING*** \nFraction {frac} given is NOT a float! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif frac<=0 or frac>=1:
msg = f'***WARNING*** \nFraction {frac} given is NOT inside (0,1)! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._val_fraction = frac
@epochnum.setter
def epochnum(self, epochs):
if type(epochs) is not int:
msg = f'***WARNING*** \nEpochs {epochs} given is NOT an integer! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif epochs<=0:
msg = f'***WARNING*** \nEpochs {epochs} given is NOT a positive integer! No change will be made to \
it...\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._epochnum = epochs
@learning_rate.setter
def learning_rate(self, lr):
if type(lr) is not float:
msg = f'***WARNING*** \nLearning Rate {lr} given is NOT a float! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif lr<=0:
msg = f'***WARNING*** \nLearning Rate {lr} given is NOT positive! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._learning_rate = lr
@batch_size.setter
def batch_size(self, batch):
if type(batch) is not int:
msg = f'***WARNING*** \nBatch Size {batch} given is NOT an integer! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif batch<=0:
msg = f'***WARNING*** \nBatch Size {batch} given is NOT a positive integer! No change will be made \
to it...\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._batch_size = batch
@dropout.setter
def dropout(self, dr):
if type(dr) is not float:
msg = f'***WARNING*** \nDropout Rate {dr} given is NOT a float! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
elif dr<=0:
msg = f'***WARNING*** \nDropout Rate {dr} given is NOT positive! No change will be made to it...\
\n*************\n'
warnings.warn(msg, stacklevel=2)
else:
self._dropout = dr
@verbose.setter
def verbose(self, verb):
if verb in [0, 1, 2]:
self._verbose = verb
else:
msg = f'***WARNING*** \nVerbosity {verb} given is NOT valid! Accepted values are {0,1,2}. No change \
will be made to it...\n*************\n'
warnings.warn(msg, stacklevel=2)