XingangPan/DragGAN · error · ValueError

TensorFlow pickle version too low

Error message

TensorFlow pickle version too low

What it means

Raised inside legacy.convert_tf_generator's kwarg-collection when the TF generator's static_kwargs contains keys not in the hardcoded known set (resolution, fmap_base, num_fp16_res, ... , style_mixing_prob, structure, conditioning, fused_modconv). It exists to fail fast rather than silently dropping weights during TF->PyTorch conversion; the offending kwarg name is included in the exception args.

Source

Thrown at legacy.py:109

            match = re.fullmatch(pattern, name)
            if match:
                found = True
                if value_fn is not None:
                    value = value_fn(*match.groups())
                break
        try:
            assert found
            if value is not None:
                tensor.copy_(torch.from_numpy(np.array(value)))
        except:
            print(name, list(tensor.shape))
            raise

#----------------------------------------------------------------------------

def convert_tf_generator(tf_G):
    if tf_G.version < 4:
        raise ValueError('TensorFlow pickle version too low')

    # Collect kwargs.
    tf_kwargs = tf_G.static_kwargs
    known_kwargs = set()
    def kwarg(tf_name, default=None, none=None):
        known_kwargs.add(tf_name)
        val = tf_kwargs.get(tf_name, default)
        return val if val is not None else none

    # Convert kwargs.
    from training import networks_stylegan2
    network_class = networks_stylegan2.Generator
    kwargs = dnnlib.EasyDict(
        z_dim               = kwarg('latent_size',          512),
        c_dim               = kwarg('label_size',           0),
        w_dim               = kwarg('dlatent_size',         512),
        img_resolution      = kwarg('resolution',           1024),
        img_channels        = kwarg('num_channels',         3),

View on GitHub (pinned to 336f120ce1)

Solutions

  1. Inspect tf_G.static_kwargs to see the unknown key, then add it via the kwarg() helper in legacy.py convert_tf_generator with an appropriate default/mapping
  2. If the kwarg only affects training (like style_mixing_prob), register it and ignore its value
  3. Use the matching converter from the fork the pickle came from
  4. Skip conversion and use an officially provided PyTorch .pkl

Example fix

# before
G = legacy.load_network_pickle('my-fork-generator.pkl')
# ValueError: ('Unknown TensorFlow kwarg', 'my_custom_kwarg')

# after — edit legacy.py convert_tf_generator:
kwarg('my_custom_kwarg', default=0.0)  # map or ignore the new kwarg
G = legacy.load_network_pickle('my-fork-generator.pkl')
Defensive patterns

Strategy: validation

Validate before calling

unknown = set(tf_G.static_kwargs) - expected_kwargs
if unknown:
    print('unmapped kwargs:', unknown)  # extend legacy.py before converting

Type guard

def is_known_generator_kwargs(tf_G, known: set) -> bool:
    return set(tf_G.static_kwargs).issubset(known)

Try / catch

try:
    G = legacy.convert_tf_generator(tf_G)
except ValueError as e:
    if 'Unknown TensorFlow kwarg' in str(e):
        # e.args[1] holds the offending kwarg name; register it in legacy.py
        ...
    raise

Prevention

When it happens

Trigger: Calling legacy.load_network_pickle / convert_tf_generator on a TensorFlow pickle from a fork or newer TF variant (e.g. StyleGAN2-ADA TF, SWAE/swagan variants, conditional variants like 'label_size' handled elsewhere) that added custom kwargs unknown to this converter.

Common situations: Converting pickles from NVIDIA's stylegan2-ada (TF) repo whose kwargs differ; community forks that added custom layer options; also triggered by known-but-unmapped kwargs on very old conversions (e.g. nonlineary 'leakyrelu' variations are fine but unknown structure types are not).

Related errors


AI-assisted analysis of XingangPan/DragGAN@336f120ce1 (2026-08-27). Data as JSON: /api/errors/c25da3e2e40f899c. Report an issue: GitHub.