tf.compat.v1.train.Optimizer

Base class for optimizers.

Migrate to TF2

tf.compat.v1.train.Optimizer can be used in eager mode and tf.function, but it is not recommended. Please use the subclasses of tf.keras.optimizers.Optimizer instead in TF2. Please see Basic training loops or Writing a training loop from scratch for examples.

If your TF1 code contains a tf.compat.v1.train.Optimizer symbol, you cannot simply replace that with the corresponding tf.keras.optimizers.Optimizers. To migrate to TF2, it is advised the whole training program to be migrated to Keras Model.fit based, or TF2 custom training loops.

Structural Mapping to Native TF2

Before:

sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
opt_op.run(session=session)

After:

sgd = tf.keras.optimizers.SGD(3.0)
sgd.minimize(cost_fn, [var0, var1])

How to Map Arguments

TF1 Arg Name TF2 Arg Name Note
use_locking Not supported -
name name. -

Before & After Usage Example

Before:

g = tf.compat.v1.Graph()
with g.as_default():
  var0 = tf.compat.v1.Variable([1.0, 2.0])
  var1 = tf.compat.v1.Variable([3.0, 4.0])
  cost = 5 * var0 + 3 * var1
  global_step = tf.compat.v1.Variable(
      tf.compat.v1.zeros([], tf.compat.v1.int64), name='global_step')
  init_op = tf.compat.v1.initialize_all_variables()
  sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
  opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
session = tf.compat.v1.Session(graph=g)
session.run(init_op)
opt_op.run(session=session)
print(session.run(var0))
[-14. -13.]

After:

>>> var0 = tf.Variable([1.0, 2.0])
>>> var1 = tf.Variable([3.0, 4.0])
>>> cost_fn = lambda: 5 * var0 + 3 * var1
>>> sgd = tf.keras.optimizers.SGD(3.0)
>>> sgd.minimize(cost_fn, [var0, var1])
>>> print(var0.numpy())
[-14. -13.]