get_variable does not work after session restoration
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
In TensorFlow 1 style code, restoring a checkpoint and calling get_variable are separate concerns. Restoring loads values into variables that already exist in the graph; it does not magically recreate missing variables or reset variable-scope rules. Most "it stopped working after restore" bugs come from mixing those two steps.
What get_variable Actually Does
tf.compat.v1.get_variable is a graph-construction API. Its job is to create a variable once inside a scope and return the same variable again when reuse is enabled. It is not a checkpoint loader.
That distinction matters because TensorFlow 1 has two phases:
- build the graph
- run the graph in a session
Checkpoint restoration happens in the second phase. If the graph does not already contain a variable with the right name and shape, Saver.restore has nothing to assign into.
When you restore later, you must build the same variable again before calling restore.
The Correct Restore Flow
The restore flow is:
- rebuild the graph structure
- create variables with matching names
- create the saver
- restore checkpoint values
Notice what is missing: there is no second call to get_variable after restoration to "fetch" something from the checkpoint. The variable is already part of the graph. restore only fills in its value.
Why It Fails After Session Restoration
Several different bugs get described as "get_variable does not work."
Recreating the Variable with the Wrong Scope
If you saved model/weight and later build other_model/weight, TensorFlow treats them as different variables.
That graph does not match the checkpoint names, so restore will fail or skip the variable depending on how the saver is configured.
Trying to Create Instead of Reuse
Inside the same scope, a second get_variable call without reuse often raises an error because TensorFlow thinks you are attempting to create a duplicate variable.
If you want the existing variable from the graph, enable reuse or keep a direct Python reference to it. Restoring the session does not change that rule.
Expecting Restore to Initialize New Variables
If you add a new variable after the checkpoint was created, restore will not assign a value for it. You must initialize that new variable separately or create a saver that restores only the matching subset.
How to Debug Name and Scope Problems
When checkpoint restore behaves strangely, inspect variable names directly. In TensorFlow 1, names are the contract between the graph and the checkpoint.
You can also inspect checkpoint contents:
If the graph contains model/weight:0 and the checkpoint contains model/weight, you are aligned. If the prefixes differ, restoration problems are expected.
A Practical Rule
Think of get_variable as defining storage locations in the graph and Saver.restore as pouring saved values into those locations. If the locations do not exist, or the names do not line up, restoration cannot succeed.
In newer TensorFlow 2 code, object-based checkpoints and Keras layers reduce some of this manual scope management. But when you are working with sessions, variable scopes, and tf.compat.v1, naming discipline is still the central rule.
Common Pitfalls
- Calling
restorebefore the variables are created in the graph. Build the graph first, then restore. - Changing variable-scope names between save and restore. The checkpoint keys must match the graph variable names.
- Calling
get_variabletwice in the same scope without reuse. Usereuse=Trueor keep the original variable reference. - Adding new variables and assuming the old checkpoint initializes them. Run an initializer for newly introduced variables.
- Mixing TensorFlow 1 session code with TensorFlow 2 expectations. If you use
tf.compat.v1, follow the graph-and-session model consistently.
Summary
- '
get_variablecreates or reuses graph variables; it does not load checkpoint data by itself.' - '
Saver.restoreonly assigns values into variables that already exist in the graph.' - Matching variable names and scopes are required for successful restoration.
- New variables added after checkpoint creation still need initialization.
- Debug restore issues by comparing
global_variables()output with checkpoint variable names.

