| @@ -31,7 +31,7 @@ namespace Tensorflow | |||||
| public Optimizer AdamOptimizer(float learning_rate, string name = "Adam") | public Optimizer AdamOptimizer(float learning_rate, string name = "Adam") | ||||
| => new AdamOptimizer(learning_rate, name: name); | => new AdamOptimizer(learning_rate, name: name); | ||||
| public object ExponentialMovingAverage(float decay) | |||||
| public ExponentialMovingAverage ExponentialMovingAverage(float decay) | |||||
| => new ExponentialMovingAverage(decay); | => new ExponentialMovingAverage(decay); | ||||
| public Saver Saver(VariableV1[] var_list = null) => new Saver(var_list: var_list); | public Saver Saver(VariableV1[] var_list = null) => new Saver(var_list: var_list); | ||||
| @@ -40,12 +40,20 @@ namespace Tensorflow.Operations.Initializers | |||||
| public Tensor call(TensorShape shape, TF_DataType dtype = TF_DataType.DtInvalid) | public Tensor call(TensorShape shape, TF_DataType dtype = TF_DataType.DtInvalid) | ||||
| { | { | ||||
| throw new NotImplementedException(); | |||||
| if (dtype == TF_DataType.DtInvalid) | |||||
| dtype = this.dtype; | |||||
| return random_ops.random_normal(shape, mean, stddev, dtype, seed: seed); | |||||
| } | } | ||||
| public object get_config() | public object get_config() | ||||
| { | { | ||||
| throw new NotImplementedException(); | |||||
| return new | |||||
| { | |||||
| mean, | |||||
| stddev, | |||||
| seed, | |||||
| dtype | |||||
| }; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -260,8 +260,7 @@ namespace Tensorflow | |||||
| return tf_with(ops.name_scope(name, "ones", new { dims }), scope => | return tf_with(ops.name_scope(name, "ones", new { dims }), scope => | ||||
| { | { | ||||
| name = scope; | name = scope; | ||||
| var shape = ops.convert_to_tensor(dims, dtype: TF_DataType.TF_INT32); | |||||
| var output = gen_array_ops.fill(shape, constant_op.constant(1.0f, dtype: dtype), name: name); | |||||
| var output = _constant_if_small(1, dims, dtype, name); | |||||
| return output; | return output; | ||||
| }); | }); | ||||
| } | } | ||||
| @@ -141,7 +141,7 @@ namespace Tensorflow | |||||
| { | { | ||||
| var _op = _op_def_lib._apply_op_helper("Add", name, args: new { x, y }); | var _op = _op_def_lib._apply_op_helper("Add", name, args: new { x, y }); | ||||
| return _op.outputs[0]; | |||||
| return _op.output; | |||||
| } | } | ||||
| public static Tensor atan(Tensor x, string name = null) | public static Tensor atan(Tensor x, string name = null) | ||||
| @@ -40,7 +40,7 @@ namespace Tensorflow | |||||
| name: name, | name: name, | ||||
| args: new { shape, dtype, seed, seed2 }); | args: new { shape, dtype, seed, seed2 }); | ||||
| return _op.outputs[0]; | |||||
| return _op.output; | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -39,9 +39,10 @@ namespace Tensorflow | |||||
| { | { | ||||
| return tf_with(ops.name_scope(name, "random_normal", new { shape, mean, stddev }), scope => | return tf_with(ops.name_scope(name, "random_normal", new { shape, mean, stddev }), scope => | ||||
| { | { | ||||
| name = scope; | |||||
| var shape_tensor = _ShapeTensor(shape); | var shape_tensor = _ShapeTensor(shape); | ||||
| var mean_tensor = ops.convert_to_tensor(mean, dtype: dtype, name: "mean"); | var mean_tensor = ops.convert_to_tensor(mean, dtype: dtype, name: "mean"); | ||||
| var stddev_tensor = ops.convert_to_tensor(stddev, dtype: dtype, name = "stddev"); | |||||
| var stddev_tensor = ops.convert_to_tensor(stddev, dtype: dtype, name: "stddev"); | |||||
| var (seed1, seed2) = random_seed.get_seed(seed); | var (seed1, seed2) = random_seed.get_seed(seed); | ||||
| var rnd = gen_random_ops.random_standard_normal(shape_tensor, dtype: dtype, seed: seed1, seed2: seed2); | var rnd = gen_random_ops.random_standard_normal(shape_tensor, dtype: dtype, seed: seed1, seed2: seed2); | ||||
| var mul = rnd * stddev_tensor; | var mul = rnd * stddev_tensor; | ||||
| @@ -143,6 +143,11 @@ namespace Tensorflow | |||||
| } | } | ||||
| } | } | ||||
| public override string ToString() | |||||
| { | |||||
| return shape.ToString(); | |||||
| } | |||||
| public static implicit operator TensorShape(Shape shape) => new TensorShape((int[]) shape.Dimensions.Clone()); | public static implicit operator TensorShape(Shape shape) => new TensorShape((int[]) shape.Dimensions.Clone()); | ||||
| public static implicit operator Shape(TensorShape shape) => new Shape((int[]) shape.dims.Clone()); | public static implicit operator Shape(TensorShape shape) => new Shape((int[]) shape.dims.Clone()); | ||||
| @@ -1,6 +1,8 @@ | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Linq; | |||||
| using System.Text; | using System.Text; | ||||
| using static Tensorflow.Binding; | |||||
| namespace Tensorflow.Train | namespace Tensorflow.Train | ||||
| { | { | ||||
| @@ -11,6 +13,7 @@ namespace Tensorflow.Train | |||||
| bool _zero_debias; | bool _zero_debias; | ||||
| string _name; | string _name; | ||||
| public string name => _name; | public string name => _name; | ||||
| List<VariableV1> _averages; | |||||
| public ExponentialMovingAverage(float decay, int? num_updates = null, bool zero_debias = false, | public ExponentialMovingAverage(float decay, int? num_updates = null, bool zero_debias = false, | ||||
| string name = "ExponentialMovingAverage") | string name = "ExponentialMovingAverage") | ||||
| @@ -19,6 +22,7 @@ namespace Tensorflow.Train | |||||
| _num_updates = num_updates; | _num_updates = num_updates; | ||||
| _zero_debias = zero_debias; | _zero_debias = zero_debias; | ||||
| _name = name; | _name = name; | ||||
| _averages = new List<VariableV1>(); | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -26,11 +30,23 @@ namespace Tensorflow.Train | |||||
| /// </summary> | /// </summary> | ||||
| /// <param name="var_list"></param> | /// <param name="var_list"></param> | ||||
| /// <returns></returns> | /// <returns></returns> | ||||
| public Operation apply(VariableV1[] var_list = null) | |||||
| public Operation apply(RefVariable[] var_list = null) | |||||
| { | { | ||||
| throw new NotImplementedException(""); | |||||
| } | |||||
| if (var_list == null) | |||||
| var_list = variables.trainable_variables() as RefVariable[]; | |||||
| foreach(var var in var_list) | |||||
| { | |||||
| if (!_averages.Contains(var)) | |||||
| { | |||||
| ops.init_scope(); | |||||
| var slot = new SlotCreator(); | |||||
| var.initialized_value(); | |||||
| // var avg = slot.create_zeros_slot | |||||
| } | |||||
| } | |||||
| throw new NotImplementedException(""); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -308,5 +308,28 @@ namespace Tensorflow | |||||
| { | { | ||||
| throw new NotImplementedException(); | throw new NotImplementedException(); | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Returns the value of this variable, read in the current context. | |||||
| /// </summary> | |||||
| /// <returns></returns> | |||||
| private ITensorOrOperation read_value() | |||||
| { | |||||
| return array_ops.identity(_variable, name: "read"); | |||||
| } | |||||
| public Tensor is_variable_initialized(RefVariable variable) | |||||
| { | |||||
| return state_ops.is_variable_initialized(variable); | |||||
| } | |||||
| public Tensor initialized_value() | |||||
| { | |||||
| ops.init_scope(); | |||||
| throw new NotImplementedException(""); | |||||
| /*return control_flow_ops.cond(is_variable_initialized(this), | |||||
| read_value, | |||||
| () => initial_value);*/ | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -14,6 +14,7 @@ | |||||
| limitations under the License. | limitations under the License. | ||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using System; | |||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using Tensorflow.Eager; | using Tensorflow.Eager; | ||||
| @@ -145,5 +146,10 @@ namespace Tensorflow | |||||
| var _op = _op_def_lib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | var _op = _op_def_lib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | ||||
| return _op.outputs[0]; | return _op.outputs[0]; | ||||
| } | } | ||||
| public static Tensor is_variable_initialized(RefVariable @ref, string name = null) | |||||
| { | |||||
| throw new NotImplementedException(""); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -106,5 +106,13 @@ namespace Tensorflow | |||||
| throw new NotImplementedException("scatter_add"); | throw new NotImplementedException("scatter_add"); | ||||
| } | } | ||||
| public static Tensor is_variable_initialized(RefVariable @ref, string name = null) | |||||
| { | |||||
| if (@ref.dtype.is_ref_dtype()) | |||||
| return gen_state_ops.is_variable_initialized(@ref: @ref, name: name); | |||||
| throw new NotImplementedException(""); | |||||
| //return @ref.is_initialized(name: name); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -94,6 +94,11 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO | |||||
| model = new YOLOv3(cfg, input_data, trainable); | model = new YOLOv3(cfg, input_data, trainable); | ||||
| }); | }); | ||||
| tf_with(tf.name_scope("define_weight_decay"), scope => | |||||
| { | |||||
| var moving_ave = tf.train.ExponentialMovingAverage(moving_ave_decay).apply((RefVariable[])tf.trainable_variables()); | |||||
| }); | |||||
| return graph; | return graph; | ||||
| } | } | ||||
| @@ -37,6 +37,21 @@ namespace TensorFlowNET.Examples.ImageProcessing.YOLO | |||||
| upsample_method = cfg.YOLO.UPSAMPLE_METHOD; | upsample_method = cfg.YOLO.UPSAMPLE_METHOD; | ||||
| (conv_lbbox, conv_mbbox, conv_sbbox) = __build_nework(input_data); | (conv_lbbox, conv_mbbox, conv_sbbox) = __build_nework(input_data); | ||||
| tf_with(tf.variable_scope("pred_sbbox"), scope => | |||||
| { | |||||
| // pred_sbbox = decode(conv_sbbox, anchors[0], strides[0]); | |||||
| }); | |||||
| tf_with(tf.variable_scope("pred_mbbox"), scope => | |||||
| { | |||||
| // pred_sbbox = decode(conv_sbbox, anchors[0], strides[0]); | |||||
| }); | |||||
| tf_with(tf.variable_scope("pred_lbbox"), scope => | |||||
| { | |||||
| // pred_sbbox = decode(conv_sbbox, anchors[0], strides[0]); | |||||
| }); | |||||
| } | } | ||||
| private (Tensor, Tensor, Tensor) __build_nework(Tensor input_data) | private (Tensor, Tensor, Tensor) __build_nework(Tensor input_data) | ||||
| @@ -8,6 +8,9 @@ using static Tensorflow.Binding; | |||||
| namespace TensorFlowNET.UnitTest | namespace TensorFlowNET.UnitTest | ||||
| { | { | ||||
| /// <summary> | |||||
| /// Find more examples in https://www.programcreek.com/python/example/90444/tensorflow.read_file | |||||
| /// </summary> | |||||
| [TestClass] | [TestClass] | ||||
| public class ImageTest | public class ImageTest | ||||
| { | { | ||||
| @@ -69,9 +69,7 @@ namespace TensorFlowNET.UnitTest | |||||
| Assert.AreEqual("scope1", g._name_stack); | Assert.AreEqual("scope1", g._name_stack); | ||||
| var const3 = tf.constant(2.0); | var const3 = tf.constant(2.0); | ||||
| Assert.AreEqual("scope1/Const_1:0", const3.name); | Assert.AreEqual("scope1/Const_1:0", const3.name); | ||||
| } | |||||
| ; | |||||
| }; | |||||
| g.Dispose(); | g.Dispose(); | ||||