Download code/studiogan/src/utils/style_misc.py from JerMa88/rtm-latent-refinement-cifar10-unknownparams: direct link, hf CLI and curl.
- Browser
- Download file 4.09 kB
-
https://huggingface.co/JerMa88/rtm-latent-refinement-cifar10-unknownparams/resolve/main/code/studiogan/src/utils/style_misc.py
- Command line
-
hf download hf://JerMa88/rtm-latent-refinement-cifar10-unknownparams/code/studiogan/src/utils/style_misc.py
-
curl -L -o style_misc.py https://huggingface.co/JerMa88/rtm-latent-refinement-cifar10-unknownparams/resolve/main/code/studiogan/src/utils/style_misc.py
4.09 kB
| """ | |
| this code is borrowed from https://github.com/NVlabs/stylegan2-ada-pytorch with few modifications | |
| Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. | |
| NVIDIA CORPORATION and its licensors retain all intellectual property | |
| and proprietary rights in and to this software, related documentation | |
| and any modifications thereto. Any use, reproduction, disclosure or | |
| distribution of this software and related documentation without an express | |
| license agreement from NVIDIA CORPORATION is strictly prohibited. | |
| """ | |
| import warnings | |
| import torch | |
| import numpy as np | |
| #---------------------------------------------------------------------------- | |
| # Cached construction of constant tensors. Avoids CPU=>GPU copy when the | |
| # same constant is used multiple times. | |
| _constant_cache = dict() | |
| def constant(value, shape=None, dtype=None, device=None, memory_format=None): | |
| value = np.asarray(value) | |
| if shape is not None: | |
| shape = tuple(shape) | |
| if dtype is None: | |
| dtype = torch.get_default_dtype() | |
| if device is None: | |
| device = torch.device("cpu") | |
| if memory_format is None: | |
| memory_format = torch.contiguous_format | |
| key = (value.shape, value.dtype, value.tobytes(), shape, dtype, device, memory_format) | |
| tensor = _constant_cache.get(key, None) | |
| if tensor is None: | |
| tensor = torch.as_tensor(value.copy(), dtype=dtype, device=device) | |
| if shape is not None: | |
| tensor, _ = torch.broadcast_tensors(tensor, torch.empty(shape)) | |
| tensor = tensor.contiguous(memory_format=memory_format) | |
| _constant_cache[key] = tensor | |
| return tensor | |
| #---------------------------------------------------------------------------- | |
| # Replace NaN/Inf with specified numerical values. | |
| try: | |
| nan_to_num = torch.nan_to_num # 1.8.0a0 | |
| except AttributeError: | |
| def nan_to_num(input, nan=0.0, posinf=None, neginf=None, *, out=None): # pylint: disable=redefined-builtin | |
| assert isinstance(input, torch.Tensor) | |
| if posinf is None: | |
| posinf = torch.finfo(input.dtype).max | |
| if neginf is None: | |
| neginf = torch.finfo(input.dtype).min | |
| assert nan == 0 | |
| return torch.clamp(input.unsqueeze(0).nansum(0), min=neginf, max=posinf, out=out) | |
| #---------------------------------------------------------------------------- | |
| # Symbolic assert. | |
| try: | |
| symbolic_assert = torch._assert # 1.8.0a0 # pylint: disable=protected-access | |
| except AttributeError: | |
| symbolic_assert = torch.Assert # 1.7.0 | |
| #---------------------------------------------------------------------------- | |
| # Context manager to suppress known warnings in torch.jit.trace(). | |
| class suppress_tracer_warnings(warnings.catch_warnings): | |
| def __enter__(self): | |
| super().__enter__() | |
| warnings.simplefilter("ignore", category=torch.jit.TracerWarning) | |
| return self | |
| #---------------------------------------------------------------------------- | |
| # Assert that the shape of a tensor matches the given list of integers. | |
| # None indicates that the size of a dimension is allowed to vary. | |
| # Performs symbolic assertion when used in torch.jit.trace(). | |
| def assert_shape(tensor, ref_shape): | |
| if tensor.ndim != len(ref_shape): | |
| raise AssertionError(f"Wrong number of dimensions: got {tensor.ndim}, expected {len(ref_shape)}") | |
| for idx, (size, ref_size) in enumerate(zip(tensor.shape, ref_shape)): | |
| if ref_size is None: | |
| pass | |
| elif isinstance(ref_size, torch.Tensor): | |
| with suppress_tracer_warnings(): # as_tensor results are registered as constants | |
| symbolic_assert(torch.equal(torch.as_tensor(size), ref_size), f"Wrong size for dimension {idx}") | |
| elif isinstance(size, torch.Tensor): | |
| with suppress_tracer_warnings(): # as_tensor results are registered as constants | |
| symbolic_assert(torch.equal(size, torch.as_tensor(ref_size)), f"Wrong size for dimension {idx}: expected {ref_size}") | |
| elif size != ref_size: | |
| raise AssertionError(f"Wrong size for dimension {idx}: got {size}, expected {ref_size}") | |