| @@ -30,10 +30,7 @@ namespace Tensorflow | |||
| public Tensor assign(Tensor @ref, object value, bool validate_shape = true, bool use_locking = true, string name = null) | |||
| => state_ops.assign(@ref, value, validate_shape, use_locking, name); | |||
| public Tensor assign(RefVariable @ref, object value, bool validate_shape = true, bool use_locking = true, string name = null) | |||
| => state_ops.assign(@ref, value, validate_shape, use_locking, name); | |||
| public Tensor assign(ResourceVariable @ref, object value, bool validate_shape = true, bool use_locking = true, string name = null) | |||
| public Tensor assign(IVariableV1 @ref, object value, bool validate_shape = true, bool use_locking = true, string name = null) | |||
| => state_ops.assign(@ref, value, validate_shape, use_locking, name); | |||
| public void device(string device_name) | |||
| @@ -121,7 +121,7 @@ namespace Tensorflow.Keras.Engine | |||
| /// <param name="input"></param> | |||
| /// <param name="is_training"></param> | |||
| /// <returns></returns> | |||
| public Tensor Apply(Tensor inputs, bool is_training = false) | |||
| public Tensor Apply(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| Tensor outputs = null; | |||
| @@ -135,9 +135,9 @@ namespace Tensorflow.Keras.Engine | |||
| string nameScope = ""; | |||
| if (eager) | |||
| { | |||
| nameScope = name; | |||
| } | |||
| else | |||
| nameScope = _name_scope(); | |||
| // using var graph = tf.keras.backend.get_graph().as_default(); | |||
| if (!inputs.IsEagerTensor) | |||
| @@ -148,7 +148,7 @@ namespace Tensorflow.Keras.Engine | |||
| if (!built) | |||
| MaybeBuild(inputs); | |||
| outputs = call(inputs, is_training: is_training); | |||
| outputs = call(inputs, is_training: is_training, state: state); | |||
| outputs = _set_connectivity_metadata_(inputs, outputs); | |||
| _handle_activity_regularization(inputs, outputs); | |||
| @@ -88,7 +88,9 @@ namespace Tensorflow.Layers | |||
| { | |||
| _current_scope = scope2; | |||
| // Actually call layer | |||
| outputs = base.Apply(inputs); | |||
| outputs = base.Apply(inputs, | |||
| is_training: training == null ? false : false, | |||
| state: state); | |||
| }); | |||
| @@ -71,8 +71,8 @@ namespace Tensorflow | |||
| { | |||
| // Most basic RNN: output = new_state = act(W * input + U * state + B). | |||
| var concat = array_ops.concat(new[] { inputs, state }, 1); | |||
| var gate_inputs = math_ops.matmul(concat, _kernel as RefVariable); | |||
| gate_inputs = nn_ops.bias_add(gate_inputs, _bias as RefVariable); | |||
| var gate_inputs = math_ops.matmul(concat, _kernel.AsTensor()); | |||
| gate_inputs = nn_ops.bias_add(gate_inputs, _bias.AsTensor()); | |||
| var output = _activation(gate_inputs, null); | |||
| return output; | |||
| } | |||
| @@ -326,7 +326,7 @@ namespace Tensorflow | |||
| // the updated inputs are reloaded from the c_api | |||
| lock (Locks.ProcessWide) | |||
| { | |||
| c_api.UpdateEdge(_graph, output, input, tf.Status.Handle); | |||
| // c_api.UpdateEdge(_graph, output, input, tf.Status.Handle); | |||
| //var updated_inputs = inputs; | |||
| tf.Status.Check(); | |||
| } | |||
| @@ -74,7 +74,7 @@ namespace Tensorflow | |||
| ids = ops.convert_to_tensor(ids, name: "ids"); | |||
| if (np == 1) | |||
| { | |||
| var gather = array_ops.gather(@params, ids, name: name); | |||
| var gather = array_ops.gather(@params.AsTensor(), ids, name: name); | |||
| var result = _clip(gather, ids, max_norm); | |||
| return array_ops.identity(result); | |||
| @@ -706,11 +706,12 @@ namespace Tensorflow | |||
| => tf_with(ops.name_scope(name, "Pow", new { x, y }), scope => | |||
| { | |||
| name = scope; | |||
| var x_tensor = ops.convert_to_tensor(x, name: "x"); | |||
| var y_tensor = ops.convert_to_tensor(y, name: "y", dtype: x_tensor.dtype.as_base_dtype()); | |||
| if (tf.executing_eagerly()) | |||
| { | |||
| var x_tensor = ops.convert_to_tensor(x, name: "x"); | |||
| var y_tensor = ops.convert_to_tensor(y, name: "y", dtype: x_tensor.dtype.as_base_dtype()); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
| "Pow", name, | |||
| null, | |||
| @@ -719,7 +720,7 @@ namespace Tensorflow | |||
| return results[0]; | |||
| } | |||
| var _op = tf.OpDefLib._apply_op_helper("Pow", name, args: new { x_tensor, y_tensor }); | |||
| var _op = tf.OpDefLib._apply_op_helper("Pow", name, args: new { x, y }); | |||
| return _op.output; | |||
| }); | |||
| @@ -10,7 +10,7 @@ | |||
| <Authors>Haiping Chen, Meinrad Recheis, Eli Belash</Authors> | |||
| <Company>SciSharp STACK</Company> | |||
| <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | |||
| <Copyright>Apache 2.0</Copyright> | |||
| <Copyright>Apache 2.0, Haiping Chen $([System.DateTime]::UtcNow.ToString(yyyy))</Copyright> | |||
| <RepositoryUrl>https://github.com/SciSharp/TensorFlow.NET</RepositoryUrl> | |||
| <RepositoryType>git</RepositoryType> | |||
| <PackageProjectUrl>http://scisharpstack.org</PackageProjectUrl> | |||
| @@ -52,6 +52,14 @@ namespace Tensorflow.Train | |||
| _dtype = dtype; | |||
| } | |||
| public override Operation _apply_sparse(IndexedSlices grad, ResourceVariable var) | |||
| { | |||
| return _apply_sparse_shared(grad.values, var, grad.indices, (x, i, v) => | |||
| { | |||
| return state_ops.scatter_add(x, i, v, use_locking: _use_locking); | |||
| }); | |||
| } | |||
| public override Operation _apply_sparse(IndexedSlices grad, RefVariable var) | |||
| { | |||
| return _apply_sparse_shared(grad.values, var, grad.indices, (x, i, v) => | |||
| @@ -91,7 +99,7 @@ namespace Tensorflow.Train | |||
| var lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power)); | |||
| var m = get_slot(var, "m"); | |||
| var m_scaled_g_values = grad * (1 - beta1_t); | |||
| var m_t = state_ops.assign(m.AsTensor(), m.AsTensor() * beta1_t, use_locking: _use_locking); | |||
| var m_t = state_ops.assign(m, m.AsTensor() * beta1_t, use_locking: _use_locking); | |||
| tf_with(ops.control_dependencies(new[] { m_t }), delegate | |||
| { | |||
| m_t = scatter_add(m, indices, m_scaled_g_values); | |||
| @@ -99,7 +107,7 @@ namespace Tensorflow.Train | |||
| var v = get_slot(var, "v"); | |||
| var v_scaled_g_values = (grad * grad) * (1 - beta2_t); | |||
| var v_t = state_ops.assign(v.AsTensor(), v.AsTensor() * beta2_t, use_locking: _use_locking); | |||
| var v_t = state_ops.assign(v, v.AsTensor() * beta2_t, use_locking: _use_locking); | |||
| tf_with(ops.control_dependencies(new[] { v_t }), delegate | |||
| { | |||
| v_t = scatter_add(v, indices, v_scaled_g_values); | |||
| @@ -56,7 +56,7 @@ namespace Tensorflow | |||
| /// <param name="validate_shape"></param> | |||
| /// <param name="use_locking"></param> | |||
| /// <param name="name"></param> | |||
| public static Tensor assign(Tensor @ref, object value, | |||
| public static Tensor assign<T>(T @ref, object value, | |||
| bool validate_shape = true, | |||
| bool use_locking = true, | |||
| string name = null) | |||
| @@ -74,40 +74,10 @@ namespace Tensorflow | |||
| return _result[0]; | |||
| } | |||
| public static Tensor assign(RefVariable @ref, object value, | |||
| bool validate_shape = true, | |||
| bool use_locking = true, | |||
| string name = null) | |||
| { | |||
| var _op = tf.OpDefLib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| var _attrs = new Dictionary<string, object>(); | |||
| _attrs["T"] = _op.get_attr("T"); | |||
| _attrs["validate_shape"] = _op.get_attr("validate_shape"); | |||
| _attrs["use_locking"] = _op.get_attr("use_locking"); | |||
| return _result[0]; | |||
| } | |||
| public static Tensor assign(ResourceVariable @ref, object value, | |||
| bool validate_shape = true, | |||
| bool use_locking = true, | |||
| string name = null) | |||
| public static Tensor assign_add<T>(IVariableV1 @ref, T value, bool use_locking = false, string name = null) | |||
| { | |||
| var _op = tf.OpDefLib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| var _attrs = new Dictionary<string, object>(); | |||
| _attrs["T"] = _op.get_attr("T"); | |||
| _attrs["validate_shape"] = _op.get_attr("validate_shape"); | |||
| _attrs["use_locking"] = _op.get_attr("use_locking"); | |||
| return _result[0]; | |||
| var _op = tf.OpDefLib._apply_op_helper("AssignAdd", name: name, args: new { @ref, value, use_locking }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor assign_sub(IVariableV1 @ref, | |||
| @@ -15,6 +15,7 @@ | |||
| ******************************************************************************/ | |||
| using System; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| @@ -54,19 +55,7 @@ namespace Tensorflow | |||
| return @ref.assign((Tensor)value, name: name); | |||
| } | |||
| public static Tensor assign(RefVariable @ref, object value, | |||
| bool validate_shape = true, | |||
| bool use_locking = true, | |||
| string name = null) | |||
| { | |||
| return gen_state_ops.assign(@ref, | |||
| value, | |||
| validate_shape: validate_shape, | |||
| use_locking: use_locking, | |||
| name: name); | |||
| } | |||
| public static Tensor assign(ResourceVariable @ref, object value, | |||
| public static Tensor assign<T>(T @ref, object value, | |||
| bool validate_shape = true, | |||
| bool use_locking = true, | |||
| string name = null) | |||
| @@ -110,7 +99,12 @@ namespace Tensorflow | |||
| T value, | |||
| bool use_locking = false, | |||
| string name = null) | |||
| => @ref.assign_add(value, use_locking: use_locking, name: name); | |||
| { | |||
| if(tf.executing_eagerly()) | |||
| return @ref.assign_add(value, use_locking: use_locking, name: name); | |||
| else | |||
| return gen_state_ops.assign_add(@ref, value, use_locking: use_locking, name: name); | |||
| } | |||
| public static Tensor scatter_add(IVariableV1 @ref, Tensor indices, Tensor updates, bool use_locking = false, string name = null) | |||
| { | |||