@@ -122,7 +122,7 @@ public static Tensor zeros(TensorShape shape, TF_DataType dtype = TF_DataType.TF
122122 case TF_DataType . TF_FLOAT :
123123 return _constant_if_small ( 0.0F , shape , dtype , name ) ;
124124 case TF_DataType . TF_INT64 :
125- return _constant_if_small ( 0l , shape , dtype , name ) ;
125+ return _constant_if_small ( 0L , shape , dtype , name ) ;
126126 case TF_DataType . TF_INT32 :
127127 return _constant_if_small ( 0 , shape , dtype , name ) ;
128128 case TF_DataType . TF_INT8 :
@@ -671,6 +671,68 @@ public static Tensor strided_slice(Tensor input_, Tensor begin, Tensor end,
671671 return op ;
672672 }
673673
674+ /// <summary>
675+ /// Returns the gradient of `StridedSlice`.
676+ ///
677+ /// Since `StridedSlice` cuts out pieces of its `input` which is size
678+ /// `shape`, its gradient will have the same shape (which is passed here
679+ /// as `shape`). The gradient will be zero in any element that the slice
680+ /// does not select.
681+ /// </summary>
682+ /// <param name="shape">Must be one of the following types: `int32`, `int64`.</param>
683+ /// <param name="begin">Must have the same type as `shape`.</param>
684+ /// <param name="end">Must have the same type as `shape`.</param>
685+ /// <param name="strides">Must have the same type as `shape`.</param>
686+ /// <param name="dy">A `Tensor`.</param>
687+ /// <param name="begin_mask">An optional `int`. Defaults to `0`.</param>
688+ /// <param name="end_mask">An optional `int`. Defaults to `0`.</param>
689+ /// <param name="ellipsis_mask">An optional `int`. Defaults to `0`.</param>
690+ /// <param name="new_axis_mask">An optional `int`. Defaults to `0`.</param>
691+ /// <param name="shrink_axis_mask">An optional `int`. Defaults to `0`.</param>
692+ /// <param name="name">A name for the operation (optional).</param>
693+ /// <returns>A `Tensor`. Has the same type as `dy`.</returns>
694+ public static Tensor strided_slice_grad ( Tensor shape , Tensor begin , Tensor end , Tensor strides , Tensor dy ,
695+ long begin_mask = 0 , long end_mask = 0 , long ellipsis_mask = 0 , long new_axis_mask = 0 ,
696+ long shrink_axis_mask = 0 , string name = null )
697+ => tf . Context . RunInAutoMode2 (
698+ ( ) => tf . OpDefLib . _apply_op_helper ( "StridedSliceGrad" , name , new
699+ {
700+ shape ,
701+ begin ,
702+ end ,
703+ strides ,
704+ dy ,
705+ begin_mask ,
706+ end_mask ,
707+ ellipsis_mask ,
708+ new_axis_mask ,
709+ shrink_axis_mask
710+ } ) . output ,
711+ ( ) => tf . Runner . TFE_FastPathExecute ( tf . Context , tf . Context . DeviceName ,
712+ "StridedSliceGrad" , name ,
713+ null ,
714+ shape , begin , end , strides , dy ,
715+ "begin_mask" , begin_mask ,
716+ "end_mask" , end_mask ,
717+ "ellipsis_mask" , ellipsis_mask ,
718+ "new_axis_mask" , new_axis_mask ,
719+ "shrink_axis_mask" , shrink_axis_mask ) . FirstOrDefault ( ) ,
720+ ( op ) =>
721+ {
722+ var attrs = new object [ ]
723+ {
724+ "T" , op . get_attr < TF_DataType > ( "T" ) ,
725+ "Index" , op . get_attr < TF_DataType > ( "Index" ) ,
726+ "begin_mask" , op . get_attr < long > ( "begin_mask" ) ,
727+ "end_mask" , op . get_attr < long > ( "end_mask" ) ,
728+ "ellipsis_mask" , op . get_attr < long > ( "ellipsis_mask" ) ,
729+ "new_axis_mask" , op . get_attr < long > ( "new_axis_mask" ) ,
730+ "shrink_axis_mask" , op . get_attr < long > ( "shrink_axis_mask" )
731+ } ;
732+ tf . Runner . RecordGradient ( "StridedSliceGrad" , op . inputs , attrs , op . outputs ) ;
733+ } ,
734+ new Tensors ( shape , begin , end , strides , dy ) ) ;
735+
674736 /// <summary>
675737 /// Removes dimensions of size 1 from the shape of a tensor.
676738 /// Given a tensor `input`, this operation returns a tensor of the same type with
0 commit comments