lutzroeder/netron · error · Error

Unknown field '${tag}'${this.location()}

Error message

Unknown field '${tag}'${this.location()}

What it means

Thrown when decoding a Caffe solver prototxt: the SolverParameter.decodeText reader hits a key that is not a recognized SolverParameter field. Unlike the NetParameter reader (which only accepts known fields for other message types), this handler rejects every unknown key outright with the parser location appended.

Source

Thrown at source/caffe.js:95

                        return value;
                    };
                }
                netParameter = caffe.proto.NetParameter.decodeText(reader);
            } catch (error) {
                const message = error && error.message ? error.message : error.toString();
                throw new caffe.Error(`File text format is not caffe.NetParameter (${message.replace(/\.$/, '')}).`);
            }
            return openModel(context, netParameter);
        };
        switch (context.type) {
            case 'caffe.pbtxt.solver': {
                const reader = await context.read('protobuf.text');
                reader.field = function(tag, message) {
                    if (message instanceof caffe.proto.SolverParameter) {
                        message[tag] = this.read();
                        return;
                    }
                    throw new Error(`Unknown field '${tag}'${this.location()}`);
                };
                const solver = caffe.proto.SolverParameter.decodeText(reader);
                if (solver.net_param) {
                    return openModel(context, solver.net_param);
                }
                let name = solver.net || solver.train_net;
                name = name.split('/').pop();
                try {
                    const content = await context.fetch(name);
                    return await openNetParameterText(context, name, content);
                } catch (error) {
                    const message = error.message ? error.message : error.toString();
                    throw new caffe.Error(`Failed to load '${name}' (${message.replace(/\.$/, '')}).`);
                }
            }
            case 'caffe.pbtxt': {
                return await openNetParameterText(context, context.identifier, context);
            }

View on GitHub (pinned to d8a543f5f8)

Solutions

  1. Confirm the file is actually a solver definition, not a network train_val prototxt
  2. Check the flagged line for fields your Caffe schema version doesn't define and remove/rename them
  3. Regenerate the solver prototxt using the caffe version whose schema matches the library's bundled caffe.proto
  4. Prepend '#'-comments to strip experimental fields before loading

Example fix

# before
net: "train_val.prototxt"
layer_wise_reduce: true   # unknown to older schema

# after
net: "train_val.prototxt"
# layer_wise_reduce: true
Defensive patterns

Strategy: try-catch

Validate before calling

// Distinguish solver vs net prototxt before loading
const isSolver = /^\s*net\s*:/m.test(text) || /^\s*base_lr\s*:/m.test(text);
if (!isSolver) throw new Error('Not a solver.prototxt');

Try / catch

try {
  await caffe.open(solverFile);
} catch (e) {
  if (/Unknown field/.test(e.message)) {
    // report offending line from location() and suggest removing the field
  } else throw e;
}

Prevention

When it happens

Trigger: Loading a solver.prototxt via the Caffe open() path where the text contains fields outside the SolverParameter schema — e.g. snapshot_diff, layer_wise_reduce, or custom fork extensions; also typos and indentation errors that make a value look like a key.

Common situations: Solver files written by newer Caffe versions or forks (e.g. NVCaffe extra flags), hand-edited solvers, or accidentally pointing the loader at a train_val prototxt (a NetParameter, not a SolverParameter).

Related errors


AI-assisted analysis of lutzroeder/netron@d8a543f5f8 (2026-08-27). Data as JSON: /api/errors/dcf74febcc680581. Report an issue: GitHub.