| @@ -237,6 +237,27 @@ namespace Tensorflow.Gradients | |||||
| return new Tensor[] { null, array_ops.concat(list(grads), op.inputs[0]) }; | return new Tensor[] { null, array_ops.concat(list(grads), op.inputs[0]) }; | ||||
| } | } | ||||
| [RegisterGradient("Slice")] | |||||
| public static Tensor[] _SliceGrad(Operation op, Tensor[] grads) | |||||
| { | |||||
| var grad = grads[0]; | |||||
| var input_vec = op.inputs[0]; | |||||
| var begin_vec = op.inputs[1]; | |||||
| var input_rank = array_ops.rank(input_vec); | |||||
| var slice_size = array_ops.shape(op.outputs[0]); | |||||
| var shape = array_ops.stack(new Tensor[] { input_rank, new Tensor(1) }); | |||||
| var before_pad = array_ops.reshape(begin_vec, shape); | |||||
| var after_pad = array_ops.reshape(array_ops.shape(input_vec) - slice_size - begin_vec, shape); | |||||
| var paddings = array_ops.concat(new Tensor[] { before_pad, after_pad }, 1); | |||||
| return new Tensor[] | |||||
| { | |||||
| array_ops.pad(grad, paddings), | |||||
| null, | |||||
| null | |||||
| }; | |||||
| } | |||||
| [RegisterGradient("Squeeze")] | [RegisterGradient("Squeeze")] | ||||
| public static Tensor[] _SqueezeGrad(Operation op, Tensor[] grads) | public static Tensor[] _SqueezeGrad(Operation op, Tensor[] grads) | ||||
| { | { | ||||