| @@ -97,6 +97,50 @@ namespace Tensorflow.Gradients | |||
| }; | |||
| } | |||
| /// <summary> | |||
| /// Gradient function for Conv2D. | |||
| /// </summary> | |||
| /// <param name="op"></param> | |||
| /// <param name="grads"></param> | |||
| /// <returns></returns> | |||
| [RegisterGradient("Conv2D")] | |||
| public static Tensor[] _Conv2DGrad(Operation op, Tensor[] grads) | |||
| { | |||
| var dilations = op.get_attr("dilations"); | |||
| var strides = op.get_attr("strides"); | |||
| var padding = op.get_attr("padding"); | |||
| var explicit_paddings = op.get_attr("explicit_paddings"); | |||
| var use_cudnn_on_gpu = op.get_attr("use_cudnn_on_gpu"); | |||
| var data_format = op.get_attr("data_format"); | |||
| var shape = gen_array_ops.shape_n(new Tensor[] { op.inputs[0], op.inputs[1] }); | |||
| return new Tensor[] | |||
| { | |||
| gen_nn_ops.conv2d_backprop_input(new Conv2dParams | |||
| { | |||
| InputSizes = shape[0], | |||
| Filter = op.inputs[1], | |||
| Dilations = dilations == null ? null : dilations as int[], | |||
| Strides = strides == null ? null : strides as int[], | |||
| Padding = padding.ToString(), | |||
| ExplicitPaddings = explicit_paddings == null ? null : explicit_paddings as int[], | |||
| UseCudnnOnGpu = (bool)use_cudnn_on_gpu, | |||
| DataFormat = data_format.ToString() | |||
| }), | |||
| gen_nn_ops.conv2d_backprop_filter(new Conv2dParams | |||
| { | |||
| Input = op.inputs[0], | |||
| FilterSizes = shape[1], | |||
| Dilations = dilations == null ? null : dilations as int[], | |||
| Strides = strides == null ? null : strides as int[], | |||
| Padding = padding.ToString(), | |||
| ExplicitPaddings = explicit_paddings == null ? null : explicit_paddings as int[], | |||
| UseCudnnOnGpu = (bool)use_cudnn_on_gpu, | |||
| DataFormat = data_format.ToString() | |||
| }) | |||
| }; | |||
| } | |||
| private static bool IsZero(Tensor g) | |||
| { | |||
| if (new string[] { "ZerosLike", "Zeros" }.Contains(g.op.type)) | |||
| @@ -22,11 +22,27 @@ namespace Tensorflow.Operations | |||
| /// </summary> | |||
| public Tensor Input { get; set; } | |||
| /// <summary> | |||
| /// An integer vector representing the shape of `input` | |||
| /// </summary> | |||
| public Tensor InputSizes { get; set; } | |||
| /// <summary> | |||
| /// A 4-D tensor of shape | |||
| /// </summary> | |||
| public Tensor Filter { get; set; } | |||
| /// <summary> | |||
| /// An integer vector representing the tensor shape of `filter` | |||
| /// </summary> | |||
| public Tensor FilterSizes { get; set; } | |||
| /// <summary> | |||
| /// A `Tensor`. Must have the same type as `filter`. | |||
| /// 4-D with shape `[batch, out_height, out_width, out_channels]`. | |||
| /// </summary> | |||
| public Tensor OutBackProp { get; set; } | |||
| /// <summary> | |||
| /// The stride of the sliding window for each | |||
| /// dimension of `input`. The dimension order is determined by the value of | |||
| @@ -43,6 +43,52 @@ namespace Tensorflow.Operations | |||
| }); | |||
| return _op.outputs[0]; | |||
| } | |||
| /// <summary> | |||
| /// Computes the gradients of convolution with respect to the filter. | |||
| /// </summary> | |||
| /// <param name="parameters"></param> | |||
| /// <returns></returns> | |||
| public static Tensor conv2d_backprop_filter(Conv2dParams parameters) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Conv2DBackpropFilter", name: parameters.Name, args: new | |||
| { | |||
| input = parameters.Input, | |||
| filter_sizes = parameters.FilterSizes, | |||
| out_backprop = parameters.OutBackProp, | |||
| strides = parameters.Strides, | |||
| padding = parameters.Padding, | |||
| use_cudnn_on_gpu = parameters.UseCudnnOnGpu, | |||
| explicit_paddings = parameters.ExplicitPaddings, | |||
| data_format = parameters.DataFormat, | |||
| dilations = parameters.Dilations | |||
| }); | |||
| return _op.outputs[0]; | |||
| } | |||
| /// <summary> | |||
| /// Computes the gradients of convolution with respect to the input. | |||
| /// </summary> | |||
| /// <param name="parameters"></param> | |||
| /// <returns></returns> | |||
| public static Tensor conv2d_backprop_input(Conv2dParams parameters) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Conv2DBackpropInput", name: parameters.Name, args: new | |||
| { | |||
| input_sizes = parameters.InputSizes, | |||
| filter = parameters.Filter, | |||
| out_backprop = parameters.OutBackProp, | |||
| strides = parameters.Strides, | |||
| padding = parameters.Padding, | |||
| use_cudnn_on_gpu = parameters.UseCudnnOnGpu, | |||
| explicit_paddings = parameters.ExplicitPaddings, | |||
| data_format = parameters.DataFormat, | |||
| dilations = parameters.Dilations | |||
| }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor bias_add(Tensor value, | |||
| @@ -252,6 +252,19 @@ namespace Tensorflow | |||
| return _op.outputs[0]; | |||
| } | |||
| /// <summary> | |||
| /// Returns shape of tensors. | |||
| /// </summary> | |||
| /// <param name="input"></param> | |||
| /// <param name="out_type"></param> | |||
| /// <param name="name"></param> | |||
| /// <returns></returns> | |||
| public static Tensor[] shape_n(Tensor[] input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ShapeN", name, new { input, out_type }); | |||
| return _op.outputs; | |||
| } | |||
| public static Tensor size(Tensor input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Size", name, new { input, out_type }); | |||
| @@ -20,8 +20,9 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||
| <AssemblyVersion>0.8.1.0</AssemblyVersion> | |||
| <PackageReleaseNotes>Changes since v0.8: | |||
| 1. Removed global static graph instance. | |||
| 2. Provide custom gradient function.</PackageReleaseNotes> | |||
| 1. Remove global static graph instance. | |||
| 2. Provide custom gradient function. | |||
| 3. Add gradient function for Conv2D.</PackageReleaseNotes> | |||
| <LangVersion>7.2</LangVersion> | |||
| <FileVersion>0.8.1.0</FileVersion> | |||
| </PropertyGroup> | |||