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