@@ -364,8 +364,8 @@ namespace Tensorflow | |||
public Tensor divide<T>(Tensor x, T[] y, string name = null) where T : struct | |||
=> x / ops.convert_to_tensor(y, dtype: x.dtype.as_base_dtype(), name: "y"); | |||
public Tensor pow<T1, T2>(T1 x, T2 y) | |||
=> gen_math_ops.pow(x, y); | |||
public Tensor pow<T1, T2>(T1 x, T2 y, string name = "pow") | |||
=> gen_math_ops.pow(x, y, name: name); | |||
/// <summary> | |||
/// Divides `x / y` elementwise, rounding toward the most negative integer. | |||
@@ -33,10 +33,14 @@ namespace Tensorflow.Gradients | |||
var x = op.inputs[0]; | |||
var grad = grads[0]; | |||
return new Tensor[] { gen_ops.mul(grad, gen_math_ops.sign(x)) }; | |||
return new Tensor[] { grad * math_ops.sign(x) }; | |||
} | |||
[RegisterGradient("AddV2")] | |||
public static Tensor[] _AddV2Grad(Operation op, Tensor[] grads) | |||
=> _AddGrad(op, grads); | |||
[RegisterGradient("Add")] | |||
public static Tensor[] _AddGrad(Operation op, Tensor[] grads) | |||
{ | |||
var x = op.inputs[0]; | |||
@@ -65,10 +65,6 @@ namespace Tensorflow | |||
var base_types = new List<TF_DataType>(); | |||
var types = new List<TF_DataType>(); | |||
#if DEBUG | |||
if (op_type_name == "FusedBatchNormGradV3") | |||
; | |||
#endif | |||
// Perform input type inference | |||
foreach (var input_arg in op_def.InputArg) | |||
{ | |||
@@ -40,13 +40,11 @@ namespace Tensorflow | |||
} | |||
return num; | |||
} | |||
#if SERIALIZABLE | |||
[JsonIgnore] | |||
#endif | |||
public int NumInputs => c_api.TF_OperationNumInputs(_handle); | |||
private TF_DataType[] _input_types => _inputs_val._inputs.Select(x => x.dtype).ToArray(); | |||
private InputList _inputs_val; | |||
public InputList inputs | |||
{ | |||
get | |||
@@ -69,8 +67,10 @@ namespace Tensorflow | |||
} | |||
} | |||
public int NumControlInputs => c_api.TF_OperationNumControlInputs(_handle); | |||
public int NumControlInputs | |||
=> _handle == IntPtr.Zero ? 0 : c_api.TF_OperationNumControlInputs(_handle); | |||
Operation[] _control_inputs; | |||
/// <summary> | |||
/// The `Operation` objects on which this op has a control dependency. | |||
/// | |||
@@ -87,7 +87,9 @@ namespace Tensorflow | |||
{ | |||
get | |||
{ | |||
return GetControlInputs(); | |||
if (_control_inputs == null || _control_inputs.Length == 0) | |||
_control_inputs = GetControlInputs(); | |||
return _control_inputs; | |||
} | |||
} | |||
@@ -26,9 +26,6 @@ namespace Tensorflow | |||
{ | |||
public partial class Operation | |||
{ | |||
#if SERIALIZABLE | |||
[JsonIgnore] | |||
#endif | |||
public int NumOutputs => c_api.TF_OperationNumOutputs(_handle); | |||
public TF_DataType OutputType(int index) => c_api.TF_OperationOutputType(_tf_output(index)); | |||
@@ -154,11 +154,6 @@ namespace Tensorflow | |||
public Operation(NodeDef node_def, Graph g, Tensor[] inputs = null, TF_DataType[] output_types = null, ITensorOrOperation[] control_inputs = null, TF_DataType[] input_types = null, string original_op = "", OpDef op_def = null) | |||
{ | |||
_graph = g; | |||
#if DEBUG | |||
if (node_def.Name == "define_second_stage_train/gradients/define_loss/conv_lobj_branch/batch_normalization/cond/FusedBatchNormV3_1_grad/FusedBatchNormGradV3") | |||
; | |||
#endif | |||
// Build the list of control inputs. | |||
var control_input_ops = new List<Operation>(); | |||
if (control_inputs != null) | |||
@@ -140,6 +140,14 @@ namespace Tensorflow | |||
} | |||
public static Tensor add<Tx, Ty>(Tx x, Ty y, string name = null) | |||
{ | |||
// forward_compatible(2019, 6, 25): | |||
var _op = _op_def_lib._apply_op_helper("Add", name, args: new { x, y }); | |||
return _op.output; | |||
} | |||
public static Tensor add_v2<Tx, Ty>(Tx x, Ty y, string name = null) | |||
{ | |||
// forward_compatible(2019, 6, 25): | |||
var _op = _op_def_lib._apply_op_helper("AddV2", name, args: new { x, y }); | |||
@@ -213,7 +221,7 @@ namespace Tensorflow | |||
return op.outputs[0]; | |||
} | |||
public static Tensor sign(Tensor x, string name = "Sign") | |||
public static Tensor sign<T>(T x, string name = "Sign") | |||
{ | |||
var op = _op_def_lib._apply_op_helper("Sign", name: name, args: new {x}); | |||
@@ -448,7 +456,7 @@ namespace Tensorflow | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor cast(Tensor x, TF_DataType DstT, bool Truncate= false, string name= "") | |||
public static Tensor cast(Tensor x, TF_DataType DstT, bool Truncate= false, string name= null) | |||
{ | |||
var _op = _op_def_lib._apply_op_helper("Cast", name, args: new { x, DstT, Truncate }); | |||
@@ -35,14 +35,17 @@ namespace Tensorflow | |||
x = ops.convert_to_tensor(x, name: "x"); | |||
if (x.dtype.is_complex()) | |||
throw new NotImplementedException("math_ops.abs for dtype.is_complex"); | |||
//return gen_math_ops.complex_abs(x, Tout: x.dtype.real_dtype, name: name); | |||
//return gen_math_ops.complex_abs(x, Tout: x.dtype.real_dtype, name: name); | |||
return gen_math_ops._abs(x, name: name); | |||
}); | |||
} | |||
public static Tensor add<Tx, Ty>(Tx x, Ty y, string name = null) | |||
public static Tensor add<Tx, Ty>(Tx x, Ty y, string name = null) | |||
=> gen_math_ops.add(x, y, name); | |||
public static Tensor add_v2<Tx, Ty>(Tx x, Ty y, string name = null) | |||
=> gen_math_ops.add_v2(x, y, name); | |||
/// <summary> | |||
/// Adds all input tensors element-wise. | |||
/// </summary> | |||
@@ -53,21 +56,38 @@ namespace Tensorflow | |||
{ | |||
inputs = ops.convert_n_to_tensor_or_indexed_slices(inputs); | |||
if(inputs.Length == 1) | |||
if (inputs.Length == 1) | |||
{ | |||
var values = inputs[0]; | |||
if (name != null) | |||
return array_ops.identity(values, name: name); | |||
return values; | |||
} | |||
return gen_math_ops.add_n(inputs, name: name); | |||
} | |||
public static Tensor cast(RefVariable x, TF_DataType dtype = TF_DataType.DtInvalid, string name = null) | |||
{ | |||
var base_type = dtype.as_base_dtype(); | |||
if (base_type == x.dtype) | |||
return x; | |||
return tf_with(ops.name_scope(name, "Cast", new { x }), scope => | |||
{ | |||
name = scope; | |||
var t_x = ops.convert_to_tensor(x, name: "x"); | |||
if (t_x.dtype.as_base_dtype() != base_type) | |||
t_x = gen_math_ops.cast(t_x, base_type, name: name); | |||
return x; | |||
}); | |||
} | |||
public static Tensor cast(Tensor x, TF_DataType dtype = TF_DataType.DtInvalid, string name = null) | |||
{ | |||
var base_type = dtype.as_base_dtype(); | |||
if(base_type == x.dtype) | |||
if (base_type == x.dtype) | |||
return x; | |||
return tf_with(ops.name_scope(name, "Cast", new { x }), scope => | |||
@@ -98,13 +118,13 @@ namespace Tensorflow | |||
public static Tensor cumsum<T>(Tensor x, T axis = default, bool exclusive = false, bool reverse = false, string name = null) | |||
{ | |||
return tf_with(ops.name_scope(name, "Cumsum", new {x}), scope => | |||
{ | |||
name = scope; | |||
x = ops.convert_to_tensor(x, name: "x"); | |||
return tf_with(ops.name_scope(name, "Cumsum", new { x }), scope => | |||
{ | |||
name = scope; | |||
x = ops.convert_to_tensor(x, name: "x"); | |||
return gen_math_ops.cumsum(x, axis: axis, exclusive: exclusive, reverse: reverse, name: name); | |||
}); | |||
return gen_math_ops.cumsum(x, axis: axis, exclusive: exclusive, reverse: reverse, name: name); | |||
}); | |||
} | |||
/// <summary> | |||
@@ -221,7 +241,7 @@ namespace Tensorflow | |||
public static Tensor reduce_mean(Tensor[] input_tensors, int? axis = null, bool keepdims = false, string name = null) | |||
{ | |||
if(axis == null) | |||
if (axis == null) | |||
{ | |||
var r = _ReductionDims(input_tensors, axis); | |||
var m = gen_math_ops.mean(input_tensors, r, keepdims, name); | |||
@@ -263,14 +283,8 @@ namespace Tensorflow | |||
return gen_math_ops.sigmoid(x_tensor, name: name); | |||
} | |||
public static Tensor sign(Tensor x, string name = null) | |||
{ | |||
return tf_with(ops.name_scope(name, "Sign", new {x}), scope => | |||
{ | |||
x = ops.convert_to_tensor(x, name: "x"); | |||
return gen_math_ops.sign(x); | |||
}); | |||
} | |||
public static Tensor sign<T>(T x, string name = null) | |||
=> gen_math_ops.sign(x, name: name); | |||
/// <summary> | |||
/// Returns (x - y)(x - y) element-wise. | |||
@@ -328,7 +328,7 @@ namespace Tensorflow | |||
switch (name.ToLowerInvariant()) | |||
{ | |||
case "add": | |||
result = math_ops.add(x1, y1, name: scope); | |||
result = math_ops.add_v2(x1, y1, name: scope); | |||
break; | |||
case "div": | |||
result = math_ops.div(x1, y1, name: scope); | |||