Spaces:
Runtime error
Runtime error
| # Copyright 2020 Erik Härkönen. All rights reserved. | |
| # This file is licensed to you under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. You may obtain a copy | |
| # of the License at http://www.apache.org/licenses/LICENSE-2.0 | |
| # Unless required by applicable law or agreed to in writing, software distributed under | |
| # the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS | |
| # OF ANY KIND, either express or implied. See the License for the specific language | |
| # governing permissions and limitations under the License. | |
| import torch, numpy as np | |
| from types import SimpleNamespace | |
| import itertools | |
| import sys | |
| from pathlib import Path | |
| sys.path.insert(0, str(Path(__file__).parent.parent)) | |
| from models import get_model | |
| from config import Config | |
| torch.backends.cudnn.benchmark = True | |
| has_gpu = torch.cuda.is_available() | |
| device = torch.device('cuda' if has_gpu else 'cpu') | |
| B = 2 # test batch support | |
| models = [ | |
| ('BigGAN-128', 'husky'), | |
| ('BigGAN-256', 'husky'), | |
| ('BigGAN-512', 'husky'), | |
| ('StyleGAN', 'ffhq'), | |
| ('StyleGAN2', 'ffhq'), | |
| ] | |
| for model_name, classname in models: | |
| with torch.no_grad(): | |
| model = get_model(model_name, classname, device).to(device) | |
| print(f'Testing {model_name}-{classname}', end='') | |
| n_latents = model.get_max_latents() | |
| assert n_latents > 1, 'Model reports max_latents=1' | |
| #if hasattr(model, 'use_w'): | |
| # model.use_w() | |
| seed = 1234 | |
| torch.manual_seed(seed) | |
| np.random.seed(seed) | |
| latents = [model.sample_latent(B, seed=seed) for _ in range(10)] | |
| # Test that partial-forward supports layerwise latent inputs | |
| try: | |
| layer_name, _ = list(model.named_modules())[-1] | |
| _ = model.partial_forward(n_latents*[latents[0]], layer_name) | |
| except Exception as e: | |
| print('Error:', e) | |
| raise RuntimeError(f"{model_name} partial forward doesn't support layerwise latent!") | |
| # Test that layerwise and single give same result | |
| for z in latents: | |
| torch.manual_seed(0) | |
| np.random.seed(0) | |
| out1 = model.forward(z) | |
| torch.manual_seed(0) | |
| np.random.seed(0) | |
| out2 = model.forward(n_latents*[z]) | |
| dist_rel = (torch.abs(out1 - out2).sum() / out1.sum()).item() | |
| assert dist_rel < 1e-3, f'Layerwise latent mode working incorrectly for model {model_name}-{classname}: difference = {dist_rel*100}%' | |
| print('.', end='') | |
| print('OK!') | |