2323import tensorforce .core .optimizers
2424
2525
26- class Optimizer (tf . train . GradientDescentOptimizer ):
26+ class Optimizer (object ):
2727 """
2828 Generic TensorFlow optimizer which minimizes a not yet further specified expression, usually
2929 some kind of loss function. More generally, an optimizer can be considered as some method of
@@ -34,10 +34,6 @@ def __init__(self):
3434 """
3535 Creates a new optimizer instance.
3636 """
37- super (Optimizer , self ).__init__ (self ._learning_rate , use_locking = False , name = 'TensorForceOptimizer' )
38-
39- self ._learning_rate = - 1.0
40-
4137 self .variables = dict ()
4238
4339 def custom_getter (getter , name , registered = False , ** kwargs ):
@@ -109,100 +105,17 @@ def from_spec(spec, kwargs=None):
109105 assert isinstance (optimizer , Optimizer )
110106 return optimizer
111107
112- # modified minimize
113- def apply_step (
114- self ,
115- variables ,
116- deltas ,
117- global_step = None ,
118- gate_gradients = None ,
119- aggregation_method = None ,
120- colocate_gradients_with_ops = False ,
121- name = None ,
122- grad_loss = None
123- ):
124-
125- deltas_and_vars = self .compute_deltas (
126- deltas = deltas ,
127- var_list = variables ,
128- gate_gradients = gate_gradients ,
129- aggregation_method = aggregation_method ,
130- colocate_gradients_with_ops = colocate_gradients_with_ops ,
131- grad_loss = grad_loss
132- )
133-
134- vars_with_delta = [v for g , v in deltas_and_vars if g is not None ]
135- if not vars_with_delta :
136- raise TensorForceError (
137- "No gradients provided for any variable, check your graph for ops that do not "
138- "support gradients, between variables {} and loss {}" .format (
139- [str (v ) for _ , v in deltas_and_vars ], deltas
140- )
141- )
142-
143- return super (Optimizer , self ).apply_gradients (deltas_and_vars , global_step = global_step , name = name )
144-
145- def compute_gradients (self , * args , ** kwargs ):
146- raise NotImplementedError
147-
148- def apply_gradients (self , * args , ** kwargs ):
149- raise NotImplementedError
150-
151- # Modified compute_gradients
152- def compute_deltas (
153- self ,
154- deltas ,
155- var_list = None ,
156- gate_gradients = None ,
157- aggregation_method = None ,
158- colocate_gradients_with_ops = False ,
159- grad_loss = None
160- ):
161- if aggregation_method is not None or colocate_gradients_with_ops or grad_loss is not None :
162- raise TensorForceError ("'aggregation_method', colocate_gradients_with_ops' and 'grad_loss' arguments are not supported." )
163- if gate_gradients is None :
164- gate_gradients = Optimizer .GATE_OP
165- if gate_gradients not in (Optimizer .GATE_NONE , Optimizer .GATE_OP , Optimizer .GATE_GRAPH ):
166- raise TensorForceError ("'gate_gradients' must be one of: Optimizer.GATE_NONE, Optimizer.GATE_OP, Optimizer.GATE_GRAPH. Not {}" .format (gate_gradients ))
167- # if isinstance(loss, tf.Tensor):
168- # self._assert_valid_dtypes([loss])
169- # else:
170- # self._assert_valid_dtypes(loss)
171- # if var_list is None:
172- # var_list = tf.trainable_variables() + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)
173- # else:
174- # var_list = tf.python.util.nest.flatten(var_list)
175- var_list += tf .get_collection (tf .GraphKeys ._STREAMING_MODEL_PORTS )
176- if not var_list :
177- raise TensorForceError ("No variables to optimize." )
178- # processors = [tf.train.Optimizer._get_processor(v) for v in var_list]
179- # var_refs = [p.target() for p in processors]
180- # grads = gradients.gradients(loss, var_refs, grad_ys=grad_loss, gate_gradients=(gate_gradients == Optimizer.GATE_OP), aggregation_method=aggregation_method, colocate_gradients_with_ops=colocate_gradients_with_ops)
181-
182- if gate_gradients == Optimizer .GATE_GRAPH :
183- deltas = tf .tuple (deltas )
184- deltas_and_vars = list (zip (deltas , var_list ))
185- self ._assert_valid_dtypes ([v for g , v in deltas_and_vars if g is not None and v .dtype != tf .resource ])
186- return deltas_and_vars
187-
188- # Below, we just pass through tf optimizers
189- def _prepare (self ):
190- return tf .train .GradientDescentOptimizer ._prepare (self = self )
191-
192- def _apply_dense (self , grad , var ):
193- return tf .train .GradientDescentOptimizer ._apply_dense (self = self , grad = grad , var = var )
194-
195- def _apply_sparse_duplicate_indices (self , grad , var ):
196- return tf .train .GradientDescentOptimizer ._apply_sparse_duplicate_indices (
197- self = self , grad = grad , var = var
198- )
108+ def apply_step (self , variables , deltas ):
109+ """
110+ Applies step deltas to variable values.
199111
200- def _resource_apply_dense (self , grad , handle ):
201- return tf .train .GradientDescentOptimizer ._resource_apply_dense (
202- self = self , grad = grad , handle = handle
203- )
112+ Args:
113+ variables: List of variables.
114+ deltas: List of deltas of same length.
204115
205- def _resource_apply_sparse_duplicate_indices (self , grad , handle , indices ):
206- return tf .train .GradientDescentOptimizer ._resource_apply_sparse_duplicate_indices (
207- self = self , grad = grad , handle = handle
208- )
116+ Returns:
117+ The step-applied operation.
118+ """
119+ if len (variables ) != len (deltas ):
120+ raise TensorForceError ("Invalid variables and deltas lists." )
121+ return tf .group (* (variable .assign_add (delta = delta ) for variable , delta in zip (variables , deltas )))
0 commit comments