@@ -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) | |||
{ | |||