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
- Confirm the file is actually a solver definition, not a network train_val prototxt
- Check the flagged line for fields your Caffe schema version doesn't define and remove/rename them
- Regenerate the solver prototxt using the caffe version whose schema matches the library's bundled caffe.proto
- 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
- Don't point the loader at train_val prototxts when a solver is expected
- Keep solver files minimal and version-matched to the schema
- Diff solver files against a known-good template
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
- Unknown field '${tag}' ${this.location()}
- Unknown field '${tag}' ${this.location()}
- Unknown field '${tag}' ${this.location()}
AI-assisted analysis of lutzroeder/netron@d8a543f5f8 (2026-08-27).
Data as JSON: /api/errors/dcf74febcc680581.
Report an issue: GitHub.