Skip to content

Commit a44028e

Browse files
AsakusaRinneOceania2018
authored andcommitted
Fix ConvTraspose2D gradient and register rsqrt gradient.
1 parent a7c9a75 commit a44028e

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

src/TensorFlowNET.Core/Gradients/Tape.ComputeGradient.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public Tensor[] ComputeGradient(Tensor[] target_tensor_ids,
9090

9191
in_gradients = trace.backward_function(out_gradients.ToArray(), unneeded_gradients.ToArray());
9292

93-
if (in_gradients.Count() != trace.input_tensor_id.Count())
93+
if (in_gradients.Length != trace.input_tensor_id.Length && in_gradients.Length + unneeded_gradients.Count != trace.input_tensor_id.Length)
9494
throw new RuntimeError($"Recorded operation '{trace.op_type}' returned too few gradients. Expected {trace.input_tensor_id.Length} but received {in_gradients.Count()}");
9595
if (!_persistent)
9696
{
@@ -103,9 +103,11 @@ public Tensor[] ComputeGradient(Tensor[] target_tensor_ids,
103103
in_gradients = new Tensor[trace.input_tensor_id.Length];
104104
}
105105

106-
for (int i = 0; i < in_gradients.Length; ++i)
106+
bool skip_unneeded_id = trace.input_tensor_id.Length > in_gradients.Length;
107+
for (int i = 0, k = 0; i < in_gradients.Length && k < trace.input_tensor_id.Count(); ++i, ++k)
107108
{
108-
var id = trace.input_tensor_id[i];
109+
if (skip_unneeded_id && unneeded_gradients.Contains(k)) ++k;
110+
var id = trace.input_tensor_id[k];
109111
if (in_gradients[i] != null)
110112
{
111113
var unaggregated_grads = gradients[id];

src/TensorFlowNET.Core/Gradients/math_grad.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,20 @@ public static Tensor[] _SqrtGrad(Operation op, Tensor[] grads)
639639
});
640640
}
641641

642+
[RegisterGradient("Rsqrt")]
643+
public static Tensor[] _RsqrtGrad(Operation op, Tensor[] grads)
644+
{
645+
var grad = grads[0];
646+
var y = op.outputs[0];
647+
648+
return tf_with(ops.control_dependencies(grads), delegate
649+
{
650+
y = math_ops.conj(y);
651+
var factor = constant_op.constant(-0.5f, dtype: y.dtype);
652+
return new Tensor[] { grad * (factor * math_ops.square(y) * y) };
653+
});
654+
}
655+
642656
[RegisterGradient("Asin")]
643657
public static Tensor[] _ASinGrad(Operation op, Tensor[] grads)
644658
{

src/TensorFlowNET.Core/Keras/Layers/ILayersApi.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ public ILayer Conv2D(int filters,
5555
IRegularizer bias_regularizer = null,
5656
IRegularizer activity_regularizer = null);
5757

58+
public ILayer Conv2DTranspose(int filters,
59+
Shape kernel_size = null,
60+
Shape strides = null,
61+
string output_padding = "valid",
62+
string data_format = null,
63+
Shape dilation_rate = null,
64+
string activation = null,
65+
bool use_bias = true,
66+
string kernel_initializer = null,
67+
string bias_initializer = null,
68+
string kernel_regularizer = null,
69+
string bias_regularizer = null,
70+
string activity_regularizer = null);
71+
5872
public ILayer Conv2D(int filters,
5973
Shape kernel_size = null,
6074
Shape strides = null,

0 commit comments

Comments
 (0)