11using NumSharp ;
22using System ;
33using System . Collections . Generic ;
4+ using System . Linq ;
45using System . Text ;
6+ using Tensorflow . Gradients ;
7+ using Tensorflow . Keras . Optimizers ;
58using static Tensorflow . Binding ;
69
710namespace Tensorflow . Keras . Engine
@@ -11,7 +14,8 @@ public partial class Model
1114 Tensor step_function ( OwnedIterator iterator )
1215 {
1316 var data = iterator . next ( ) ;
14- train_step ( data [ 0 ] , data [ 1 ] ) ;
17+ var outputs = train_step ( data [ 0 ] , data [ 1 ] ) ;
18+ tf_with ( ops . control_dependencies ( new object [ 0 ] ) , ctl => _train_counter . assign_add ( 1 ) ) ;
1519 throw new NotImplementedException ( "" ) ;
1620 }
1721
@@ -20,11 +24,33 @@ Tensor step_function(OwnedIterator iterator)
2024 /// </summary>
2125 /// <param name="data"></param>
2226 /// <returns></returns>
23- Tensor train_step ( Tensor x , Tensor y )
27+ IEnumerable < ( string , Tensor ) > train_step ( Tensor x , Tensor y )
2428 {
29+ ( x , y ) = data_handler . DataAdapter . Expand1d ( x , y ) ;
2530 using var tape = tf . GradientTape ( ) ;
2631 var y_pred = Apply ( x , is_training : true ) ;
27- throw new NotImplementedException ( "" ) ;
32+ var loss = compiled_loss . Call ( y , y_pred ) ;
33+
34+ // For custom training steps, users can just write:
35+ // trainable_variables = self.trainable_variables
36+ // gradients = tape.gradient(loss, trainable_variables)
37+ // self.optimizer.apply_gradients(zip(gradients, trainable_variables))
38+ // The _minimize call does a few extra steps unnecessary in most cases,
39+ // such as loss scaling and gradient clipping.
40+ _minimize ( tape , optimizer , loss , trainable_variables ) ;
41+
42+ compiled_metrics . update_state ( y , y_pred ) ;
43+ return new [ ] { ( "loss" , loss ) } ;
44+ }
45+
46+ void _minimize ( GradientTape tape , OptimizerV2 optimizer , Tensor loss , List < IVariableV1 > trainable_variables )
47+ {
48+ var gradients = tape . gradient ( loss , trainable_variables ) ;
49+ gradients = optimizer . _aggregate_gradients ( zip ( gradients , trainable_variables ) ) ;
50+ gradients = optimizer . _clip_gradients ( gradients ) ;
51+
52+ optimizer . apply_gradients ( zip ( gradients , trainable_variables . Select ( x => x as ResourceVariable ) ) ,
53+ experimental_aggregate_gradients : false ) ;
2854 }
2955 }
3056}
0 commit comments