Browse Source

fix _apply_sparse for ResourceVariable.

tags/v0.20
Oceania2018 5 years ago
parent
commit
f3ec499a2d
11 changed files with 39 additions and 67 deletions
  1. +1
    -4
      src/TensorFlowNET.Core/APIs/tf.ops.cs
  2. +4
    -4
      src/TensorFlowNET.Core/Keras/Engine/Layer.cs
  3. +3
    -1
      src/TensorFlowNET.Core/Layers/Layer.cs
  4. +2
    -2
      src/TensorFlowNET.Core/Operations/NnOps/BasicRNNCell.cs
  5. +1
    -1
      src/TensorFlowNET.Core/Operations/Operation.cs
  6. +1
    -1
      src/TensorFlowNET.Core/Operations/embedding_ops.cs
  7. +4
    -3
      src/TensorFlowNET.Core/Operations/math_ops.cs
  8. +1
    -1
      src/TensorFlowNET.Core/Tensorflow.Binding.csproj
  9. +10
    -2
      src/TensorFlowNET.Core/Training/AdamOptimizer.cs
  10. +4
    -34
      src/TensorFlowNET.Core/Variables/gen_state_ops.py.cs
  11. +8
    -14
      src/TensorFlowNET.Core/Variables/state_ops.cs

+ 1
- 4
src/TensorFlowNET.Core/APIs/tf.ops.cs View File

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


+ 4
- 4
src/TensorFlowNET.Core/Keras/Engine/Layer.cs View File

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


+ 3
- 1
src/TensorFlowNET.Core/Layers/Layer.cs View File

@@ -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);
});




+ 2
- 2
src/TensorFlowNET.Core/Operations/NnOps/BasicRNNCell.cs View File

@@ -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;
}


+ 1
- 1
src/TensorFlowNET.Core/Operations/Operation.cs View File

@@ -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();
}


+ 1
- 1
src/TensorFlowNET.Core/Operations/embedding_ops.cs View File

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


+ 4
- 3
src/TensorFlowNET.Core/Operations/math_ops.cs View File

@@ -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;
});


+ 1
- 1
src/TensorFlowNET.Core/Tensorflow.Binding.csproj View File

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


+ 10
- 2
src/TensorFlowNET.Core/Training/AdamOptimizer.cs View File

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


+ 4
- 34
src/TensorFlowNET.Core/Variables/gen_state_ops.py.cs View File

@@ -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,


+ 8
- 14
src/TensorFlowNET.Core/Variables/state_ops.cs View File

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


Loading…
Cancel
Save