lutzroeder/netron · error · Error
Unknown field
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.
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
AI-assisted analysis of lutzroeder/netron@d8a543f5f8 (2026-08-27).
Data as JSON: /api/errors/dcf74febcc680581.
Report an issue: GitHub.
Appendix: 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)