def __init__(self, config: dict) -> None: logger.debug("Initializing %s", self.__class__.__name__) self._config = config self._loss_dict = dict(gmsd=losses.GMSDLoss(), l_inf_norm=losses.LInfNorm(), laploss=losses.LaplacianPyramidLoss(), logcosh=k_losses.logcosh, ms_ssim=losses.MSSIMLoss(), mae=k_losses.mean_absolute_error, mse=k_losses.mean_squared_error, pixel_gradient_diff=losses.GradientLoss(), ssim=losses.DSSIMObjective(), smooth_loss=losses.GeneralizedLoss(),) self._mask_channels = self._get_mask_channels() self._inputs: List[keras.layers.Layer] = [] self._names: List[str] = [] self._funcs: Dict[str, Callable] = {} logger.debug("Initialized: %s", self.__class__.__name__)
from keras import backend as K from keras import losses as k_losses from keras.layers import Conv2D from keras.models import Sequential from keras.optimizers import Adam from lib.model import losses from lib.utils import get_backend _PARAMS = [ (losses.GeneralizedLoss(), (2, 16, 16)), (losses.GradientLoss(), (2, 16, 16)), # TODO Make sure these output dimensions are correct (losses.GMSDLoss(), (2, 1, 1)), # TODO Make sure these output dimensions are correct (losses.LInfNorm(), (2, 1, 1)) ] _IDS = ["GeneralizedLoss", "GradientLoss", "GMSDLoss", "LInfNorm"] _IDS = ["{}[{}]".format(loss, get_backend().upper()) for loss in _IDS] @pytest.mark.parametrize(["loss_func", "output_shape"], _PARAMS, ids=_IDS) def test_loss_output(loss_func, output_shape): """ Basic shape tests for loss functions. """ if get_backend() == "amd" and isinstance(loss_func, losses.GMSDLoss): pytest.skip("GMSD Loss is not currently compatible with PlaidML") y_a = K.variable(np.random.random((2, 16, 16, 3))) y_b = K.variable(np.random.random((2, 16, 16, 3))) objective_output = loss_func(y_a, y_b) if get_backend() == "amd": assert K.eval(objective_output).shape == output_shape
from lib.model import losses from lib.utils import get_backend if get_backend() == "amd": from keras import backend as K, losses as k_losses else: # Ignore linting errors from Tensorflow's thoroughly broken import system from tensorflow.keras import backend as K, losses as k_losses # pylint:disable=import-error _PARAMS = [(losses.GeneralizedLoss(), (2, 16, 16)), (losses.GradientLoss(), (2, 16, 16)), # TODO Make sure these output dimensions are correct (losses.GMSDLoss(), (2, 1, 1)), # TODO Make sure these output dimensions are correct (losses.LInfNorm(), (2, 1, 1))] _IDS = ["GeneralizedLoss", "GradientLoss", "GMSDLoss", "LInfNorm"] _IDS = [f"{loss}[{get_backend().upper()}]" for loss in _IDS] @pytest.mark.parametrize(["loss_func", "output_shape"], _PARAMS, ids=_IDS) def test_loss_output(loss_func, output_shape): """ Basic shape tests for loss functions. """ if get_backend() == "amd" and isinstance(loss_func, losses.GMSDLoss): pytest.skip("GMSD Loss is not currently compatible with PlaidML") y_a = K.variable(np.random.random((2, 16, 16, 3))) y_b = K.variable(np.random.random((2, 16, 16, 3))) objective_output = loss_func(y_a, y_b) if get_backend() == "amd": assert K.eval(objective_output).shape == output_shape else: