@@ -26,11 +26,11 @@ In comparison to other projects, like for instance TensorFlowSharp which only pr | |||
### How to use | |||
| TensorFlow | tf 1.13 | tf 1.14 | tf 1.15 | tf 2.2 | | |||
| ----------- | ------- | ------- | ------- | ------ | | |||
| tf.net 0.20 | | | x | x | | |||
| tf.net 0.15 | | x | x | | | |||
| tf.net 0.14 | x | x | | | | |||
| TensorFlow | tf native1.14 | tf native 1.15 | tf native 2.3 | | |||
| ----------- | ------------- | -------------- | ------------- | | |||
| tf.net 0.20 | | x | x | | |||
| tf.net 0.15 | x | x | | | |||
| tf.net 0.14 | x | | | | |||
Install TF.NET and TensorFlow binary through NuGet. | |||
```sh | |||
@@ -138,6 +138,10 @@ Scan QR code to join Tencent TIM group: | |||
 | |||
WeChat Sponsor 微信打赏: | |||
 | |||
TensorFlow.NET is a part of [SciSharp STACK](https://scisharp.github.io/SciSharp/) | |||
<br> | |||
<a href="http://scisharpstack.org"><img src="https://github.com/SciSharp/SciSharp/blob/master/art/scisharp-stack.png" width="391" height="100" /></a> | |||
<a href="http://scisharpstack.org"><img src="https://github.com/SciSharp/SciSharp/blob/master/art/scisharp-stack.png" width="391" height="100" /></a> |
@@ -10,7 +10,7 @@ namespace Tensorflow | |||
{ | |||
public void WarmUp() | |||
{ | |||
print(tf.VERSION); | |||
print($"tensorflow native version: v{tf.VERSION}"); | |||
} | |||
public void Execute(int epoch, int iterate, Action<int> process) | |||
@@ -8,7 +8,7 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="SciSharp.TensorFlow.Redist" Version="2.2.0.2" /> | |||
<PackageReference Include="SciSharp.TensorFlow.Redist" Version="2.3.0" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -1,64 +0,0 @@ | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Linq; | |||
using Tensorflow.Keras.Layers; | |||
namespace Tensorflow | |||
{ | |||
public static partial class keras | |||
{ | |||
public static class layers | |||
{ | |||
public static Embedding Embedding(int input_dim, int output_dim, | |||
IInitializer embeddings_initializer = null, | |||
bool mask_zero = false) => new Embedding(input_dim, output_dim, | |||
embeddings_initializer, | |||
mask_zero); | |||
public static Tensor[] Input(int[] batch_shape = null, | |||
TF_DataType dtype = TF_DataType.DtInvalid, | |||
string name = null, | |||
bool sparse = false, | |||
Tensor tensor = null) | |||
{ | |||
var batch_size = batch_shape[0]; | |||
var shape = batch_shape.Skip(1).ToArray(); | |||
InputLayer input_layer = null; | |||
if (batch_shape != null) | |||
input_layer = new InputLayer( | |||
batch_input_shape: batch_shape, | |||
name: name, | |||
dtype: dtype, | |||
sparse: sparse, | |||
input_tensor: tensor); | |||
else | |||
input_layer = new InputLayer( | |||
input_shape: shape, | |||
batch_size: batch_size, | |||
name: name, | |||
dtype: dtype, | |||
sparse: sparse, | |||
input_tensor: tensor); | |||
var outputs = input_layer.inbound_nodes[0].output_tensors; | |||
return outputs; | |||
} | |||
} | |||
} | |||
} |
@@ -26,5 +26,8 @@ namespace Tensorflow | |||
{ | |||
public CompatV1Api v1 { get; } = new CompatV1Api(); | |||
} | |||
public bool executing_eagerly() | |||
=> Context.executing_eagerly(); | |||
} | |||
} |
@@ -16,7 +16,7 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using Tensorflow.Eager; | |||
using Tensorflow.Contexts; | |||
using static Tensorflow.Binding; | |||
namespace Tensorflow | |||
@@ -24,9 +24,7 @@ namespace Tensorflow | |||
public class CompatV1Api | |||
{ | |||
public void disable_eager_execution() | |||
{ | |||
tf.context.default_execution_mode = Context.GRAPH_MODE; | |||
} | |||
=> tf.Context.graph_mode(); | |||
public IVariableV1 get_variable(string name, | |||
TensorShape shape = null, | |||
@@ -18,6 +18,7 @@ using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using NumSharp; | |||
using Tensorflow.Keras; | |||
using Tensorflow.Keras.ArgsDefinition; | |||
using Tensorflow.Keras.Layers; | |||
using Tensorflow.Operations.Activation; | |||
@@ -164,7 +165,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public Tensor dense(Tensor inputs, | |||
int units, | |||
IActivation activation = null, | |||
Activation activation = null, | |||
bool use_bias = true, | |||
IInitializer kernel_initializer = null, | |||
IInitializer bias_initializer = null, | |||
@@ -0,0 +1,90 @@ | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System; | |||
using Tensorflow.Eager; | |||
namespace Tensorflow.Contexts | |||
{ | |||
/// <summary> | |||
/// Environment in which eager operations execute. | |||
/// </summary> | |||
public sealed class Context : IDisposable | |||
{ | |||
public const int GRAPH_MODE = 0; | |||
public const int EAGER_MODE = 1; | |||
int defaultExecutionMode = EAGER_MODE; | |||
public string DeviceName { get; set; } = ""; | |||
public string ScopeName { get; set; } = ""; | |||
bool initialized = false; | |||
bool isEager; | |||
ContextSwitchStack contextSwitches; | |||
public SafeContextHandle Handle { get; } | |||
public Context(ContextOptions opts, Status status) | |||
{ | |||
Handle = c_api.TFE_NewContext(opts.Handle, status.Handle); | |||
status.Check(true); | |||
isEager = defaultExecutionMode == EAGER_MODE; | |||
contextSwitches = new ContextSwitchStack(isEager); | |||
initialized = true; | |||
} | |||
/// <summary> | |||
/// Initialize handle and devices if not already done so. | |||
/// </summary> | |||
public void ensure_initialized() | |||
{ | |||
if (initialized) | |||
return; | |||
initialized = true; | |||
} | |||
public void start_step() | |||
=> c_api.TFE_ContextStartStep(Handle); | |||
public void end_step() | |||
=> c_api.TFE_ContextEndStep(Handle); | |||
/// <summary> | |||
/// Checks whether the current thread has eager execution enabled. | |||
/// </summary> | |||
/// <returns></returns> | |||
public bool executing_eagerly() | |||
=> isEager; | |||
public string shared_name(string name = null) | |||
=> !string.IsNullOrEmpty(name) || !executing_eagerly() ? | |||
name : | |||
"cd2c89b7-88b7-44c8-ad83-06c2a9158347"; | |||
public void graph_mode() | |||
=> mode(false); | |||
public void eager_mode() | |||
=> mode(true); | |||
void mode(bool mode) | |||
{ | |||
isEager = mode; | |||
} | |||
public void Dispose() | |||
=> Handle.Dispose(); | |||
} | |||
} |
@@ -15,8 +15,9 @@ | |||
******************************************************************************/ | |||
using System; | |||
using Tensorflow.Eager; | |||
namespace Tensorflow.Eager | |||
namespace Tensorflow.Contexts | |||
{ | |||
public sealed class ContextOptions : IDisposable | |||
{ |
@@ -14,15 +14,24 @@ | |||
limitations under the License. | |||
******************************************************************************/ | |||
using Tensorflow.Keras; | |||
using Tensorflow.Keras.Engine; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace Tensorflow | |||
namespace Tensorflow.Contexts | |||
{ | |||
public static partial class keras | |||
public class ContextSwitch | |||
{ | |||
public static Preprocessing preprocessing => new Preprocessing(); | |||
public static Sequence sequence = new Sequence(); | |||
public static Sequential Sequential() => new Sequential(); | |||
/// <summary> | |||
/// Whether the context is building a function. | |||
/// </summary> | |||
public bool IsBuildingFunction { get; set; } | |||
/// <summary> | |||
/// A callable that executes the context switch. | |||
/// </summary> | |||
public Action EnterContextFn { get; set; } | |||
public string DeviceStack { get; set; } | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
/***************************************************************************** | |||
Copyright 2020 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace Tensorflow.Contexts | |||
{ | |||
/// <summary> | |||
/// Match the semantics of DefaultGraphStack | |||
/// </summary> | |||
public class ContextSwitchStack | |||
{ | |||
Stack<ContextSwitch> stack; | |||
public ContextSwitchStack(bool isEager) | |||
{ | |||
stack = new Stack<ContextSwitch>(); | |||
if (isEager) | |||
stack.Push(new ContextSwitch | |||
{ | |||
IsBuildingFunction = false | |||
}); | |||
} | |||
} | |||
} |
@@ -25,7 +25,7 @@ namespace Tensorflow | |||
(_seed, _seed2) = random_seed.get_seed_tensor(seed); | |||
_reshuffle_each_iteration = reshuffle_each_iteration; | |||
var seed_generator = ops.dummy_seed_generator(); | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
variant_tensor = ops.shuffle_dataset_v3(input_dataset.variant_tensor, _buffer_size, | |||
_seed, _seed2, seed_generator, | |||
output_types, output_shapes, | |||
@@ -1,50 +0,0 @@ | |||
using System; | |||
namespace Tensorflow.Eager | |||
{ | |||
public sealed class Context : IDisposable | |||
{ | |||
public const int GRAPH_MODE = 0; | |||
public const int EAGER_MODE = 1; | |||
public int default_execution_mode; | |||
public string device_name = ""; | |||
public string scope_name = ""; | |||
bool _initialized = false; | |||
public SafeContextHandle Handle { get; } | |||
public Context(ContextOptions opts, Status status) | |||
{ | |||
Handle = c_api.TFE_NewContext(opts.Handle, status.Handle); | |||
status.Check(true); | |||
} | |||
/// <summary> | |||
/// Initialize handle and devices if not already done so. | |||
/// </summary> | |||
public void ensure_initialized() | |||
{ | |||
if (_initialized) | |||
return; | |||
_initialized = true; | |||
} | |||
public void start_step() | |||
=> c_api.TFE_ContextStartStep(Handle); | |||
public void end_step() | |||
=> c_api.TFE_ContextEndStep(Handle); | |||
public bool executing_eagerly() | |||
=> default_execution_mode == EAGER_MODE; | |||
public string shared_name(string name = null) | |||
=> !string.IsNullOrEmpty(name) || !executing_eagerly() ? | |||
name : | |||
"cd2c89b7-88b7-44c8-ad83-06c2a9158347"; | |||
public void Dispose() | |||
=> Handle.Dispose(); | |||
} | |||
} |
@@ -53,7 +53,7 @@ namespace Tensorflow.Eager | |||
{ | |||
object value = null; | |||
byte isList = 0; | |||
var attrType = c_api.TFE_OpNameGetAttrType(tf.context.Handle, Name, attr_name, ref isList, tf.status.Handle); | |||
var attrType = c_api.TFE_OpNameGetAttrType(tf.Context.Handle, Name, attr_name, ref isList, tf.Status.Handle); | |||
switch (attrType) | |||
{ | |||
case TF_AttrType.TF_ATTR_BOOL: | |||
@@ -0,0 +1,58 @@ | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Collections.Generic; | |||
using System; | |||
using System.Linq; | |||
using static Tensorflow.Binding; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow.Eager | |||
{ | |||
public partial class EagerRunner | |||
{ | |||
public (TF_DataType, Tensor[]) ArgsToMatchingEager(Context ctx, TF_DataType default_dtype = TF_DataType.DtInvalid, object[] args = null) | |||
{ | |||
if (args.Length == 0 && default_dtype != TF_DataType.DtInvalid) | |||
return (default_dtype, null); | |||
if (args.Count(x => x is Tensor) == args.Length) | |||
return ((args[0] as Tensor).dtype, args.Select(x => x as Tensor).ToArray()); | |||
var dtype = TF_DataType.DtInvalid; | |||
foreach (var x in args) | |||
{ | |||
if (x is Tensor et) | |||
dtype = et.dtype; | |||
} | |||
if (dtype == TF_DataType.DtInvalid) | |||
{ | |||
var ret = new List<Tensor>(); | |||
foreach (var t in args) | |||
{ | |||
ret.Add(ops.convert_to_tensor(t, dtype, preferred_dtype: default_dtype, ctx: ctx) as Tensor); | |||
if (dtype == TF_DataType.DtInvalid) | |||
dtype = ret.Last().dtype; | |||
} | |||
return (dtype, ret.ToArray()); | |||
} | |||
else | |||
throw new NotImplementedException(""); | |||
} | |||
} | |||
} |
@@ -1,11 +1,30 @@ | |||
using System.Collections.Generic; | |||
using System; | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Linq; | |||
using System; | |||
using static Tensorflow.Binding; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow.Eager | |||
{ | |||
public class Execute | |||
/// <summary> | |||
/// python\eager\pywrap_tfe_src.cc | |||
/// </summary> | |||
public partial class EagerRunner | |||
{ | |||
/// <summary> | |||
/// Execute a TensorFlow operation. | |||
@@ -28,14 +47,14 @@ namespace Tensorflow.Eager | |||
/// <param name="ctx">The value of context.context().</param> | |||
/// <param name="name">Customized name for the operation.</param> | |||
/// <returns>List of output Tensor objects. The list is empty if there are no outputs</returns> | |||
public Tensor[] execute(Context ctx, string op_name, int num_outputs, | |||
Tensor[] inputs, object[] attrs, | |||
public Tensor[] Execute(Context ctx, string op_name, int num_outputs, | |||
Tensor[] inputs, object[] attrs, | |||
string name = null) | |||
{ | |||
ctx.ensure_initialized(); | |||
var results = tf.Runner.TFE_Execute(ctx, | |||
ctx.device_name, | |||
ctx.DeviceName, | |||
op_name, | |||
inputs, | |||
attrs, | |||
@@ -43,36 +62,5 @@ namespace Tensorflow.Eager | |||
return results; | |||
} | |||
public (TF_DataType, Tensor[]) args_to_matching_eager(Context ctx, TF_DataType default_dtype = TF_DataType.DtInvalid, object[] args = null) | |||
{ | |||
if (args.Length == 0 && default_dtype != TF_DataType.DtInvalid) | |||
return (default_dtype, null); | |||
if (args.Count(x => x is Tensor) == args.Length) | |||
return ((args[0] as Tensor).dtype, args.Select(x => x as Tensor).ToArray()); | |||
var dtype = TF_DataType.DtInvalid; | |||
foreach (var x in args) | |||
{ | |||
if (x is Tensor et) | |||
dtype = et.dtype; | |||
} | |||
if (dtype == TF_DataType.DtInvalid) | |||
{ | |||
var ret = new List<Tensor>(); | |||
foreach (var t in args) | |||
{ | |||
ret.Add(ops.convert_to_tensor(t, dtype, preferred_dtype: default_dtype, ctx: ctx) as Tensor); | |||
if (dtype == TF_DataType.DtInvalid) | |||
dtype = ret.Last().dtype; | |||
} | |||
return (dtype, ret.ToArray()); | |||
} | |||
else | |||
throw new NotImplementedException(""); | |||
} | |||
} | |||
} | |||
} |
@@ -1,7 +1,23 @@ | |||
using System.Collections.Generic; | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Linq; | |||
using System; | |||
using static Tensorflow.Binding; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow.Eager | |||
{ | |||
@@ -25,7 +41,7 @@ namespace Tensorflow.Eager | |||
object[] attrs, | |||
int num_outputs) | |||
{ | |||
var status = tf.status; | |||
var status = tf.Status; | |||
var op = GetOp(ctx, op_name, status); | |||
status.Check(true); | |||
c_api.TFE_OpSetDevice(op, device_name, status.Handle); | |||
@@ -3,11 +3,9 @@ using System.Linq; | |||
using System; | |||
using static Tensorflow.OpDef.Types; | |||
using static Tensorflow.Binding; | |||
using Google.Protobuf.WellKnownTypes; | |||
using System.Threading; | |||
using Tensorflow.Util; | |||
using System.Runtime.InteropServices.ComTypes; | |||
using System.Runtime.InteropServices; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow.Eager | |||
{ | |||
@@ -17,6 +15,7 @@ namespace Tensorflow.Eager | |||
public partial class EagerRunner | |||
{ | |||
int kFastPathExecuteInputStartIndex = 0; | |||
UnorderedMap<Context, SafeOpHandle> thread_local_eager_operation_map = new UnorderedMap<Context, SafeOpHandle>(); | |||
public Tensor[] TFE_FastPathExecute(Context ctx, | |||
string device_name, | |||
@@ -45,7 +44,7 @@ namespace Tensorflow.Eager | |||
op_exec_info.run_post_exec_callbacks = callbacks != null; | |||
op_exec_info.run_callbacks = op_exec_info.run_gradient_callback || op_exec_info.run_post_exec_callbacks; | |||
var status = tf.status; | |||
var status = tf.Status; | |||
var op = GetOp(ctx, opName, status); | |||
var op_def = tf.get_default_graph().GetOpDef(opName); | |||
@@ -173,7 +172,7 @@ namespace Tensorflow.Eager | |||
SafeOpHandle GetOp(Context ctx, string op_or_function_name, Status status) | |||
{ | |||
if (thread_local_eager_operation_map.find(ctx, out var op)) | |||
c_api.TFE_OpReset(op, op_or_function_name, ctx.device_name, status.Handle); | |||
c_api.TFE_OpReset(op, op_or_function_name, ctx.DeviceName, status.Handle); | |||
else | |||
{ | |||
op = c_api.TFE_NewOp(ctx.Handle, op_or_function_name, status.Handle); | |||
@@ -184,8 +183,6 @@ namespace Tensorflow.Eager | |||
return op; | |||
} | |||
static UnorderedMap<Context, SafeOpHandle> thread_local_eager_operation_map = new UnorderedMap<Context, SafeOpHandle>(); | |||
bool HasAccumulator() | |||
{ | |||
//return !GetAccumulatorSet()->empty(); | |||
@@ -252,7 +249,7 @@ namespace Tensorflow.Eager | |||
public void SetOpAttrs(SafeOpHandle op, params object[] attrs) | |||
{ | |||
var status = tf.status; | |||
var status = tf.Status; | |||
var len = attrs.Length; | |||
for (int i = 0; i < len; i += 2) | |||
{ | |||
@@ -263,9 +260,9 @@ namespace Tensorflow.Eager | |||
var type = c_api.TFE_OpGetAttrType(op, key, ref is_list, status.Handle); | |||
if (!status.ok()) return; | |||
if (is_list != 0) | |||
SetOpAttrList(tf.context, op, key, value as object[], type, null, status); | |||
SetOpAttrList(tf.Context, op, key, value as object[], type, null, status); | |||
else | |||
SetOpAttrScalar(tf.context, op, key, value, type, null, status); | |||
SetOpAttrScalar(tf.Context, op, key, value, type, null, status); | |||
status.Check(true); | |||
} | |||
} | |||
@@ -11,6 +11,6 @@ namespace Tensorflow.Eager | |||
/// </summary> | |||
public partial class EagerRunner : IEagerRunner | |||
{ | |||
} | |||
} |
@@ -22,25 +22,25 @@ namespace Tensorflow.Eager | |||
public EagerTensor(string value, string device_name) : base(value) | |||
{ | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.status.Handle); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.Status.Handle); | |||
Resolve(); | |||
} | |||
public EagerTensor(byte[] value, string device_name, TF_DataType dtype) : base(value, dType: dtype) | |||
{ | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.status.Handle); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.Status.Handle); | |||
Resolve(); | |||
} | |||
public EagerTensor(string[] value, string device_name) : base(value) | |||
{ | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.status.Handle); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.Status.Handle); | |||
Resolve(); | |||
} | |||
public EagerTensor(NDArray value, string device_name) : base(value) | |||
{ | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.status.Handle); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.Status.Handle); | |||
Resolve(); | |||
} | |||
@@ -49,7 +49,7 @@ namespace Tensorflow.Eager | |||
_id = ops.uid(); | |||
if (_handle == IntPtr.Zero) | |||
_handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, tf.status.Handle); | |||
_handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, tf.Status.Handle); | |||
//print($"new Tensor {Id} {_handle.ToString("x16")}"); | |||
//print($"new TensorHandle {Id} {EagerTensorHandle.ToString("x16")}"); | |||
@@ -13,24 +13,24 @@ namespace Tensorflow.Eager | |||
get | |||
{ | |||
using var _ = EagerTensorHandle.Lease(); | |||
return c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, tf.status.Handle)); | |||
return c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, tf.Status.Handle)); | |||
} | |||
} | |||
public override int rank => c_api.TFE_TensorHandleNumDims(EagerTensorHandle, tf.status.Handle); | |||
public override int rank => c_api.TFE_TensorHandleNumDims(EagerTensorHandle, tf.Status.Handle); | |||
public static int GetRank(IntPtr handle) | |||
{ | |||
var tfe_tensor_handle = c_api.TFE_EagerTensorHandle(handle); | |||
return c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, tf.status.Handle); | |||
return c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, tf.Status.Handle); | |||
} | |||
public static int[] GetDims(IntPtr handle) | |||
{ | |||
var tfe_tensor_handle = c_api.TFE_EagerTensorHandle(handle); | |||
var dims = new int[c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, tf.status.Handle)]; | |||
var dims = new int[c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, tf.Status.Handle)]; | |||
for (int i = 0; i < dims.Length; i++) | |||
dims[i] = c_api.TFE_TensorHandleDim(tfe_tensor_handle, i, tf.status.Handle); | |||
dims[i] = c_api.TFE_TensorHandleDim(tfe_tensor_handle, i, tf.Status.Handle); | |||
return dims; | |||
} | |||
} | |||
@@ -1,6 +1,7 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow.Eager | |||
{ | |||
@@ -1,27 +1,37 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Tensorflow.Contexts; | |||
using Tensorflow.Gradients; | |||
namespace Tensorflow.Eager | |||
{ | |||
public interface IEagerRunner | |||
{ | |||
public Tensor[] TFE_FastPathExecute(Context ctx, | |||
Tensor[] Execute(Context ctx, string op_name, | |||
int num_outputs, | |||
Tensor[] inputs, object[] attrs, | |||
string name = null); | |||
(TF_DataType, Tensor[]) ArgsToMatchingEager(Context ctx, | |||
TF_DataType default_dtype = TF_DataType.DtInvalid, | |||
object[] args = null); | |||
Tensor[] TFE_FastPathExecute(Context ctx, | |||
string device_name, | |||
string opName, | |||
string name, | |||
Action callbacks, | |||
params object[] args); | |||
public Tensor[] TFE_Execute(Context ctx, | |||
Tensor[] TFE_Execute(Context ctx, | |||
string device_name, | |||
string op_name, | |||
Tensor[] inputs, | |||
object[] attrs, | |||
int num_outputs); | |||
public Tensor[] TFE_TapeGradient(ITape tape, | |||
Tensor[] TFE_TapeGradient(ITape tape, | |||
Tensor[] target, | |||
Tensor[] sources, | |||
Tensor[] output_gradients); | |||
@@ -18,9 +18,9 @@ namespace Tensorflow.Framework.Models | |||
protected string _name; | |||
public string name => _name; | |||
public DenseSpec(int[] shape, TF_DataType dtype = TF_DataType.TF_FLOAT, string name = null) | |||
public DenseSpec(TensorShape shape, TF_DataType dtype = TF_DataType.TF_FLOAT, string name = null) | |||
{ | |||
_shape = new TensorShape(shape); | |||
_shape = shape; | |||
_dtype = dtype; | |||
_name = name; | |||
} | |||
@@ -7,7 +7,7 @@ namespace Tensorflow.Framework.Models | |||
{ | |||
public class TensorSpec : DenseSpec | |||
{ | |||
public TensorSpec(int[] shape, TF_DataType dtype = TF_DataType.TF_FLOAT, string name = null) : | |||
public TensorSpec(TensorShape shape, TF_DataType dtype = TF_DataType.TF_FLOAT, string name = null) : | |||
base(shape, dtype, name) | |||
{ | |||
@@ -37,14 +37,14 @@ namespace Tensorflow.Gradients | |||
{ | |||
_persistent = persistent; | |||
_watch_accessed_variables = watch_accessed_variables; | |||
_created_eagerly = tf.context.executing_eagerly(); | |||
_created_eagerly = tf.Context.executing_eagerly(); | |||
_recording = false; | |||
_created_eagerly = tf.context.executing_eagerly(); | |||
_created_eagerly = tf.Context.executing_eagerly(); | |||
// Enters a context inside which operations are recorded on this tape. | |||
if (_created_eagerly) | |||
{ | |||
tf.context.ensure_initialized(); | |||
tf.context.start_step(); | |||
tf.Context.ensure_initialized(); | |||
tf.Context.start_step(); | |||
} | |||
_push_tape(); | |||
} | |||
@@ -156,7 +156,7 @@ namespace Tensorflow.Gradients | |||
_pop_tape(); | |||
if (_created_eagerly) | |||
tf.context.end_step(); | |||
tf.Context.end_step(); | |||
} | |||
} | |||
} |
@@ -515,7 +515,7 @@ namespace Tensorflow.Gradients | |||
var rank = input_0_shape.Length; | |||
if (Enumerable.SequenceEqual(Enumerable.Range(0, rank), axes.Data<int>())) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
// should add ones_rank_cache | |||
var new_shape = constant_op.constant(range(0, rank).Select(x => 1).ToArray(), dtype: TF_DataType.TF_INT32); | |||
@@ -534,7 +534,7 @@ namespace Tensorflow.Gradients | |||
input_shape = array_ops.shape(op.inputs[0]); | |||
return new Tensor[] { gen_array_ops.tile(grad, input_shape), null }; | |||
} | |||
else if (!input_0_shape.Contains(-1) && !tf.context.executing_eagerly()) | |||
else if (!input_0_shape.Contains(-1) && !tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException(""); | |||
} | |||
@@ -82,7 +82,7 @@ namespace Tensorflow | |||
/// </summary> | |||
public _ControlDependenciesController control_dependencies(object[] control_inputs) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
return new _ControlDependenciesController(this, null); | |||
if (control_inputs == null) | |||
@@ -518,7 +518,7 @@ namespace Tensorflow | |||
public TensorShape GetTensorShape(TF_Output output) | |||
{ | |||
var status = tf.status; | |||
var status = tf.Status; | |||
var ndim = c_api.TF_GraphGetTensorNumDims(_handle, output, status.Handle); | |||
status.Check(); | |||
@@ -0,0 +1,17 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using static Tensorflow.Binding; | |||
namespace Tensorflow.Keras | |||
{ | |||
public delegate Tensor Activation(Tensor x); | |||
public class Activations | |||
{ | |||
/// <summary> | |||
/// Linear activation function (pass-through). | |||
/// </summary> | |||
public Activation Linear = x => x; | |||
} | |||
} |
@@ -16,7 +16,7 @@ namespace Tensorflow.Keras.ArgsDefinition | |||
/// <summary> | |||
/// Activation function to use. | |||
/// </summary> | |||
public IActivation Activation { get; set; } | |||
public Activation Activation { get; set; } | |||
/// <summary> | |||
/// Whether the layer uses a bias vector. | |||
@@ -0,0 +1,13 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace Tensorflow.Keras.ArgsDefinition | |||
{ | |||
public class InputLayerArgs : LayerArgs | |||
{ | |||
public Tensor InputTensor { get; set; } | |||
public bool Sparse { get; set; } | |||
public bool Ragged { get; set; } | |||
} | |||
} |
@@ -17,7 +17,7 @@ namespace Tensorflow.Keras.ArgsDefinition | |||
/// <summary> | |||
/// Only applicable to input layers. | |||
/// </summary> | |||
public TF_DataType DType { get; set; } | |||
public TF_DataType DType { get; set; } = TF_DataType.TF_FLOAT; | |||
/// <summary> | |||
/// Whether the `call` method can be used to build a TF graph without issues. | |||
@@ -36,6 +36,8 @@ namespace Tensorflow.Keras.ArgsDefinition | |||
/// </summary> | |||
public TensorShape BatchInputShape { get; set; } | |||
public int BatchSize { get; set; } = -1; | |||
/// <summary> | |||
/// Initial weight values. | |||
/// </summary> | |||
@@ -0,0 +1,17 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
using Tensorflow.Keras.Engine; | |||
using Tensorflow.Keras.Layers; | |||
namespace Tensorflow.Keras.ArgsDefinition | |||
{ | |||
public class NodeArgs | |||
{ | |||
public Layer[] InboundLayers { get; set; } | |||
public int[] NodeIndices { get; set; } | |||
public int[] TensorIndices { get; set; } | |||
public Tensor[] InputTensors { get; set; } | |||
public Tensor[] Outputs { get; set; } | |||
} | |||
} |
@@ -20,20 +20,21 @@ using static Tensorflow.Binding; | |||
namespace Tensorflow.Keras | |||
{ | |||
public class backend : BackendBase | |||
public class BackendImpl : BackendBase | |||
{ | |||
/* ---------------------------------------- KERAS BACKEND NATIVE OBJECTS ---------------------------------------- */ | |||
public static Func<Array, double> py_sum = sum; | |||
public static Func<Array, bool> py_all = all; | |||
public Func<Array, double> py_sum = sum; | |||
public Func<Array, bool> py_all = all; | |||
//Func<Array, bool> py_any = any; | |||
//Func<double, double, double, IEnumerable<double>> py_slice = slice; | |||
public static Session _SESSION = ops.get_default_session(); | |||
public static Graph _GRAPH = null; | |||
public static Dictionary<Graph, GraphLearningPhase> _GRAPH_LEARNING_PHASES; | |||
public Session _SESSION => ops.get_default_session(); | |||
public Graph _GRAPH; | |||
public Dictionary<Graph, GraphLearningPhase> _GRAPH_LEARNING_PHASES; | |||
//Dictionary<Graph, Dictionary<string, int>> PER_GRAPH_LAYER_NAME_UIDS; | |||
public static bool _MANUAL_VAR_INIT = false; | |||
public static List<string> _LOCAL_DEVICES = null; | |||
public bool _MANUAL_VAR_INIT = false; | |||
public List<string> _LOCAL_DEVICES = null; | |||
/* -------------------------------------- KERAS BACKEND NATIVE OBJECTS END -------------------------------------- */ | |||
/// <summary> | |||
@@ -41,23 +42,28 @@ namespace Tensorflow.Keras | |||
/// for various layer names in each graph. | |||
/// Allows to give unique autogenerated names to layers, in a graph-specific way. | |||
/// </summary> | |||
public static Dictionary<Graph, Dictionary<(string, string), int>> PER_GRAPH_LAYER_NAME_UIDS = new Dictionary<Graph, Dictionary<(string, string), int>>(); | |||
public static Dictionary<string, IVariableV1> _GRAPH_VARIABLES = new Dictionary<string, IVariableV1>(); | |||
public static Dictionary<string, Optimizer> _GRAPH_TF_OPTIMIZERS = new Dictionary<string, Optimizer>(); | |||
public Dictionary<Graph, Dictionary<(string, string), int>> PER_GRAPH_LAYER_NAME_UIDS = new Dictionary<Graph, Dictionary<(string, string), int>>(); | |||
public Dictionary<string, IVariableV1> _GRAPH_VARIABLES = new Dictionary<string, IVariableV1>(); | |||
public Dictionary<string, Optimizer> _GRAPH_TF_OPTIMIZERS = new Dictionary<string, Optimizer>(); | |||
public _DummyEagerGraph _DUMMY_EAGER_GRAPH = new _DummyEagerGraph(); | |||
public static _DummyEagerGraph _DUMMY_EAGER_GRAPH = new _DummyEagerGraph(); | |||
public BackendImpl() | |||
{ | |||
} | |||
public static void track_variable(IVariableV1 v) | |||
public void track_variable(IVariableV1 v) | |||
{ | |||
var graph = v.Graph; | |||
_GRAPH_VARIABLES[graph.graph_key] = v; | |||
} | |||
public static Tensor placeholder(int[] shape = null, | |||
public Tensor placeholder(TensorShape shape = null, | |||
int ndim = -1, | |||
TF_DataType dtype = TF_DataType.DtInvalid, | |||
bool sparse = false, | |||
string name = null) | |||
string name = null, | |||
bool ragged = false) | |||
{ | |||
if (sparse) | |||
{ | |||
@@ -65,16 +71,16 @@ namespace Tensorflow.Keras | |||
} | |||
else | |||
{ | |||
return gen_array_ops.placeholder(dtype: dtype, shape: new TensorShape(shape), name: name); | |||
return array_ops.placeholder(dtype: dtype, shape: shape, name: name); | |||
} | |||
} | |||
public static Graph get_graph() | |||
public Graph get_graph() | |||
{ | |||
return ops.get_default_graph(); | |||
} | |||
public static int get_uid(string prefix, string @namespace = "") | |||
public int get_uid(string prefix, string @namespace = "") | |||
{ | |||
var graph = tf.get_default_graph(); | |||
if (!PER_GRAPH_LAYER_NAME_UIDS.ContainsKey(graph)) | |||
@@ -83,7 +89,7 @@ namespace Tensorflow.Keras | |||
return PER_GRAPH_LAYER_NAME_UIDS[graph][(@namespace, prefix)]; | |||
} | |||
public static int get_uid((string, string) name) | |||
public int get_uid((string, string) name) | |||
{ | |||
var graph = tf.get_default_graph(); | |||
if (!PER_GRAPH_LAYER_NAME_UIDS.ContainsKey(graph)) | |||
@@ -92,21 +98,21 @@ namespace Tensorflow.Keras | |||
return PER_GRAPH_LAYER_NAME_UIDS[graph][name]; | |||
} | |||
public static void reset_uids() => PER_GRAPH_LAYER_NAME_UIDS = new Dictionary<Graph, Dictionary<(string, string), int>>(); | |||
public static void clear_session() | |||
public void reset_uids() => PER_GRAPH_LAYER_NAME_UIDS = new Dictionary<Graph, Dictionary<(string, string), int>>(); | |||
public void clear_session() | |||
{ | |||
ops.reset_default_graph(); | |||
reset_uids(); | |||
_SESSION = null; | |||
ops.set_default_session(tf.Session(ops.get_default_graph())); | |||
var phase = tf.placeholder_with_default(false, new int[] { }, name: "keras_learning_phase"); | |||
_GRAPH_LEARNING_PHASES = new Dictionary<Graph, GraphLearningPhase>(); | |||
_GRAPH_LEARNING_PHASES[tf.get_default_graph()] = 0; | |||
} | |||
public static void manual_variable_initialization(bool value) | |||
public void manual_variable_initialization(bool value) | |||
{ | |||
_MANUAL_VAR_INIT = value; | |||
} | |||
public static GraphLearningPhase learning_phase() | |||
public GraphLearningPhase learning_phase() | |||
{ | |||
var graph = tf.get_default_graph(); | |||
if (_GRAPH_LEARNING_PHASES.ContainsKey(graph)) | |||
@@ -116,7 +122,7 @@ namespace Tensorflow.Keras | |||
} | |||
return _GRAPH_LEARNING_PHASES[graph]; | |||
} | |||
public static void set_learning_phase(bool value) | |||
public void set_learning_phase(bool value) | |||
{ | |||
_GRAPH_LEARNING_PHASES[tf.get_default_graph()] = (GraphLearningPhase)((value) ? 1 : 0); | |||
} |
@@ -1,15 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace Tensorflow.Keras.Engine | |||
{ | |||
/// <summary> | |||
/// A layer is a callable object that takes as input one or more tensors and | |||
/// that outputs one or more tensors. | |||
/// </summary> | |||
public interface ILayer | |||
{ | |||
Tensor Apply(Tensor inputs, bool is_training = false); | |||
} | |||
} |
@@ -31,20 +31,22 @@ namespace Tensorflow.Keras.Engine | |||
/// A layer is a class implementing common neural networks operations, such | |||
/// as convolution, batch norm, etc. These operations require managing weights, | |||
/// losses, updates, and inter-layer connectivity. | |||
/// | |||
/// tensorflow\python\keras\engine\base_layer.py | |||
/// </summary> | |||
public class Layer : AutoTrackable, ILayer | |||
public abstract class Layer : AutoTrackable | |||
{ | |||
protected LayerArgs _args; | |||
/// <summary> | |||
/// Arguments initialize layer. | |||
/// </summary> | |||
LayerArgs args; | |||
/// <summary> | |||
/// Indicates whether `build` needs to be called upon layer call, to create | |||
/// the layer's weights. | |||
/// </summary> | |||
protected bool built; | |||
protected bool trainable; | |||
public TF_DataType _dtype; | |||
public bool Trainable => args.Trainable; | |||
public TF_DataType DType => args.DType; | |||
/// <summary> | |||
/// A stateful layer is a layer whose updates are run during inference too, | |||
/// for instance stateful RNNs. | |||
@@ -53,53 +55,53 @@ namespace Tensorflow.Keras.Engine | |||
/// <summary> | |||
/// Provides information about which inputs are compatible with the layer. | |||
/// </summary> | |||
protected InputSpec input_spec; | |||
protected bool supports_masking; | |||
protected List<IVariableV1> _trainable_weights; | |||
public List<IVariableV1> trainable_variables => _trainable_weights; | |||
protected List<IVariableV1> _non_trainable_weights; | |||
private string _name; | |||
public string name => _name; | |||
protected string _base_name; | |||
protected bool _compute_previous_mask; | |||
protected List<Operation> _updates; | |||
public int[] _batch_input_shape; | |||
private List<Node> _inbound_nodes; | |||
public List<Node> inbound_nodes => _inbound_nodes; | |||
#pragma warning disable CS0649 // Field 'Layer._outbound_nodes' is never assigned to, and will always have its default value null | |||
private List<Node> _outbound_nodes; | |||
#pragma warning restore CS0649 // Field 'Layer._outbound_nodes' is never assigned to, and will always have its default value null | |||
public List<Node> outbound_nodes => _outbound_nodes; | |||
#pragma warning disable CS0169 // The field 'Layer._initial_weights' is never used | |||
float _initial_weights; | |||
#pragma warning restore CS0169 // The field 'Layer._initial_weights' is never used | |||
ThreadLocal<CallContext> _call_context; | |||
public CallContext CallContext => _call_context.Value; | |||
protected InputSpec inputSpec; | |||
public bool SupportsMasking { get; set; } | |||
protected List<IVariableV1> trainableWeights; | |||
public List<IVariableV1> TrainableVariables => trainableWeights; | |||
protected List<IVariableV1> nonTrainableWeights; | |||
string name; | |||
public string Name => name; | |||
protected string baseName; | |||
protected bool computePreviousMask; | |||
protected List<Operation> updates; | |||
public TensorShape BatchInputShape => args.BatchInputShape; | |||
List<Node> inboundNodes; | |||
public List<Node> InboundNodes => inboundNodes; | |||
List<Node> outboundNodes; | |||
public List<Node> OutboundNodes => outboundNodes; | |||
ThreadLocal<CallContext> callContext; | |||
public CallContext CallContext => callContext.Value; | |||
public Layer(LayerArgs args) | |||
{ | |||
_args = args; | |||
this.args = args; | |||
// A stateful layer is a layer whose updates are run during inference too, | |||
// for instance stateful RNNs. | |||
stateful = false; | |||
// Indicates whether `build` needs to be called upon layer call, to create | |||
// the layer's weights. | |||
built = false; | |||
this.supports_masking = false; | |||
this.SupportsMasking = false; | |||
_init_set_name(name); | |||
_trainable_weights = new List<IVariableV1>(); | |||
_non_trainable_weights = new List<IVariableV1>(); | |||
_compute_previous_mask = false; | |||
_updates = new List<Operation>(); | |||
trainableWeights = new List<IVariableV1>(); | |||
nonTrainableWeights = new List<IVariableV1>(); | |||
computePreviousMask = false; | |||
updates = new List<Operation>(); | |||
inboundNodes = new List<Node>(); | |||
// Manage input shape information if passed. | |||
_inbound_nodes = new List<Node>(); | |||
if(args.BatchInputShape == null && args.InputShape != null) | |||
{ | |||
args.BatchInputShape = new int[] { args.BatchSize }.Concat(args.InputShape.dims).ToArray(); | |||
} | |||
} | |||
/// <summary> | |||
@@ -108,39 +110,37 @@ namespace Tensorflow.Keras.Engine | |||
/// <param name="input"></param> | |||
/// <param name="is_training"></param> | |||
/// <returns></returns> | |||
public Tensor Apply(Tensor input, bool is_training = false) | |||
public Tensor Apply(Tensor[] inputs, bool is_training = false) | |||
{ | |||
var input_list = new Tensor[] { input }; | |||
if (_call_context == null) | |||
_call_context = new ThreadLocal<CallContext>() | |||
{ | |||
Value = new CallContext() | |||
}; | |||
callContext = callContext ?? new ThreadLocal<CallContext>() | |||
{ | |||
Value = new CallContext() | |||
}; | |||
using var ctxManager = CallContext.enter(); | |||
string name_scope = ""; | |||
if (tf.context.executing_eagerly()) | |||
string nameScope = ""; | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
name_scope = _name; | |||
nameScope = name; | |||
} | |||
else | |||
{ | |||
throw new NotImplementedException(""); | |||
} | |||
tf_with(ops.name_scope(name_scope), scope => | |||
tf_with(ops.name_scope(nameScope), scope => | |||
{ | |||
if (!built) | |||
_maybe_build(input); | |||
MaybeBuild(inputs); | |||
call(input, is_training: is_training); | |||
call(inputs, is_training: is_training); | |||
}); | |||
throw new NotImplementedException(""); | |||
} | |||
[Obsolete("User Apply()")] | |||
public Tensor[] __call__(Tensor[] inputs, | |||
Tensor training = null, | |||
Tensor state = null, | |||
@@ -173,14 +173,14 @@ namespace Tensorflow.Keras.Engine | |||
{ | |||
// Symbolic execution on symbolic tensors. We will attempt to build | |||
// the corresponding TF subgraph inside `backend.get_graph()` | |||
var graph = backend.get_graph().as_default(); | |||
var graph = tf.keras.backend.get_graph().as_default(); | |||
tf_with(ops.name_scope(_name_scope()), delegate | |||
{ | |||
// Build layer if applicable (if the `build` method has been | |||
// overridden). | |||
_maybe_build(inputs[0]); | |||
MaybeBuild(inputs); | |||
outputs = call(inputs[0], | |||
outputs = call(inputs, | |||
// training: training, | |||
state: state); | |||
@@ -217,25 +217,25 @@ namespace Tensorflow.Keras.Engine | |||
return null; | |||
} | |||
protected virtual Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected virtual Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
throw new NotImplementedException(""); | |||
} | |||
protected virtual string _name_scope() | |||
{ | |||
return name; | |||
return Name; | |||
} | |||
protected void _maybe_build(Tensor input) | |||
protected void MaybeBuild(Tensor[] inputs) | |||
{ | |||
// Check input assumptions set before layer building, e.g. input rank. | |||
if (built) | |||
return; | |||
if (_dtype == TF_DataType.DtInvalid) | |||
_dtype = input.dtype; | |||
if (DType == TF_DataType.DtInvalid) | |||
args.DType = inputs[0].dtype; | |||
var input_shapes = input.TensorShape; | |||
var input_shapes = inputs[0].TensorShape; | |||
build(input_shapes); | |||
built = true; | |||
} | |||
@@ -246,7 +246,7 @@ namespace Tensorflow.Keras.Engine | |||
} | |||
protected virtual IVariableV1 add_weight(string name, | |||
int[] shape, | |||
TensorShape shape, | |||
TF_DataType dtype = TF_DataType.DtInvalid, | |||
IInitializer initializer = null, | |||
bool? trainable = null, | |||
@@ -267,10 +267,10 @@ namespace Tensorflow.Keras.Engine | |||
else if (dtype.is_integer()) | |||
initializer = tf.zeros_initializer; | |||
else | |||
throw new ValueError($"An initializer for variable {name} of type {dtype.as_base_dtype()} is required for layer {this.name}"); | |||
throw new ValueError($"An initializer for variable {name} of type {dtype.as_base_dtype()} is required for layer {this.Name}"); | |||
} | |||
var variable = _add_variable_with_custom_getter(new VariableArgs | |||
var args = new VariableArgs | |||
{ | |||
Name = name, | |||
Shape = shape, | |||
@@ -279,13 +279,14 @@ namespace Tensorflow.Keras.Engine | |||
Overwrite = true, | |||
Initializer = initializer, | |||
Trainable = trainable.Value | |||
}); | |||
}; | |||
var variable = _add_variable_with_custom_getter(args); | |||
//backend.track_variable(variable); | |||
if (trainable == true) | |||
_trainable_weights.Add(variable); | |||
trainableWeights.Add(variable); | |||
else | |||
_non_trainable_weights.Add(variable); | |||
nonTrainableWeights.Add(variable); | |||
return variable; | |||
} | |||
@@ -293,17 +294,16 @@ namespace Tensorflow.Keras.Engine | |||
protected virtual void add_update(Tensor[] updates, bool inputs = false) | |||
{ | |||
var updates_op = updates.Select(x => x.op).ToArray(); | |||
_updates.AddRange(updates_op); | |||
this.updates.AddRange(updates_op); | |||
} | |||
// Determine layer name (non-unique). | |||
protected virtual void _init_set_name(string name, bool zero_based = true) | |||
{ | |||
var base_name = name; | |||
_name = name; | |||
this.name = name; | |||
if (name == null) | |||
(_name, base_name) = _make_unique_name(); | |||
_base_name = base_name; | |||
(this.name, baseName) = _make_unique_name(); | |||
} | |||
protected virtual (string, string) _make_unique_name() | |||
@@ -0,0 +1,61 @@ | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using Tensorflow.Keras.ArgsDefinition; | |||
using Tensorflow.Keras.Layers; | |||
namespace Tensorflow.Keras.Engine | |||
{ | |||
/// <summary> | |||
/// A `Node` describes the connectivity between two layers. | |||
/// | |||
/// Each time a layer is connected to some new input, | |||
/// a node is added to `layer._inbound_nodes`. | |||
/// Each time the output of a layer is used by another layer, | |||
/// a node is added to `layer._outbound_nodes`. | |||
/// </summary> | |||
public class Node | |||
{ | |||
NodeArgs args; | |||
public int[] node_indices; | |||
public int[] tensor_indices; | |||
public Tensor[] input_tensors; | |||
public Tensor[] Outputs => args.Outputs; | |||
public TensorShape[] input_shapes; | |||
public TensorShape[] output_shapes; | |||
List<Layer> kerasInputs; | |||
public Node(InputLayer layer, NodeArgs args) | |||
{ | |||
this.args = args; | |||
kerasInputs = new List<Layer>(); | |||
// Wire up Node to Layers. | |||
layer.InboundNodes.Add(this); | |||
foreach (var input in kerasInputs) | |||
{ | |||
if (input != null) | |||
input.OutboundNodes.Add(this); | |||
} | |||
// Set metadata on outputs. | |||
} | |||
} | |||
} |
@@ -16,6 +16,7 @@ | |||
using Tensorflow.Keras.ArgsDefinition; | |||
using Tensorflow.Keras.Layers; | |||
using static Tensorflow.Binding; | |||
namespace Tensorflow.Keras.Engine | |||
{ | |||
@@ -28,11 +29,21 @@ namespace Tensorflow.Keras.Engine | |||
Tensor[] outputs; | |||
#pragma warning restore CS0169 // The field 'Sequential.outputs' is never used | |||
public Sequential(string name = null) | |||
bool computeOutputAndMaskJointly; | |||
bool autoTrackSubLayers; | |||
TensorShape inferredInputShape; | |||
bool hasExplicitInputShape; | |||
TF_DataType inputDType; | |||
Layer[] layers; | |||
public Sequential(Layer[] layers = null, string name = null) | |||
: base(new ModelArgs { Name = name}) | |||
{ | |||
supports_masking = true; | |||
// _compute_output_and_mask_jointly = true; | |||
this.layers = layers ?? new Layer[0]; | |||
SupportsMasking = true; | |||
computeOutputAndMaskJointly = true; | |||
autoTrackSubLayers = false; | |||
hasExplicitInputShape = false; | |||
} | |||
public void __enter__() | |||
@@ -48,27 +59,26 @@ namespace Tensorflow.Keras.Engine | |||
{ | |||
built = false; | |||
var set_inputs = false; | |||
//if(_layers.Count == 0) | |||
if(layers.Length == 0) | |||
{ | |||
if(layer is InputLayer) | |||
{ | |||
set_inputs = true; | |||
} | |||
else | |||
{ | |||
var (batch_shape, dtype) = (layer._batch_input_shape, layer._dtype); | |||
if (batch_shape != null) | |||
if (layer.BatchInputShape != null) | |||
{ | |||
// Instantiate an input layer. | |||
var x = keras.layers.Input( | |||
batch_shape: batch_shape, | |||
dtype: dtype, | |||
name: layer.name + "_input"); | |||
var x = tf.keras.Input( | |||
batch_shape: layer.BatchInputShape, | |||
dtype: layer.DType, | |||
name: layer.Name + "_input"); | |||
// This will build the current layer | |||
// and create the node connecting the current layer | |||
// to the input layer we just created. | |||
layer.__call__(x); | |||
layer.Apply(x); | |||
set_inputs = true; | |||
} | |||
} | |||
@@ -1,11 +1,12 @@ | |||
using System; | |||
using System.Data; | |||
using System.Linq; | |||
using Tensorflow.Keras; | |||
using Tensorflow.Keras.ArgsDefinition; | |||
using Tensorflow.Keras.Datasets; | |||
using Tensorflow.Keras.Engine; | |||
using Tensorflow.Keras.Layers; | |||
using Tensorflow.Operations.Activation; | |||
using static Tensorflow.Binding; | |||
namespace Tensorflow | |||
{ | |||
@@ -14,15 +15,56 @@ namespace Tensorflow | |||
public KerasDataset datasets { get; } = new KerasDataset(); | |||
public Initializers initializers { get; } = new Initializers(); | |||
public Layers layers { get; } = new Layers(); | |||
public Activations activations { get; } = new Activations(); | |||
public BackendImpl backend { get; } = new BackendImpl(); | |||
public Sequential Sequential() | |||
=> new Sequential(); | |||
public Tensor[] Input(int[] batch_shape = null, | |||
int batch_size = -1, | |||
TF_DataType dtype = TF_DataType.DtInvalid, | |||
string name = null, | |||
bool sparse = false, | |||
bool ragged = false, | |||
Tensor tensor = null) | |||
{ | |||
var args = new InputLayerArgs | |||
{ | |||
Name = name, | |||
BatchInputShape = batch_shape, | |||
BatchSize = batch_size, | |||
DType = dtype, | |||
Sparse = sparse, | |||
Ragged = ragged, | |||
InputTensor = tensor | |||
}; | |||
var layer = new InputLayer(args); | |||
return layer.InboundNodes[0].Outputs; | |||
} | |||
public static Embedding Embedding(int input_dim, | |||
int output_dim, | |||
IInitializer embeddings_initializer = null, | |||
bool mask_zero = false) | |||
=> new Embedding(input_dim, | |||
output_dim, | |||
embeddings_initializer, | |||
mask_zero); | |||
public class Layers | |||
{ | |||
public ILayer Dense(int units, | |||
IActivation activation = null) | |||
public Layer Dense(int units, | |||
Activation activation = null, | |||
TensorShape input_shape = null) | |||
=> new Dense(new DenseArgs | |||
{ | |||
Units = units, | |||
Activation = activation | |||
Activation = activation ?? tf.keras.activations.Linear, | |||
InputShape = input_shape | |||
}); | |||
} | |||
} | |||
@@ -80,7 +80,7 @@ namespace Tensorflow.Keras.Layers | |||
this.moving_variance_initializer = moving_variance_initializer; | |||
this.renorm = renorm; | |||
this.fused = true; | |||
this.supports_masking = true; | |||
this.SupportsMasking = true; | |||
this._bessels_correction_test_only = true; | |||
} | |||
@@ -95,7 +95,7 @@ namespace Tensorflow.Keras.Layers | |||
if (Enumerable.SequenceEqual(axis, new int[] { 3 })) | |||
_data_format = "NHWC"; | |||
var param_dtype = _dtype == TF_DataType.DtInvalid ? TF_DataType.TF_FLOAT : _dtype; | |||
var param_dtype = DType == TF_DataType.DtInvalid ? TF_DataType.TF_FLOAT : DType; | |||
var param_shape = new int[] { input_shape.dims[axis[0]] }; | |||
if (scale) | |||
@@ -143,14 +143,14 @@ namespace Tensorflow.Keras.Layers | |||
built = true; | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
Tensor outputs = null; | |||
if (fused) | |||
{ | |||
Tensor training = tf.convert_to_tensor(is_training); | |||
outputs = _fused_batch_norm(inputs, training: training); | |||
outputs = _fused_batch_norm(inputs[0], training: training); | |||
return new[] { outputs, outputs }; | |||
} | |||
@@ -65,7 +65,7 @@ namespace Tensorflow.Keras.Layers | |||
this.use_bias = use_bias; | |||
this.kernel_initializer = kernel_initializer; | |||
this.bias_initializer = bias_initializer; | |||
input_spec = new InputSpec(ndim: rank + 2); | |||
inputSpec = new InputSpec(ndim: rank + 2); | |||
} | |||
protected override void build(TensorShape input_shape) | |||
@@ -79,17 +79,17 @@ namespace Tensorflow.Keras.Layers | |||
shape: kernel_shape, | |||
initializer: kernel_initializer, | |||
trainable: true, | |||
dtype: _dtype); | |||
dtype: DType); | |||
if (use_bias) | |||
bias = (RefVariable)add_weight(name: "bias", | |||
shape: new int[] { filters }, | |||
initializer: bias_initializer, | |||
trainable: true, | |||
dtype: _dtype); | |||
dtype: DType); | |||
var axes = new Dictionary<int, int>(); | |||
axes.Add(-1, input_dim); | |||
input_spec = new InputSpec(ndim: rank + 2, axes: axes); | |||
inputSpec = new InputSpec(ndim: rank + 2, axes: axes); | |||
string op_padding; | |||
if (padding == "causal") | |||
@@ -108,9 +108,9 @@ namespace Tensorflow.Keras.Layers | |||
built = true; | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool training = false, Tensor state = null) | |||
{ | |||
var outputs = _convolution_op.__call__(inputs, kernel); | |||
var outputs = _convolution_op.__call__(inputs[0], kernel); | |||
if (use_bias) | |||
{ | |||
if (data_format == "channels_first") | |||
@@ -29,19 +29,16 @@ namespace Tensorflow.Keras.Layers | |||
/// </summary> | |||
public class Dense : Layer | |||
{ | |||
protected int units; | |||
protected IActivation activation; | |||
protected bool use_bias; | |||
protected IInitializer kernel_initializer; | |||
protected IInitializer bias_initializer; | |||
DenseArgs args; | |||
protected IVariableV1 kernel; | |||
protected IVariableV1 bias; | |||
public Dense(DenseArgs args) : | |||
base(args) | |||
{ | |||
this.supports_masking = true; | |||
this.input_spec = new InputSpec(min_ndim: 2); | |||
this.args = args; | |||
this.SupportsMasking = true; | |||
this.inputSpec = new InputSpec(min_ndim: 2); | |||
} | |||
protected override void build(TensorShape input_shape) | |||
@@ -49,41 +46,41 @@ namespace Tensorflow.Keras.Layers | |||
var last_dim = input_shape.dims.Last(); | |||
var axes = new Dictionary<int, int>(); | |||
axes[-1] = last_dim; | |||
input_spec = new InputSpec(min_ndim: 2, axes: axes); | |||
inputSpec = new InputSpec(min_ndim: 2, axes: axes); | |||
kernel = add_weight( | |||
"kernel", | |||
shape: new int[] { last_dim, units }, | |||
initializer: kernel_initializer, | |||
dtype: _dtype, | |||
shape: new TensorShape(last_dim, args.Units), | |||
initializer: args.KernelInitializer, | |||
dtype: DType, | |||
trainable: true); | |||
if (use_bias) | |||
if (args.UseBias) | |||
bias = add_weight( | |||
"bias", | |||
shape: new int[] { units }, | |||
initializer: bias_initializer, | |||
dtype: _dtype, | |||
shape: new TensorShape(args.Units), | |||
initializer: args.BiasInitializer, | |||
dtype: DType, | |||
trainable: true); | |||
built = true; | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool training = false, Tensor state = null) | |||
{ | |||
Tensor outputs = null; | |||
var rank = inputs.rank; | |||
var rank = inputs[0].rank; | |||
if(rank > 2) | |||
{ | |||
throw new NotImplementedException("call rank > 2"); | |||
} | |||
else | |||
{ | |||
outputs = gen_math_ops.mat_mul(inputs, kernel.Handle); | |||
outputs = gen_math_ops.mat_mul(inputs[0], kernel.Handle); | |||
} | |||
if (use_bias) | |||
if (args.UseBias) | |||
outputs = tf.nn.bias_add(outputs, bias); | |||
if (activation != null) | |||
outputs = activation.Activate(outputs); | |||
//if (args.Activation != null) | |||
//outputs = args.Activation.Activate(outputs); | |||
return new[] { outputs, outputs }; | |||
} | |||
@@ -45,7 +45,7 @@ namespace Tensorflow.Keras.Layers | |||
this.output_dim = output_dim; | |||
this.embeddings_initializer = embeddings_initializer == null ? tf.uniform_initializer : embeddings_initializer; | |||
this.mask_zero = mask_zero; | |||
supports_masking = mask_zero; | |||
SupportsMasking = mask_zero; | |||
this.input_length = input_length; | |||
} | |||
@@ -57,13 +57,13 @@ namespace Tensorflow.Keras.Layers | |||
built = true; | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
var dtype = inputs.dtype; | |||
var dtype = inputs[0].dtype; | |||
if (dtype != tf.int32 && dtype != tf.int64) | |||
inputs = math_ops.cast(inputs, tf.int32); | |||
inputs[0] = math_ops.cast(inputs[0], tf.int32); | |||
var @out = embedding_ops.embedding_lookup(embeddings, inputs); | |||
var @out = embedding_ops.embedding_lookup(embeddings, inputs[0]); | |||
return new[] { @out, @out }; | |||
} | |||
} | |||
@@ -17,8 +17,10 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using Tensorflow.Framework.Models; | |||
using Tensorflow.Keras.ArgsDefinition; | |||
using Tensorflow.Keras.Engine; | |||
using static Tensorflow.Binding; | |||
namespace Tensorflow.Keras.Layers | |||
{ | |||
@@ -27,82 +29,68 @@ namespace Tensorflow.Keras.Layers | |||
/// </summary> | |||
public class InputLayer : Layer | |||
{ | |||
public bool sparse; | |||
public int? batch_size; | |||
public bool is_placeholder; | |||
InputLayerArgs args; | |||
bool isPlaceholder; | |||
TensorSpec typeSpec; | |||
public InputLayer(int[] input_shape = null, | |||
int[] batch_input_shape = null, | |||
int? batch_size = null, | |||
TF_DataType dtype = TF_DataType.DtInvalid, | |||
string name = null, | |||
bool sparse = false, | |||
Tensor input_tensor = null) : | |||
base(new LayerArgs | |||
{ | |||
DType = dtype, Name = name | |||
}) | |||
public InputLayer(InputLayerArgs args) : | |||
base(args) | |||
{ | |||
this.args = args; | |||
built = true; | |||
this.sparse = sparse; | |||
this.batch_size = batch_size; | |||
this.supports_masking = true; | |||
this.SupportsMasking = true; | |||
if(batch_input_shape != null) | |||
if(BatchInputShape != null) | |||
{ | |||
batch_size = batch_input_shape[0]; | |||
input_shape = batch_input_shape.Skip(1).ToArray(); | |||
args.BatchSize = BatchInputShape.dims[0]; | |||
args.InputShape = BatchInputShape.dims[1..]; | |||
} | |||
// moved to base class | |||
if (string.IsNullOrEmpty(name)) | |||
if (string.IsNullOrEmpty(Name)) | |||
{ | |||
var prefix = "input"; | |||
name = prefix + '_' + backend.get_uid(prefix); | |||
args.Name = prefix + '_' + tf.keras.backend.get_uid(prefix); | |||
} | |||
if (input_tensor == null) | |||
if (args.InputTensor == null) | |||
{ | |||
if(input_shape != null) | |||
if(args.InputShape != null) | |||
{ | |||
var dims = new List<int> { batch_size.HasValue ? batch_size.Value : -1 }; | |||
dims.AddRange(input_shape); | |||
batch_input_shape = dims.ToArray(); | |||
args.BatchInputShape = new int[] { args.BatchSize } | |||
.Concat(args.InputShape.dims) | |||
.ToArray(); | |||
} | |||
else | |||
{ | |||
batch_input_shape = null; | |||
args.BatchInputShape = null; | |||
} | |||
var graph = backend.get_graph().as_default(); | |||
// In graph mode, create a graph placeholder to call the layer on. | |||
if (sparse) | |||
{ | |||
throw new NotImplementedException("InputLayer sparse is true"); | |||
} | |||
else | |||
{ | |||
input_tensor = backend.placeholder( | |||
shape: batch_input_shape, | |||
dtype: dtype, | |||
name: name); | |||
} | |||
tf.Context.graph_mode(); | |||
args.InputTensor = tf.keras.backend.placeholder( | |||
shape: BatchInputShape, | |||
dtype: DType, | |||
name: Name, | |||
sparse: args.Sparse); | |||
tf.Context.eager_mode(); | |||
is_placeholder = true; | |||
_batch_input_shape = batch_input_shape; | |||
isPlaceholder = true; | |||
} | |||
// Create an input node to add to self.outbound_node | |||
// and set output_tensors' _keras_history. | |||
// input_tensor._keras_history = base_layer.KerasHistory(self, 0, 0) | |||
// input_tensor._keras_mask = None | |||
new Node(this, | |||
inbound_layers: new Layer[0], | |||
node_indices: new int[0], | |||
tensor_indices: new int[0], | |||
input_tensors: new Tensor[] { input_tensor }, | |||
output_tensors: new Tensor[] { input_tensor }); | |||
new Node(this, new NodeArgs | |||
{ | |||
InputTensors = new Tensor[] { args.InputTensor }, | |||
Outputs = new Tensor[] { args.InputTensor } | |||
}); | |||
typeSpec = new TensorSpec(args.InputTensor.TensorShape, | |||
dtype: args.InputTensor.dtype, | |||
name: Name); | |||
} | |||
} | |||
} |
@@ -1,85 +0,0 @@ | |||
/***************************************************************************** | |||
Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
Licensed under the Apache License, Version 2.0 (the "License"); | |||
you may not use this file except in compliance with the License. | |||
You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
******************************************************************************/ | |||
using System.Linq; | |||
using Tensorflow.Keras.Engine; | |||
namespace Tensorflow.Keras.Layers | |||
{ | |||
/// <summary> | |||
/// A `Node` describes the connectivity between two layers. | |||
/// </summary> | |||
public class Node | |||
{ | |||
public InputLayer outbound_layer; | |||
public Layer[] inbound_layers; | |||
public int[] node_indices; | |||
public int[] tensor_indices; | |||
public Tensor[] input_tensors; | |||
public Tensor[] output_tensors; | |||
public int[][] input_shapes; | |||
public int[][] output_shapes; | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="outbound_layer"> | |||
/// the layer that takes | |||
/// `input_tensors` and turns them into `output_tensors` | |||
/// (the node gets created when the `call` | |||
/// method of the layer was called). | |||
/// </param> | |||
/// <param name="inbound_layers"> | |||
/// a list of layers, the same length as `input_tensors`, | |||
/// the layers from where `input_tensors` originate. | |||
/// </param> | |||
/// <param name="node_indices"> | |||
/// a list of integers, the same length as `inbound_layers`. | |||
/// `node_indices[i]` is the origin node of `input_tensors[i]` | |||
/// (necessary since each inbound layer might have several nodes, | |||
/// e.g. if the layer is being shared with a different data stream). | |||
/// </param> | |||
/// <param name="tensor_indices"></param> | |||
/// <param name="input_tensors">list of input tensors.</param> | |||
/// <param name="output_tensors">list of output tensors.</param> | |||
public Node(InputLayer outbound_layer, | |||
Layer[] inbound_layers, | |||
int[] node_indices, | |||
int[] tensor_indices, | |||
Tensor[] input_tensors, | |||
Tensor[] output_tensors) | |||
{ | |||
this.outbound_layer = outbound_layer; | |||
this.inbound_layers = inbound_layers; | |||
this.node_indices = node_indices; | |||
this.tensor_indices = tensor_indices; | |||
this.input_tensors = input_tensors; | |||
this.output_tensors = output_tensors; | |||
input_shapes = input_tensors.Select(x => x._shape_tuple()).ToArray(); | |||
output_shapes = output_tensors.Select(x => x._shape_tuple()).ToArray(); | |||
// Add nodes to all layers involved. | |||
foreach (var layer in inbound_layers) | |||
{ | |||
if (layer != null) | |||
layer.outbound_nodes.Add(this); | |||
} | |||
outbound_layer.inbound_nodes.Add(this); | |||
} | |||
} | |||
} |
@@ -45,7 +45,7 @@ namespace Tensorflow.Keras.Layers | |||
this.input_spec = new InputSpec(ndim: 4); | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
int[] pool_shape; | |||
if (data_format == "channels_last") | |||
@@ -60,7 +60,7 @@ namespace Tensorflow.Keras.Layers | |||
} | |||
var outputs = pool_function.Apply( | |||
inputs, | |||
inputs[0], | |||
ksize: pool_shape, | |||
strides: strides, | |||
padding: padding.ToUpper(), | |||
@@ -40,7 +40,7 @@ namespace Tensorflow.Keras.Utils | |||
var variable_dtype = args.DType.as_base_dtype(); | |||
var v = tf.Variable(init_val, | |||
dtype: args.DType, | |||
dtype: variable_dtype, | |||
shape: args.Shape, | |||
name: args.Name, | |||
trainable: args.Trainable, | |||
@@ -94,14 +94,14 @@ namespace Tensorflow.Keras.Utils | |||
{ | |||
var graph = ops.get_default_graph(); | |||
Dictionary<(string, string), int> name_uid_map = null; | |||
if (backend.PER_GRAPH_LAYER_NAME_UIDS.ContainsKey(graph)) | |||
if (tf.keras.backend.PER_GRAPH_LAYER_NAME_UIDS.ContainsKey(graph)) | |||
{ | |||
name_uid_map = backend.PER_GRAPH_LAYER_NAME_UIDS[graph]; | |||
name_uid_map = tf.keras.backend.PER_GRAPH_LAYER_NAME_UIDS[graph]; | |||
} | |||
else | |||
{ | |||
name_uid_map = new Dictionary<(string, string), int>(); | |||
backend.PER_GRAPH_LAYER_NAME_UIDS[graph] = name_uid_map; | |||
tf.keras.backend.PER_GRAPH_LAYER_NAME_UIDS[graph] = name_uid_map; | |||
} | |||
return name_uid_map; | |||
@@ -49,8 +49,8 @@ namespace Tensorflow.Layers | |||
this._reuse = _reuse; | |||
// Avoid an incorrect lint error | |||
_trainable_weights = new List<IVariableV1>(); | |||
_non_trainable_weights = new List<IVariableV1>(); | |||
trainableWeights = new List<IVariableV1>(); | |||
nonTrainableWeights = new List<IVariableV1>(); | |||
this.built = false; | |||
_keras_style = false; | |||
} | |||
@@ -95,7 +95,7 @@ namespace Tensorflow.Layers | |||
// Update global default collections. | |||
_add_elements_to_collection(_updates.ToArray(), new string[] { tf.GraphKeys.UPDATE_OPS }); | |||
_add_elements_to_collection(updates.ToArray(), new string[] { tf.GraphKeys.UPDATE_OPS }); | |||
return outputs; | |||
} | |||
@@ -202,7 +202,7 @@ namespace Tensorflow.Layers | |||
} | |||
else | |||
{ | |||
tf_with(tf.variable_scope(scope, default_name: _base_name), captured_scope => | |||
tf_with(tf.variable_scope(scope, default_name: baseName), captured_scope => | |||
{ | |||
// convert variable_scope to VariableScope | |||
_scope = captured_scope; | |||
@@ -40,7 +40,7 @@ namespace Tensorflow | |||
IActivation activation = null, bool? reuse = null, string name = null, | |||
TF_DataType dtype = TF_DataType.DtInvalid) : base(_reuse: reuse, name: name, dtype: dtype) | |||
{ | |||
input_spec = new InputSpec(ndim: 2); | |||
inputSpec = new InputSpec(ndim: 2); | |||
_num_units = num_units; | |||
_forget_bias = forget_bias; | |||
_state_is_tuple = state_is_tuple; | |||
@@ -74,7 +74,7 @@ namespace Tensorflow | |||
/// <param name="training"></param> | |||
/// <param name="state"></param> | |||
/// <returns></returns> | |||
protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
var one = constant_op.constant(1, dtype: dtypes.int32); | |||
// Parameters of gates are concatenated into one multiply for efficiency. | |||
@@ -87,7 +87,7 @@ namespace Tensorflow | |||
// array_ops.split(value: state, num_or_size_splits: 2, axis: one); | |||
throw new NotImplementedException("BasicLstmCell call"); | |||
} | |||
var gate_inputs = math_ops.matmul(array_ops.concat(new[] { inputs, h }, 1), _kernel as RefVariable); | |||
var gate_inputs = math_ops.matmul(array_ops.concat(new[] { inputs[0], h }, 1), _kernel as RefVariable); | |||
gate_inputs = nn_ops.bias_add(gate_inputs, _bias as RefVariable); | |||
// i = input_gate, j = new_input, f = forget_gate, o = output_gate | |||
@@ -42,7 +42,7 @@ namespace Tensorflow | |||
dtype: dtype) | |||
{ | |||
// Inputs must be 2-dimensional. | |||
input_spec = new InputSpec(ndim: 2); | |||
inputSpec = new InputSpec(ndim: 2); | |||
_num_units = num_units; | |||
if (activation == null) | |||
@@ -67,10 +67,10 @@ namespace Tensorflow | |||
built = true; | |||
} | |||
protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
protected override Tensor[] call(Tensor[] inputs, bool is_training = false, Tensor state = null) | |||
{ | |||
// 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[0], state }, 1); | |||
var gate_inputs = math_ops.matmul(concat, _kernel as RefVariable); | |||
gate_inputs = nn_ops.bias_add(gate_inputs, _bias as RefVariable); | |||
var output = _activation(gate_inputs, null); | |||
@@ -42,7 +42,7 @@ namespace Tensorflow.Operations | |||
/// <returns></returns> | |||
public static Tensor conv2d(Conv2dParams parameters) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Conv2D", name: parameters.Name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("Conv2D", name: parameters.Name, args: new | |||
{ | |||
input = parameters.Input, | |||
filter = parameters.Filter, | |||
@@ -64,7 +64,7 @@ namespace Tensorflow.Operations | |||
/// <returns></returns> | |||
public static Tensor conv2d_backprop_filter(Conv2dParams parameters) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Conv2DBackpropFilter", name: parameters.Name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("Conv2DBackpropFilter", name: parameters.Name, args: new | |||
{ | |||
input = parameters.Input, | |||
filter_sizes = parameters.FilterSizes, | |||
@@ -87,7 +87,7 @@ namespace Tensorflow.Operations | |||
/// <returns></returns> | |||
public static Tensor conv2d_backprop_input(Conv2dParams parameters) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Conv2DBackpropInput", name: parameters.Name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("Conv2DBackpropInput", name: parameters.Name, args: new | |||
{ | |||
input_sizes = parameters.InputSizes, | |||
filter = parameters.Filter, | |||
@@ -111,7 +111,7 @@ namespace Tensorflow.Operations | |||
if (data_format == null) | |||
data_format = "NHWC"; | |||
var _op = tf._op_def_lib._apply_op_helper("BiasAdd", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("BiasAdd", name: name, args: new | |||
{ | |||
value, | |||
bias, | |||
@@ -128,7 +128,7 @@ namespace Tensorflow.Operations | |||
if (data_format == null) | |||
data_format = "NHWC"; | |||
var _op = tf._op_def_lib._apply_op_helper("BiasAddGrad", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("BiasAddGrad", name: name, args: new | |||
{ | |||
out_backprop, | |||
data_format | |||
@@ -154,7 +154,7 @@ namespace Tensorflow.Operations | |||
/// </remarks> | |||
public static Tensor elu(Tensor features, string name = "Elu") | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("Elu", name: name, args: new { features }); | |||
var op = tf.OpDefLib._apply_op_helper("Elu", name: name, args: new { features }); | |||
return op.output; | |||
} | |||
@@ -165,7 +165,7 @@ namespace Tensorflow.Operations | |||
/// <returns></returns> | |||
public static Tensor[] fused_batch_norm_grad(FusedBatchNormParams @params) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("FusedBatchNormGrad", name: @params.Name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("FusedBatchNormGrad", name: @params.Name, args: new | |||
{ | |||
y_backprop = @params.YBackprop, | |||
x = @params.X, | |||
@@ -181,7 +181,7 @@ namespace Tensorflow.Operations | |||
public static Tensor[] fused_batch_norm_grad_v3(FusedBatchNormParams @params) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("FusedBatchNormGradV3", name: @params.Name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("FusedBatchNormGradV3", name: @params.Name, args: new | |||
{ | |||
y_backprop = @params.YBackprop, | |||
x = @params.X, | |||
@@ -206,7 +206,7 @@ namespace Tensorflow.Operations | |||
bool is_training = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("FusedBatchNorm", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("FusedBatchNorm", name: name, args: new | |||
{ | |||
x, | |||
scale, | |||
@@ -231,7 +231,7 @@ namespace Tensorflow.Operations | |||
bool is_training = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("FusedBatchNormV3", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("FusedBatchNormV3", name: name, args: new | |||
{ | |||
x, | |||
scale, | |||
@@ -259,7 +259,7 @@ namespace Tensorflow.Operations | |||
public static Tensor local_response_normalization(Tensor input, int depth_radius = 5, int bias = 1, | |||
int alpha = 1, float beta = 0.5f, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("LRN", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("LRN", name: name, args: new | |||
{ | |||
input, | |||
depth_radius, | |||
@@ -273,7 +273,7 @@ namespace Tensorflow.Operations | |||
public static Tensor log_softmax(Tensor logits, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("LogSoftmax", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("LogSoftmax", name: name, args: new | |||
{ | |||
logits | |||
}); | |||
@@ -291,7 +291,7 @@ namespace Tensorflow.Operations | |||
/// <returns>A `Tensor` of type `bool`.</returns> | |||
public static Tensor in_top_kv2(Tensor predictions, Tensor targets, int k, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("InTopKV2", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("InTopKV2", name: name, args: new | |||
{ | |||
predictions, | |||
targets, | |||
@@ -303,7 +303,7 @@ namespace Tensorflow.Operations | |||
public static Tensor leaky_relu(Tensor features, float alpha = 0.2f, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("LeakyRelu", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("LeakyRelu", name: name, args: new | |||
{ | |||
features, | |||
alpha | |||
@@ -319,7 +319,7 @@ namespace Tensorflow.Operations | |||
string data_format = "NHWC", | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("MaxPool", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("MaxPool", name: name, args: new | |||
{ | |||
input, | |||
ksize, | |||
@@ -334,7 +334,7 @@ namespace Tensorflow.Operations | |||
public static Tensor max_pool_grad(Tensor orig_input, Tensor orig_output, Tensor grad, int[] ksize, int[] strides, string padding, | |||
string data_format= "NHWC", string name= null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("MaxPoolGrad", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("MaxPoolGrad", name: name, args: new | |||
{ | |||
orig_input, | |||
orig_output, | |||
@@ -350,7 +350,7 @@ namespace Tensorflow.Operations | |||
public static Tensor[] top_kv2(Tensor input, int k, bool sorted = true, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TopKV2", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("TopKV2", name: name, args: new | |||
{ | |||
input, | |||
k, | |||
@@ -362,9 +362,9 @@ namespace Tensorflow.Operations | |||
public static Tensor relu_grad(Tensor gradients, Tensor features, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ReluGrad", name, | |||
null, | |||
gradients, features); | |||
@@ -372,7 +372,7 @@ namespace Tensorflow.Operations | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ReluGrad", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("ReluGrad", name: name, args: new | |||
{ | |||
gradients, | |||
features | |||
@@ -383,7 +383,7 @@ namespace Tensorflow.Operations | |||
public static Tensor leaky_relu_grad(Tensor gradients, Tensor features, float alpha = 0.2f, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("LeakyReluGrad", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("LeakyReluGrad", name: name, args: new | |||
{ | |||
gradients, | |||
features, | |||
@@ -395,9 +395,9 @@ namespace Tensorflow.Operations | |||
public static Tensor softmax(Tensor logits, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Softmax", name, | |||
null, | |||
logits); | |||
@@ -405,7 +405,7 @@ namespace Tensorflow.Operations | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Softmax", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("Softmax", name: name, args: new | |||
{ | |||
logits | |||
}); | |||
@@ -422,7 +422,7 @@ namespace Tensorflow.Operations | |||
/// <returns></returns> | |||
public static (Tensor, Tensor) softmax_cross_entropy_with_logits(Tensor features, Tensor labels, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("SoftmaxCrossEntropyWithLogits", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("SoftmaxCrossEntropyWithLogits", name: name, args: new | |||
{ | |||
features, | |||
labels | |||
@@ -460,7 +460,7 @@ namespace Tensorflow.Operations | |||
/// </remarks> | |||
public static (Tensor loss, Tensor backprop) sparse_softmax_cross_entropy_with_logits(Tensor features, Tensor labels, string name = "SparseSoftmaxCrossEntropyWithLogits") | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("SparseSoftmaxCrossEntropyWithLogits", name: name, args: new { features, labels }); | |||
var op = tf.OpDefLib._apply_op_helper("SparseSoftmaxCrossEntropyWithLogits", name: name, args: new { features, labels }); | |||
int _idx = 0; | |||
var loss = op.outputs[_idx++]; | |||
var backprop = op.outputs[_idx++]; | |||
@@ -475,9 +475,9 @@ namespace Tensorflow.Operations | |||
/// <returns>A `Tensor`. Has the same type as `features`.</returns> | |||
public static Tensor relu(Tensor features, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Relu", name, | |||
null, | |||
features); | |||
@@ -485,15 +485,15 @@ namespace Tensorflow.Operations | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Relu", name: name, args: new { features }); | |||
var _op = tf.OpDefLib._apply_op_helper("Relu", name: name, args: new { features }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor tanh(Tensor x, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Tanh", name, | |||
null, | |||
x); | |||
@@ -501,7 +501,7 @@ namespace Tensorflow.Operations | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Tanh", name: name, args: new { x }); | |||
var _op = tf.OpDefLib._apply_op_helper("Tanh", name: name, args: new { x }); | |||
return _op.outputs[0]; | |||
} | |||
} | |||
@@ -31,8 +31,8 @@ namespace Tensorflow | |||
public int InputListLength(string name) | |||
{ | |||
int num = 0; | |||
num = c_api.TF_OperationInputListLength(_handle, name, tf.status.Handle); | |||
tf.status.Check(true); | |||
num = c_api.TF_OperationInputListLength(_handle, name, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
return num; | |||
} | |||
public int NumInputs => c_api.TF_OperationNumInputs(_handle); | |||
@@ -28,8 +28,8 @@ namespace Tensorflow | |||
public int OutputListLength(string name) | |||
{ | |||
int num = c_api.TF_OperationOutputListLength(_handle, name, tf.status.Handle); | |||
tf.status.Check(true); | |||
int num = c_api.TF_OperationOutputListLength(_handle, name, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
return num; | |||
} | |||
@@ -237,8 +237,8 @@ namespace Tensorflow | |||
lock (Locks.ProcessWide) | |||
{ | |||
using var buf = new Buffer(); | |||
c_api.TF_OperationGetAttrValueProto(_handle, name, buf.Handle, tf.status.Handle); | |||
tf.status.Check(true); | |||
c_api.TF_OperationGetAttrValueProto(_handle, name, buf.Handle, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
x = AttrValue.Parser.ParseFrom(buf.DangerousMemoryBlock.Stream()); | |||
} | |||
@@ -297,9 +297,9 @@ 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(); | |||
tf.Status.Check(); | |||
} | |||
} | |||
@@ -18,6 +18,8 @@ using NumSharp; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Reflection; | |||
using Tensorflow.Contexts; | |||
using Tensorflow.Eager; | |||
using Tensorflow.Framework; | |||
using static Tensorflow.Binding; | |||
@@ -459,7 +461,7 @@ namespace Tensorflow | |||
{ | |||
name = scope; | |||
if (!tf.context.executing_eagerly()) | |||
if (!tf.Context.executing_eagerly()) | |||
{ | |||
var input_tensor = ops.convert_to_tensor(input); | |||
var input_shape = input_tensor.TensorShape; | |||
@@ -607,9 +609,9 @@ namespace Tensorflow | |||
float padding_value = 0, | |||
string align = "RIGHT_LEFT") | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"MatrixDiagV3", name, | |||
null, | |||
diagonal, k, num_rows, num_cols, padding_value, | |||
@@ -626,9 +628,9 @@ namespace Tensorflow | |||
int k = 0, | |||
string align = "RIGHT_LEFT") | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"MatrixSetDiagV3", name, | |||
null, | |||
input, diagonal, k, | |||
@@ -714,24 +716,24 @@ namespace Tensorflow | |||
{ | |||
var size_splits = ops.convert_to_tensor(num_split); | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
return split_eager_fallback(axis, value, num_split: num_split, name: name, ctx: tf.context); | |||
return split_eager_fallback(axis, value, num_split: num_split, name: name, ctx: tf.Context); | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Split", name, new { split_dim = axis, value, num_split }); | |||
var _op = tf.OpDefLib._apply_op_helper("Split", name, new { split_dim = axis, value, num_split }); | |||
return _op.outputs; | |||
} | |||
private static Tensor[] split_eager_fallback<Ta, Tv>(Ta axis, Tv value, int num_split, string name, Context ctx = null) | |||
{ | |||
var (_attr_T, input) = tf._execute.args_to_matching_eager(ctx, args: new object[] { value }); | |||
var (_attr_T, input) = tf.Runner.ArgsToMatchingEager(ctx, args: new object[] { value }); | |||
var axis_tensor = ops.convert_to_tensor(axis, dtype: TF_DataType.TF_INT32); | |||
var _inputs_flat = new List<Tensor> { axis_tensor }; | |||
_inputs_flat.AddRange(input); | |||
var _attrs = new object[] { "num_split", num_split, "T", _attr_T }; | |||
return tf._execute.execute(ctx, "Split", num_split, _inputs_flat.ToArray(), _attrs, name: name); | |||
return tf.Runner.Execute(ctx, "Split", num_split, _inputs_flat.ToArray(), _attrs, name: name); | |||
} | |||
public static Tensor slice<Tb, Ts>(Tensor input, Tb begin, Ts size, string name = null) | |||
@@ -780,9 +782,13 @@ namespace Tensorflow | |||
return result; | |||
} | |||
public static Tensor placeholder(TF_DataType dtype) | |||
public static Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
{ | |||
throw new NotImplementedException("array_ops.placeholder"); | |||
if (tf.Context.executing_eagerly()) | |||
throw new RuntimeError("tf.placeholder() is not compatible with eager execution."); | |||
var _op = tf.OpDefLib._apply_op_helper("Placeholder", name: name, args: new { dtype, shape }); | |||
return _op.output; | |||
} | |||
} | |||
} |
@@ -376,7 +376,7 @@ namespace Tensorflow | |||
{ | |||
return tf_with(ops.name_scope(name, "cond", new { pred }), delegate | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
if (pred.ToArray<bool>()[0]) | |||
return true_fn() as Tensor; | |||
@@ -460,7 +460,7 @@ namespace Tensorflow | |||
{ | |||
return tf_with(ops.name_scope(name, "cond", new { pred }), delegate | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
if (pred.ToArray<bool>()[0]) | |||
return true_fn() as Tensor[]; | |||
@@ -17,9 +17,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public Tensor tensor_slice_dataset(Tensor[] components, TensorShape[] output_shapes, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"TensorSliceDataset", name, | |||
null, | |||
new object[] | |||
@@ -35,9 +35,9 @@ namespace Tensorflow | |||
public Tensor repeat_dataset(Tensor input_dataset, Tensor count, TF_DataType[] output_types, TensorShape[] output_shapes, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"RepeatDataset", name, | |||
null, | |||
input_dataset, count, | |||
@@ -55,9 +55,9 @@ namespace Tensorflow | |||
bool reshuffle_each_iteration = true, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ShuffleDatasetV3", name, | |||
null, | |||
input_dataset, buffer_size, | |||
@@ -73,9 +73,9 @@ namespace Tensorflow | |||
public Tensor dummy_seed_generator(string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"DummySeedGenerator", name, | |||
null); | |||
return results[0]; | |||
@@ -101,9 +101,9 @@ namespace Tensorflow | |||
bool parallel_copy = false, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"BatchDatasetV2", name, | |||
null, | |||
input_dataset, buffer_size, drop_remainder, | |||
@@ -133,9 +133,9 @@ namespace Tensorflow | |||
bool legacy_autotune = true, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"PrefetchDataset", name, | |||
null, | |||
input_dataset, buffer_size, | |||
@@ -162,9 +162,9 @@ namespace Tensorflow | |||
TF_DataType[] output_types, TensorShape[] output_shapes, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"TakeDataset", name, | |||
null, | |||
input_dataset, count, | |||
@@ -194,9 +194,9 @@ namespace Tensorflow | |||
if (optimization_configs == null) | |||
optimization_configs = new string[0]; | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"OptimizeDataset", name, | |||
null, | |||
input_dataset, optimizations, | |||
@@ -224,9 +224,9 @@ namespace Tensorflow | |||
AutotuneAlgorithm algorithm, long cpu_budget, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ModelDataset", name, | |||
null, | |||
input_dataset, | |||
@@ -249,9 +249,9 @@ namespace Tensorflow | |||
/// <returns>A tuple of `Tensor` objects (handle, deleter).</returns> | |||
public (Tensor, Tensor) anonymous_iterator_v2(TF_DataType[] output_types, TensorShape[] output_shapes, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"AnonymousIteratorV2", name, | |||
null, | |||
"output_types", output_types, | |||
@@ -271,9 +271,9 @@ namespace Tensorflow | |||
/// <returns>The created Operation.</returns> | |||
public ITensorOrOperation make_iterator(Tensor dataset, Tensor iterator, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"MakeIterator", name, | |||
null, | |||
dataset, iterator); | |||
@@ -292,9 +292,9 @@ namespace Tensorflow | |||
/// <returns>The created Operation.</returns> | |||
public ITensorOrOperation delete_iterator(Tensor handle, Tensor deleter, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"DeleteIterator", name, | |||
null, | |||
handle, deleter); | |||
@@ -314,9 +314,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public Tensor[] iterator_get_next(Tensor iterator, TF_DataType[] output_types, TensorShape[] output_shapes, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"IteratorGetNext", name, | |||
null, | |||
iterator, | |||
@@ -60,7 +60,7 @@ namespace Tensorflow | |||
var elems_flat = input_flatten(elems); | |||
bool in_graph_mode = tf.context.executing_eagerly(); | |||
bool in_graph_mode = tf.Context.executing_eagerly(); | |||
return tf_with(ops.name_scope(name, "scan", new { elems_flat }), scope => | |||
{ | |||
@@ -19,6 +19,7 @@ using System.Collections.Generic; | |||
using static Tensorflow.Binding; | |||
using Tensorflow.Eager; | |||
using System.Linq; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow | |||
{ | |||
@@ -26,14 +27,14 @@ namespace Tensorflow | |||
{ | |||
public static Tensor batch_to_space_nd<T>(T input, int[] block_shape, int[,] crops, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("BatchToSpaceND", name: name, args: new { input, block_shape, crops }); | |||
var _op = tf.OpDefLib._apply_op_helper("BatchToSpaceND", name: name, args: new { input, block_shape, crops }); | |||
return _op.output; | |||
} | |||
public static Tensor check_numerics(Tensor tensor, string message, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("CheckNumerics", name: name, args: new { tensor, message }); | |||
var _op = tf.OpDefLib._apply_op_helper("CheckNumerics", name: name, args: new { tensor, message }); | |||
return _op.output; | |||
} | |||
@@ -47,9 +48,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor concat_v2<T, Ta>(T[] values, Ta axis, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ConcatV2", name, | |||
null, | |||
values, axis); | |||
@@ -57,35 +58,35 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
return _op.output; | |||
} | |||
public static Tensor concat_v2(Tensor[] values, Tensor axis, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
return concat_v2_eager_fallback(values, axis, name, tf.context); | |||
return concat_v2_eager_fallback(values, axis, name, tf.Context); | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
return _op.output; | |||
} | |||
private static Tensor concat_v2_eager_fallback<T1, T2>(T1[] values, T2 axis, string name, Context ctx) | |||
{ | |||
var _attr_N = len(values); | |||
var (_attr_T, input) = tf._execute.args_to_matching_eager(ctx, args: values.Select(x => (object)x).ToArray()); | |||
var (_attr_Tidx, axis1) = tf._execute.args_to_matching_eager(ctx, default_dtype: tf.int32, args: new object[] { axis }); | |||
var (_attr_T, input) = tf.Runner.ArgsToMatchingEager(ctx, args: values.Select(x => (object)x).ToArray()); | |||
var (_attr_Tidx, axis1) = tf.Runner.ArgsToMatchingEager(ctx, default_dtype: tf.int32, args: new object[] { axis }); | |||
var _inputs_flat = input.concat(axis1); | |||
var _attrs = new object[] { "N", _attr_N, "T", _attr_T, "Tidx", _attr_Tidx }; | |||
return tf._execute.execute(ctx, "ConcatV2", 1, _inputs_flat, _attrs, name: name)[0]; | |||
return tf.Runner.Execute(ctx, "ConcatV2", 1, _inputs_flat, _attrs, name: name)[0]; | |||
} | |||
public static Tensor[] concat_offset(Tensor concat_dim, Tensor[] shape, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ConcatOffset", name: name, args: new { concat_dim, shape }); | |||
var _op = tf.OpDefLib._apply_op_helper("ConcatOffset", name: name, args: new { concat_dim, shape }); | |||
return _op.outputs; | |||
} | |||
@@ -123,9 +124,9 @@ namespace Tensorflow | |||
/// </remarks> | |||
public static Tensor diag(Tensor diagonal, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Diag", name, | |||
null, | |||
diagonal); | |||
@@ -133,16 +134,16 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var op = tf._op_def_lib._apply_op_helper("Diag", name: name, args: new { diagonal }); | |||
var op = tf.OpDefLib._apply_op_helper("Diag", name: name, args: new { diagonal }); | |||
return op.output; | |||
} | |||
public static Tensor expand_dims(Tensor input, int axis, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ExpandDims", name, | |||
null, | |||
input, tf.convert_to_tensor(axis)); | |||
@@ -150,30 +151,30 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ExpandDims", name: name, args: new { input, dim = axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("ExpandDims", name: name, args: new { input, dim = axis }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor gather_v2<T1, T2>(T1 @params, T2 indices, int axis, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("GatherV2", name: name, new { @params, indices, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("GatherV2", name: name, new { @params, indices, axis }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor pad(Tensor input, Tensor paddings, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | |||
var _op = tf.OpDefLib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | |||
return _op.output; | |||
} | |||
public static Tensor pack(Tensor[] values, int axis = 0, string name = null) | |||
{ | |||
if(tf.context.executing_eagerly()) | |||
if(tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Pack", name, | |||
null, | |||
values, | |||
@@ -181,23 +182,10 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Pack", name: name, args: new { values, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("Pack", name: name, args: new { values, axis }); | |||
return _op.output; | |||
} | |||
public static Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Placeholder", name: name, args: new { dtype, shape }); | |||
var _result = _op.outputs; | |||
var _inputs_flat = _op.inputs; | |||
var _attrs = new Dictionary<string, object>(); | |||
_attrs["dtype"] = _op.get_attr("dtype"); | |||
_attrs["shape"] = _op.get_attr("shape"); | |||
return new Tensor(_op, 0, dtype); | |||
} | |||
/// <summary> | |||
/// An identity op that triggers an error if a gradient is requested. | |||
/// </summary> | |||
@@ -226,7 +214,7 @@ namespace Tensorflow | |||
/// </remarks> | |||
public static Tensor prevent_gradient(Tensor input, string message = "", string name = null) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("PreventGradient", name: name, args: new { input, message }); | |||
var op = tf.OpDefLib._apply_op_helper("PreventGradient", name: name, args: new { input, message }); | |||
return op.output; | |||
} | |||
@@ -237,9 +225,9 @@ namespace Tensorflow | |||
/// <param name="name"></param> | |||
public static Tensor identity(Tensor input, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Identity", name, | |||
null, | |||
input); | |||
@@ -247,30 +235,30 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Identity", name, new { input }); | |||
var _op = tf.OpDefLib._apply_op_helper("Identity", name, new { input }); | |||
return _op.output; | |||
} | |||
public static Tensor invert_permutation(Tensor x, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("InvertPermutation", name, new { x }); | |||
var _op = tf.OpDefLib._apply_op_helper("InvertPermutation", name, new { x }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor log(Tensor x, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Log", name: name, args: new { x }); | |||
var _op = tf.OpDefLib._apply_op_helper("Log", name: name, args: new { x }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor rank(Tensor input, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Rank", name, | |||
null, | |||
input); | |||
@@ -278,7 +266,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Rank", name: name, args: new { input }); | |||
var _op = tf.OpDefLib._apply_op_helper("Rank", name: name, args: new { input }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -292,9 +280,9 @@ namespace Tensorflow | |||
/// <returns>A `Tensor`. Has the same type as `value`.</returns> | |||
public static Tensor fill<T>(Tensor dims, T value, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Fill", name, | |||
null, | |||
dims, value); | |||
@@ -302,7 +290,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Fill", name, new { dims, value }); | |||
var _op = tf.OpDefLib._apply_op_helper("Fill", name, new { dims, value }); | |||
return _op.output; | |||
} | |||
@@ -315,9 +303,9 @@ namespace Tensorflow | |||
/// <returns>A tuple of `Tensor` objects (r0, r1).</returns> | |||
public static (Tensor, Tensor) broadcast_gradient_args(Tensor s0, Tensor s1, string name = "") | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"BroadcastGradientArgs", name, | |||
null, | |||
s0,s1); | |||
@@ -325,22 +313,22 @@ namespace Tensorflow | |||
return (results[0], results[1]); | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("BroadcastGradientArgs", name, new { s0, s1 }); | |||
var _op = tf.OpDefLib._apply_op_helper("BroadcastGradientArgs", name, new { s0, s1 }); | |||
return (_op.outputs[0], _op.outputs[1]); | |||
} | |||
public static Tensor reverse<T>(Tensor tensor, T axis, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ReverseV2", name, new { tensor, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("ReverseV2", name, new { tensor, axis }); | |||
return _op.output; | |||
} | |||
public static Tensor reshape<T1, T2>(T1 tensor, T2 shape, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Reshape", name, | |||
null, | |||
tensor, shape); | |||
@@ -348,13 +336,13 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
var _op = tf.OpDefLib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
return _op.output; | |||
} | |||
public static Tensor reshape(Tensor tensor, int[] shape, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
var _op = tf.OpDefLib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -367,7 +355,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static (Tensor, Tensor) unique(Tensor x, TF_DataType out_idx = TF_DataType.TF_INT32, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Unique", name, new { x, out_idx }); | |||
var _op = tf.OpDefLib._apply_op_helper("Unique", name, new { x, out_idx }); | |||
// TODO | |||
//var _result = _UniqueOutput._make(_op.outputs); | |||
return (_op.outputs[0], _op.outputs[1]); | |||
@@ -375,13 +363,13 @@ namespace Tensorflow | |||
public static Tensor[] unpack(Tensor value, int num, int axis = 0, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Unpack", name, new { value, num, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("Unpack", name, new { value, num, axis }); | |||
return _op.outputs; | |||
} | |||
public static Tensor where(Tensor condition, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Where", name, new { input = condition }); | |||
var _op = tf.OpDefLib._apply_op_helper("Where", name, new { input = condition }); | |||
return _op.output; | |||
} | |||
@@ -392,9 +380,9 @@ namespace Tensorflow | |||
int axis = -1, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"OneHot", name, | |||
null, | |||
indices, depth, on_value, off_value, | |||
@@ -403,7 +391,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("OneHot", name, new { indices, depth, on_value, off_value, axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("OneHot", name, new { indices, depth, on_value, off_value, axis }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -416,15 +404,15 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor placeholder_with_default<T>(T input, int[] shape, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("PlaceholderWithDefault", name, new { input, shape, name }); | |||
var _op = tf.OpDefLib._apply_op_helper("PlaceholderWithDefault", name, new { input, shape, name }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor select<Tx, Ty>(Tensor condition, Tx t, Ty e, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"SelectV2", name, | |||
null, | |||
condition, t, e); | |||
@@ -432,21 +420,21 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Select", name, new { condition, t, e }); | |||
var _op = tf.OpDefLib._apply_op_helper("Select", name, new { condition, t, e }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor scatter_nd(Tensor indices, Tensor updates, Tensor[] shape, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ScatterNd", name, new { indices, updates, shape }); | |||
var _op = tf.OpDefLib._apply_op_helper("ScatterNd", name, new { indices, updates, shape }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor shape(Tensor input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Shape", name, | |||
null, | |||
input, | |||
@@ -455,7 +443,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Shape", name, new { input, out_type }); | |||
var _op = tf.OpDefLib._apply_op_helper("Shape", name, new { input, out_type }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -468,13 +456,13 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor[] shape_n(Tensor[] input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ShapeN", name, new { input, out_type }); | |||
var _op = tf.OpDefLib._apply_op_helper("ShapeN", name, new { input, out_type }); | |||
return _op.outputs; | |||
} | |||
public static Tensor size(Tensor input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Size", name, new { input, out_type }); | |||
var _op = tf.OpDefLib._apply_op_helper("Size", name, new { input, out_type }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -488,15 +476,15 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor slice(Tensor input, Tensor begin, Tensor size, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
var _op = tf.OpDefLib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor tile<T>(Tensor input, T multiples, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Tile", name, | |||
null, | |||
input, multiples); | |||
@@ -504,34 +492,34 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Tile", name, new { input, multiples }); | |||
var _op = tf.OpDefLib._apply_op_helper("Tile", name, new { input, multiples }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor transpose<T1, T2>(T1 x, T2 perm, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Transpose", name, | |||
null, | |||
x, perm); | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Transpose", name, new { x, perm }); | |||
var _op = tf.OpDefLib._apply_op_helper("Transpose", name, new { x, perm }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor zeros_like(Tensor x, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ZerosLike", name, new { x }); | |||
var _op = tf.OpDefLib._apply_op_helper("ZerosLike", name, new { x }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor stop_gradient(Tensor x, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("StopGradient", name, args: new { input = x, name }); | |||
var _op = tf.OpDefLib._apply_op_helper("StopGradient", name, args: new { input = x, name }); | |||
return _op.output; | |||
} | |||
@@ -544,9 +532,9 @@ namespace Tensorflow | |||
int shrink_axis_mask = 0, | |||
string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"StridedSlice", name, | |||
null, | |||
input, begin, end, strides, | |||
@@ -559,7 +547,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("StridedSlice", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("StridedSlice", name, new | |||
{ | |||
input, | |||
begin, | |||
@@ -583,7 +571,7 @@ namespace Tensorflow | |||
int shrink_axis_mask = 0, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("StridedSlice", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("StridedSlice", name, new | |||
{ | |||
input, | |||
begin, | |||
@@ -623,7 +611,7 @@ namespace Tensorflow | |||
int begin_mask = 0, int end_mask = 0, int ellipsis_mask = 0, int new_axis_mask = 0, | |||
int shrink_axis_mask = 0, string name = null) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("StridedSliceGrad", name: name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("StridedSliceGrad", name: name, args: new | |||
{ | |||
shape, | |||
begin, | |||
@@ -642,7 +630,7 @@ namespace Tensorflow | |||
public static Tensor slice<Tb, Ts>(Tensor input, Tb begin, Ts size, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
var _op = tf.OpDefLib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -659,9 +647,9 @@ namespace Tensorflow | |||
/// <returns> A `Tensor`. Has the same type as `input`.</returns> | |||
public static Tensor squeeze(Tensor input, int[] axis = null, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Squeeze", name, | |||
null, | |||
input, | |||
@@ -671,7 +659,7 @@ namespace Tensorflow | |||
} | |||
if (axis == null) axis = new int[0]; | |||
var _op = tf._op_def_lib._apply_op_helper("Squeeze", name, args: new { input, squeeze_dims = axis }); | |||
var _op = tf.OpDefLib._apply_op_helper("Squeeze", name, args: new { input, squeeze_dims = axis }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -687,7 +675,7 @@ namespace Tensorflow | |||
/// <returns> `Tensor`. Has the same type as `s0`.</returns> | |||
public static Tensor broadcast_args(Tensor s0, Tensor s1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("BroadcastArgs", name, args: new { s0, s1, name }); | |||
var _op = tf.OpDefLib._apply_op_helper("BroadcastArgs", name, args: new { s0, s1, name }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -701,9 +689,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor broadcast_to<T>(Tensor input, T shape, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"BroadcastTo", name, | |||
null, | |||
input, shape); | |||
@@ -711,7 +699,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("BroadcastTo", name, args: new { input, shape, name }); | |||
var _op = tf.OpDefLib._apply_op_helper("BroadcastTo", name, args: new { input, shape, name }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -23,7 +23,7 @@ namespace Tensorflow | |||
{ | |||
public static Operation control_trigger(string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ControlTrigger", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ControlTrigger", name, new | |||
{ | |||
}); | |||
@@ -41,7 +41,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor enter(Tensor data, string frame_name = "frame_name", bool is_constant = false, int parallel_iterations = 10, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Enter", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("Enter", name, new | |||
{ | |||
data, | |||
frame_name, | |||
@@ -60,7 +60,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor loop_cond(Tensor input, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("LoopCond", name, new { input }); | |||
var _op = tf.OpDefLib._apply_op_helper("LoopCond", name, new { input }); | |||
return _op.output; | |||
} | |||
@@ -73,7 +73,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor ref_next_iteration(Tensor data, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RefNextIteration", name, new { data }); | |||
var _op = tf.OpDefLib._apply_op_helper("RefNextIteration", name, new { data }); | |||
return _op; | |||
} | |||
@@ -86,7 +86,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor next_iteration(Tensor data, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("NextIteration", name, new { data }); | |||
var _op = tf.OpDefLib._apply_op_helper("NextIteration", name, new { data }); | |||
return _op; | |||
} | |||
@@ -99,7 +99,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor ref_exit(Tensor data, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RefExit", name, new { data }); | |||
var _op = tf.OpDefLib._apply_op_helper("RefExit", name, new { data }); | |||
return _op; | |||
} | |||
@@ -112,21 +112,21 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor _exit(Tensor data, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Exit", name, new { data }); | |||
var _op = tf.OpDefLib._apply_op_helper("Exit", name, new { data }); | |||
return _op; | |||
} | |||
public static Operation no_op(string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("NoOp", name, null); | |||
var _op = tf.OpDefLib._apply_op_helper("NoOp", name, null); | |||
return _op; | |||
} | |||
public static Tensor[] ref_switch(Tensor data, Tensor pred, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RefSwitch", name, new { data, pred }); | |||
var _op = tf.OpDefLib._apply_op_helper("RefSwitch", name, new { data, pred }); | |||
return _op.outputs; | |||
} | |||
@@ -150,7 +150,7 @@ namespace Tensorflow | |||
/// </returns> | |||
public static Tensor[] @switch(Tensor data, Tensor pred, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Switch", name, new { data, pred }); | |||
var _op = tf.OpDefLib._apply_op_helper("Switch", name, new { data, pred }); | |||
var _inputs_flat = _op.inputs; | |||
#pragma warning disable CS0219 // Variable is assigned but its value is never used | |||
var _attrs = ("T", _op.get_attr("T")); | |||
@@ -162,14 +162,14 @@ namespace Tensorflow | |||
public static MergeOutput ref_merge(Tensor[] inputs, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RefMerge", name, new { inputs }); | |||
var _op = tf.OpDefLib._apply_op_helper("RefMerge", name, new { inputs }); | |||
return new MergeOutput(_op.outputs); | |||
} | |||
public static MergeOutput merge(Tensor[] inputs, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Merge", name, new { inputs }); | |||
var _op = tf.OpDefLib._apply_op_helper("Merge", name, new { inputs }); | |||
return new MergeOutput(_op.outputs); | |||
} | |||
@@ -22,7 +22,7 @@ namespace Tensorflow | |||
{ | |||
public static Tensor[] ctc_greedy_decoder(Tensor inputs, Tensor sequence_length, bool merge_repeated = true, string name = "CTCGreedyDecoder") | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("CTCGreedyDecoder", name: name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("CTCGreedyDecoder", name: name, args: new | |||
{ | |||
inputs, | |||
sequence_length, | |||
@@ -22,7 +22,7 @@ namespace Tensorflow | |||
{ | |||
public static Tensor dynamic_stitch(Tensor[] indices, Tensor[] data, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DynamicStitch", name, new { indices, data }); | |||
var _op = tf.OpDefLib._apply_op_helper("DynamicStitch", name, new { indices, data }); | |||
return _op.output; | |||
} | |||
@@ -30,7 +30,7 @@ namespace Tensorflow | |||
public static Tensor[] dynamic_partition(Tensor data, Tensor partitions, int num_partitions, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DynamicPartition", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("DynamicPartition", name, new | |||
{ | |||
data, | |||
partitions, | |||
@@ -44,7 +44,7 @@ namespace Tensorflow | |||
TensorShape element_shape = null, bool dynamic_size = false, bool clear_after_read = true, | |||
bool identical_element_shapes = false, string tensor_array_name = "", string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArrayV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArrayV3", name, new | |||
{ | |||
size, | |||
dtype, | |||
@@ -61,7 +61,7 @@ namespace Tensorflow | |||
public static Tensor tensor_array_scatter_v3(Tensor handle, Tensor indices, Tensor value, | |||
Tensor flow_in, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArrayScatterV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArrayScatterV3", name, new | |||
{ | |||
handle, | |||
indices, | |||
@@ -76,7 +76,7 @@ namespace Tensorflow | |||
int capacity = -1, string container = "", string shared_name = "", | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("PaddingFIFOQueueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("PaddingFIFOQueueV2", name, new | |||
{ | |||
component_types, | |||
shapes, | |||
@@ -92,7 +92,7 @@ namespace Tensorflow | |||
int capacity = -1, string container = "", string shared_name = "", | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("FIFOQueueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("FIFOQueueV2", name, new | |||
{ | |||
component_types, | |||
shapes, | |||
@@ -108,7 +108,7 @@ namespace Tensorflow | |||
int capacity = -1, string container = "", string shared_name = "", | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("PriorityQueueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("PriorityQueueV2", name, new | |||
{ | |||
component_types, | |||
shapes, | |||
@@ -124,7 +124,7 @@ namespace Tensorflow | |||
int capacity = -1, int min_after_dequeue = 0, int seed = 0, int seed2 = 0, | |||
string container = "", string shared_name = "", string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RandomShuffleQueueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("RandomShuffleQueueV2", name, new | |||
{ | |||
component_types, | |||
shapes, | |||
@@ -141,7 +141,7 @@ namespace Tensorflow | |||
public static Operation queue_enqueue(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueEnqueue", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueEnqueue", name, new | |||
{ | |||
handle, | |||
components, | |||
@@ -153,7 +153,7 @@ namespace Tensorflow | |||
public static Operation queue_enqueue_v2(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueEnqueueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueEnqueueV2", name, new | |||
{ | |||
handle, | |||
components, | |||
@@ -165,7 +165,7 @@ namespace Tensorflow | |||
public static Tensor[] queue_dequeue_v2(Tensor handle, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueDequeueV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueDequeueV2", name, new | |||
{ | |||
handle, | |||
component_types, | |||
@@ -177,7 +177,7 @@ namespace Tensorflow | |||
public static Tensor[] queue_dequeue(Tensor handle, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueDequeue", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueDequeue", name, new | |||
{ | |||
handle, | |||
component_types, | |||
@@ -189,7 +189,7 @@ namespace Tensorflow | |||
public static Operation queue_enqueue_many_v2(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueEnqueueManyV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueEnqueueManyV2", name, new | |||
{ | |||
handle, | |||
components, | |||
@@ -201,7 +201,7 @@ namespace Tensorflow | |||
public static Tensor[] queue_dequeue_many_v2(Tensor handle, int n, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("QueueDequeueManyV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("QueueDequeueManyV2", name, new | |||
{ | |||
handle, | |||
n, | |||
@@ -223,7 +223,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor tensor_array_read_v3(Tensor handle, Tensor index, Tensor flow_in, TF_DataType dtype, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArrayReadV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArrayReadV3", name, new | |||
{ | |||
handle, | |||
index, | |||
@@ -236,7 +236,7 @@ namespace Tensorflow | |||
public static Tensor tensor_array_write_v3(Tensor handle, Tensor index, Tensor value, Tensor flow_in, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArrayWriteV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArrayWriteV3", name, new | |||
{ | |||
handle, | |||
index, | |||
@@ -249,7 +249,7 @@ namespace Tensorflow | |||
public static Tensor tensor_array_size_v3(Tensor handle, Tensor flow_in, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArraySizeV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArraySizeV3", name, new | |||
{ | |||
handle, | |||
flow_in | |||
@@ -261,7 +261,7 @@ namespace Tensorflow | |||
public static Tensor tensor_array_gather_v3(Tensor handle, Tensor indices, Tensor flow_in, | |||
TF_DataType dtype, TensorShape element_shape = null, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("TensorArrayGatherV3", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("TensorArrayGatherV3", name, new | |||
{ | |||
handle, | |||
indices, | |||
@@ -276,7 +276,7 @@ namespace Tensorflow | |||
public static Tensor stack_v2(Tensor max_size, TF_DataType elem_type, string stack_name = "", | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("StackV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("StackV2", name, new | |||
{ | |||
max_size, | |||
elem_type, | |||
@@ -289,7 +289,7 @@ namespace Tensorflow | |||
public static Tensor stack_push_v2(Tensor handle, Tensor elem, bool swap_memory = false, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("StackPushV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("StackPushV2", name, new | |||
{ | |||
handle, | |||
elem, | |||
@@ -301,7 +301,7 @@ namespace Tensorflow | |||
public static Tensor stack_pop_v2(Tensor handle, TF_DataType elem_type, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("StackPopV2", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("StackPopV2", name, new | |||
{ | |||
handle, | |||
elem_type | |||
@@ -65,13 +65,13 @@ namespace Tensorflow | |||
string name = null) | |||
{ | |||
// Add nodes to the TensorFlow graph. | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("decode_jpeg"); | |||
} | |||
else | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DecodeJpeg", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("DecodeJpeg", name: name, args: new | |||
{ | |||
contents, | |||
channels, | |||
@@ -90,13 +90,13 @@ namespace Tensorflow | |||
string name = null) | |||
{ | |||
// Add nodes to the TensorFlow graph. | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("decode_gif"); | |||
} | |||
else | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DecodeGif", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("DecodeGif", name: name, args: new | |||
{ | |||
contents | |||
}); | |||
@@ -111,13 +111,13 @@ namespace Tensorflow | |||
string name = null) | |||
{ | |||
// Add nodes to the TensorFlow graph. | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("decode_png"); | |||
} | |||
else | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DecodePng", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("DecodePng", name: name, args: new | |||
{ | |||
contents, | |||
channels, | |||
@@ -133,13 +133,13 @@ namespace Tensorflow | |||
string name = null) | |||
{ | |||
// Add nodes to the TensorFlow graph. | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("decode_bmp"); | |||
} | |||
else | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("DecodeBmp", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("DecodeBmp", name: name, args: new | |||
{ | |||
contents, | |||
channels | |||
@@ -151,13 +151,13 @@ namespace Tensorflow | |||
public static Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("resize_bilinear"); | |||
} | |||
else | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ResizeBilinear", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("ResizeBilinear", name: name, args: new | |||
{ | |||
images, | |||
size, | |||
@@ -171,7 +171,7 @@ namespace Tensorflow | |||
public static Tensor resize_nearest_neighbor<Tsize>(Tensor images, Tsize size, bool align_corners = false, | |||
bool half_pixel_centers = false, string name = null) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("ResizeNearestNeighbor", name: name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("ResizeNearestNeighbor", name: name, args: new | |||
{ | |||
images, | |||
size, | |||
@@ -185,7 +185,7 @@ namespace Tensorflow | |||
public static Tensor resize_nearest_neighbor_grad<Tsize>(Tensor grads, Tsize size, bool align_corners = false, | |||
bool half_pixel_centers = false, string name = null) | |||
{ | |||
var op = tf._op_def_lib._apply_op_helper("ResizeNearestNeighborGrad", name: name, args: new | |||
var op = tf.OpDefLib._apply_op_helper("ResizeNearestNeighborGrad", name: name, args: new | |||
{ | |||
grads, | |||
size, | |||
@@ -26,7 +26,7 @@ namespace Tensorflow | |||
if (!summarize.HasValue) | |||
summarize = 3; | |||
var _op = tf._op_def_lib._apply_op_helper("Assert", name, args: new { condition, data, summarize }); | |||
var _op = tf.OpDefLib._apply_op_helper("Assert", name, args: new { condition, data, summarize }); | |||
return _op; | |||
} | |||
@@ -34,7 +34,7 @@ namespace Tensorflow | |||
public static Tensor histogram_summary(string tag, Tensor values, string name = null) | |||
{ | |||
var dict = new Dictionary<string, object>(); | |||
var op = tf._op_def_lib._apply_op_helper("HistogramSummary", name: name, args: new { tag, values }); | |||
var op = tf.OpDefLib._apply_op_helper("HistogramSummary", name: name, args: new { tag, values }); | |||
return op.output; | |||
} | |||
@@ -63,7 +63,7 @@ namespace Tensorflow | |||
var dict = new Dictionary<string, object>(); | |||
dict["tags"] = tags; | |||
dict["values"] = values; | |||
var op = tf._op_def_lib._apply_op_helper("ScalarSummary", name: name, keywords: dict); | |||
var op = tf.OpDefLib._apply_op_helper("ScalarSummary", name: name, keywords: dict); | |||
return op.output; | |||
} | |||
@@ -94,7 +94,7 @@ namespace Tensorflow | |||
{ | |||
var dict = new Dictionary<string, object>(); | |||
dict["inputs"] = inputs; | |||
var op = tf._op_def_lib._apply_op_helper("MergeSummary", name: name, keywords: dict); | |||
var op = tf.OpDefLib._apply_op_helper("MergeSummary", name: name, keywords: dict); | |||
return op.output; | |||
} | |||
} | |||
@@ -11,7 +11,7 @@ namespace Tensorflow | |||
{ | |||
public static Tensor mul(IntPtr x, IntPtr y, string name = null) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Mul", name, | |||
null, | |||
x, y); | |||
@@ -38,9 +38,9 @@ namespace Tensorflow | |||
if (!seed2.HasValue) | |||
seed2 = 0; | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"RandomStandardNormal", name, | |||
null, | |||
shape, | |||
@@ -51,7 +51,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("RandomStandardNormal", | |||
var _op = tf.OpDefLib._apply_op_helper("RandomStandardNormal", | |||
name: name, | |||
args: new { shape, dtype, seed, seed2 }); | |||
@@ -75,7 +75,7 @@ namespace Tensorflow | |||
if (!seed2.HasValue) | |||
seed2 = 0; | |||
var _op = tf._op_def_lib._apply_op_helper("RandomUniformInt", | |||
var _op = tf.OpDefLib._apply_op_helper("RandomUniformInt", | |||
name: name, | |||
args: new { shape, minval, maxval, seed, seed2 }); | |||
@@ -98,7 +98,7 @@ namespace Tensorflow | |||
if (!seed2.HasValue) | |||
seed2 = 0; | |||
var _op = tf._op_def_lib._apply_op_helper("RandomUniform", | |||
var _op = tf.OpDefLib._apply_op_helper("RandomUniform", | |||
name: name, | |||
args: new { shape, dtype, seed, seed2}); | |||
@@ -116,7 +116,7 @@ namespace Tensorflow | |||
public static Tensor random_shuffle(Tensor value, int seed = 0, int seed2 = 0, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RandomShuffle", | |||
var _op = tf.OpDefLib._apply_op_helper("RandomShuffle", | |||
name: name, | |||
args: new { value, seed, seed2 }); | |||
@@ -140,9 +140,9 @@ namespace Tensorflow | |||
if (!seed2.HasValue) | |||
seed2 = 0; | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"TruncatedNormal", name, | |||
null, | |||
shape, | |||
@@ -153,7 +153,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("TruncatedNormal", | |||
var _op = tf.OpDefLib._apply_op_helper("TruncatedNormal", | |||
name: name, | |||
args: new { shape, dtype, seed, seed2 }); | |||
@@ -170,7 +170,7 @@ namespace Tensorflow | |||
if (output_dtype == TF_DataType.DtInvalid) | |||
output_dtype = TF_DataType.TF_INT64; | |||
var _op = tf._op_def_lib._apply_op_helper("Multinomial", | |||
var _op = tf.OpDefLib._apply_op_helper("Multinomial", | |||
name: name, | |||
args: new { logits, num_samples, seed, seed2, output_dtype }); | |||
@@ -25,9 +25,9 @@ namespace Tensorflow | |||
{ | |||
public static Operation assign_sub_variable_op(Tensor resource, Tensor value, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"AssignSubVariableOp", name, | |||
null, | |||
resource, value); | |||
@@ -47,9 +47,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Operation assign_add_variable_op(Tensor resource, Tensor value, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"AssignAddVariableOp", name, | |||
null, | |||
resource, value); | |||
@@ -57,16 +57,16 @@ namespace Tensorflow | |||
return null; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("AssignAddVariableOp", name, new { resource, value }); | |||
var _op = tf.OpDefLib._apply_op_helper("AssignAddVariableOp", name, new { resource, value }); | |||
return _op; | |||
} | |||
public static Operation assign_variable_op(Tensor resource, Tensor value, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"AssignVariableOp", name, | |||
null, | |||
resource, value); | |||
@@ -74,16 +74,16 @@ namespace Tensorflow | |||
return null; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("AssignVariableOp", name, new { resource, value }); | |||
var _op = tf.OpDefLib._apply_op_helper("AssignVariableOp", name, new { resource, value }); | |||
return _op; | |||
} | |||
public static Tensor var_is_initialized_op(Tensor resource, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"VarIsInitializedOp", name, | |||
null, | |||
resource); | |||
@@ -91,7 +91,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | |||
var _op = tf.OpDefLib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | |||
return _op.output; | |||
} | |||
@@ -108,9 +108,9 @@ namespace Tensorflow | |||
public static Tensor var_handle_op(TF_DataType dtype, TensorShape shape, | |||
string container ="", string shared_name = "", string name = null) | |||
{ | |||
if(tf.context.executing_eagerly()) | |||
if(tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"VarHandleOp", name, | |||
null, | |||
"container", container, | |||
@@ -121,7 +121,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("VarHandleOp", name, new { | |||
var _op = tf.OpDefLib._apply_op_helper("VarHandleOp", name, new { | |||
dtype, | |||
shape, | |||
container, | |||
@@ -140,9 +140,9 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor read_variable_op(Tensor resource, TF_DataType dtype, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ReadVariableOp", name, | |||
null, | |||
resource, | |||
@@ -151,7 +151,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ReadVariableOp", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ReadVariableOp", name, new | |||
{ | |||
resource, | |||
dtype | |||
@@ -163,7 +163,7 @@ namespace Tensorflow | |||
public static Tensor resource_gather(Tensor resource, Tensor indices, TF_DataType dtype, | |||
int batch_dims = 0, bool validate_indices = true, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ResourceGather", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ResourceGather", name, new | |||
{ | |||
resource, | |||
indices, | |||
@@ -38,7 +38,7 @@ namespace Tensorflow | |||
bool validate_indices = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("SparseToDense", name, args: new | |||
{ | |||
sparse_indices, | |||
output_shape, | |||
@@ -57,7 +57,7 @@ namespace Tensorflow | |||
bool validate_indices = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("SparseToDense", name, args: new | |||
{ | |||
sparse_indices, | |||
output_shape, | |||
@@ -112,7 +112,7 @@ namespace Tensorflow | |||
public static Tensor crop_and_resize(Tensor image, Tensor boxes, Tensor box_ind, Tensor crop_size, string method, float extrapolation_value, string name) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("CropAndResize", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("CropAndResize", name: name, args: new | |||
{ | |||
image, | |||
boxes, | |||
@@ -14,6 +14,7 @@ | |||
limitations under the License. | |||
******************************************************************************/ | |||
using Tensorflow.Contexts; | |||
using Tensorflow.Eager; | |||
using static Tensorflow.Binding; | |||
@@ -23,26 +24,26 @@ namespace Tensorflow | |||
{ | |||
public Operation save_v2(Tensor prefix, string[] tensor_names, string[] shape_and_slices, Tensor[] tensors, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("SaveV2", name: name, args: new { prefix, tensor_names, shape_and_slices, tensors }); | |||
var _op = tf.OpDefLib._apply_op_helper("SaveV2", name: name, args: new { prefix, tensor_names, shape_and_slices, tensors }); | |||
return _op; | |||
} | |||
public Tensor[] restore_v2(Tensor prefix, string[] tensor_names, string[] shape_and_slices, TF_DataType[] dtypes, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("RestoreV2", name: name, args: new { prefix, tensor_names, shape_and_slices, dtypes }); | |||
var _op = tf.OpDefLib._apply_op_helper("RestoreV2", name: name, args: new { prefix, tensor_names, shape_and_slices, dtypes }); | |||
return _op.outputs; | |||
} | |||
public Tensor read_file<T>(T filename, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
return read_file_eager_fallback(filename, name: name, tf.context); | |||
return read_file_eager_fallback(filename, name: name, tf.Context); | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ReadFile", name: name, args: new { filename }); | |||
var _op = tf.OpDefLib._apply_op_helper("ReadFile", name: name, args: new { filename }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -52,7 +53,7 @@ namespace Tensorflow | |||
var filename_tensor = ops.convert_to_tensor(filename, TF_DataType.TF_STRING); | |||
var _inputs_flat = new[] { filename_tensor }; | |||
return tf._execute.execute(ctx, "ReadFile", 1, _inputs_flat, null, name: name)[0]; | |||
return tf.Runner.Execute(ctx, "ReadFile", 1, _inputs_flat, null, name: name)[0]; | |||
} | |||
} | |||
} |
@@ -348,7 +348,7 @@ namespace Tensorflow | |||
/// <returns>A 1-D Tensor, the output shape as if keepdims were set to True.</returns> | |||
public static Tensor reduced_shape(Tensor input_shape, Tensor axes) | |||
{ | |||
if(tf.context.executing_eagerly()) | |||
if(tf.Context.executing_eagerly()) | |||
{ | |||
var input_shape_val = input_shape.numpy(); | |||
var axes_val = (int)axes.numpy(); | |||
@@ -35,10 +35,10 @@ namespace Tensorflow | |||
public Tensor substr<T>(T input, int pos, int len, | |||
string @uint = "BYTE", string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var input_tensor = tf.constant(input); | |||
var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"Substr", name, | |||
null, | |||
input, pos, len, | |||
@@ -47,7 +47,7 @@ namespace Tensorflow | |||
return results[0]; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("Substr", name: name, args: new | |||
var _op = tf.OpDefLib._apply_op_helper("Substr", name: name, args: new | |||
{ | |||
input, | |||
pos, | |||
@@ -235,7 +235,7 @@ namespace Tensorflow | |||
// Ensure any changes to the graph are reflected in the runtime. | |||
_extend_graph(); | |||
var status = tf.status; | |||
var status = tf.Status; | |||
var output_values = fetch_list.Select(x => IntPtr.Zero).ToArray(); | |||
@@ -21,7 +21,11 @@ Building, training and infering deep learning models. | |||
https://tensorflownet.readthedocs.io</Description> | |||
<AssemblyVersion>0.20.0.0</AssemblyVersion> | |||
<PackageReleaseNotes>tf.net 0.20.x and above are based on tensorflow native 2.x. | |||
Eager Mode is added finally. | |||
* Eager Mode is added finally. | |||
* tf.keras is partially working. | |||
* tf.data is added. | |||
It's not stable at this moment and missing many APIs, tf.net 0.15.x is more stable for production. | |||
Please be patient, we're working hard on missing functions, providing full tensorflow binding is our mission.</PackageReleaseNotes> | |||
<FileVersion>0.20.0.0</FileVersion> | |||
@@ -15,14 +15,14 @@ namespace Tensorflow | |||
get | |||
{ | |||
using var _ = EagerTensorHandle.Lease(); | |||
return c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, tf.status.Handle)); | |||
return c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, tf.Status.Handle)); | |||
} | |||
} | |||
public EagerTensorV2(IntPtr handle) | |||
{ | |||
EagerTensorHandle = c_api.TFE_EagerTensorHandle(handle); | |||
_handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, tf.status.Handle); | |||
_handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, tf.Status.Handle); | |||
} | |||
public unsafe EagerTensorV2(NDArray nd, string device_name = "") | |||
@@ -42,7 +42,7 @@ namespace Tensorflow | |||
}, IntPtr.Zero); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.status.Handle); | |||
EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, tf.Status.Handle); | |||
} | |||
/*public unsafe EagerTensorV2(float[,] value) | |||
@@ -71,8 +71,8 @@ namespace Tensorflow | |||
IntPtr stringStartAddress = IntPtr.Zero; | |||
ulong dstLen = 0; | |||
c_api.TF_StringDecode((byte*) this.buffer + 8, this.bytesize, (byte**) &stringStartAddress, ref dstLen, tf.status.Handle); | |||
tf.status.Check(true); | |||
c_api.TF_StringDecode((byte*) this.buffer + 8, this.bytesize, (byte**) &stringStartAddress, ref dstLen, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
var dstLenInt = checked((int) dstLen); | |||
var value = Encoding.UTF8.GetString((byte*) stringStartAddress, dstLenInt); | |||
@@ -459,9 +459,9 @@ namespace Tensorflow | |||
IntPtr tensor = c_api.TF_TensorData(handle); | |||
Marshal.WriteInt64(tensor, 0); | |||
fixed (byte* src = buffer) | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*)(tensor + sizeof(long)), size, tf.status.Handle); | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*)(tensor + sizeof(long)), size, tf.Status.Handle); | |||
_handle = handle; | |||
tf.status.Check(true); | |||
tf.Status.Check(true); | |||
} | |||
public unsafe Tensor(string[] strings) | |||
@@ -490,8 +490,8 @@ namespace Tensorflow | |||
Marshal.WriteInt64(input, i * sizeof(ulong), (long)offset); | |||
fixed (byte* src = &buffer[i][0]) | |||
{ | |||
var written = TF_StringEncode(src, (ulong)buffer[i].Length, (byte*)data_start, (ulong)(limit.ToInt64() - data_start.ToInt64()), tf.status.Handle); | |||
tf.status.Check(true); | |||
var written = TF_StringEncode(src, (ulong)buffer[i].Length, (byte*)data_start, (ulong)(limit.ToInt64() - data_start.ToInt64()), tf.Status.Handle); | |||
tf.Status.Check(true); | |||
//input += 8; | |||
data_start += (int)written; | |||
offset += written; | |||
@@ -519,8 +519,8 @@ namespace Tensorflow | |||
IntPtr tensor = c_api.TF_TensorData(handle); | |||
Marshal.WriteInt64(tensor, 0); | |||
c_api.TF_StringEncode((byte*) nd.Unsafe.Address, bytesLength, (byte*) (tensor + sizeof(long)), size, tf.status.Handle); | |||
tf.status.Check(true); | |||
c_api.TF_StringEncode((byte*) nd.Unsafe.Address, bytesLength, (byte*) (tensor + sizeof(long)), size, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
_handle = handle; | |||
} else | |||
{ | |||
@@ -533,9 +533,9 @@ namespace Tensorflow | |||
Marshal.WriteInt64(tensor, 0); | |||
fixed (byte* src = buffer) | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*) (tensor + sizeof(Int64)), size, tf.status.Handle); | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*) (tensor + sizeof(Int64)), size, tf.Status.Handle); | |||
tf.status.Check(true); | |||
tf.Status.Check(true); | |||
_handle = handle; | |||
} | |||
@@ -610,9 +610,9 @@ namespace Tensorflow | |||
Marshal.WriteInt64(tensor, 0); | |||
fixed (byte* src = buffer) | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*)(tensor + sizeof(long)), size, tf.status.Handle); | |||
c_api.TF_StringEncode(src, (ulong)buffer.Length, (byte*)(tensor + sizeof(long)), size, tf.Status.Handle); | |||
tf.status.Check(true); | |||
tf.Status.Check(true); | |||
return handle; | |||
} | |||
@@ -240,8 +240,8 @@ namespace Tensorflow | |||
{ | |||
IntPtr dst = IntPtr.Zero; | |||
ulong dstLen = 0; | |||
var read = c_api.TF_StringDecode((byte*)src, bytesize, (byte**)&dst, ref dstLen, tf.status.Handle); | |||
tf.status.Check(true); | |||
var read = c_api.TF_StringDecode((byte*)src, bytesize, (byte**)&dst, ref dstLen, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
buffer[i] = new byte[(int)dstLen]; | |||
Marshal.Copy(dst, buffer[i], 0, buffer[i].Length); | |||
src += (int)read; | |||
@@ -274,8 +274,8 @@ namespace Tensorflow | |||
{ | |||
IntPtr dst = IntPtr.Zero; | |||
ulong dstLen = 0; | |||
var read = c_api.TF_StringDecode((byte*)src, bytesize, (byte**)&dst, ref dstLen, tf.status.Handle); | |||
tf.status.Check(true); | |||
var read = c_api.TF_StringDecode((byte*)src, bytesize, (byte**)&dst, ref dstLen, tf.Status.Handle); | |||
tf.Status.Check(true); | |||
buffer[i] = new byte[(int)dstLen]; | |||
Marshal.Copy(dst, buffer[i], 0, buffer[i].Length); | |||
src += (int)read; | |||
@@ -109,7 +109,7 @@ namespace Tensorflow | |||
if (_handle == IntPtr.Zero) | |||
{ | |||
c_api.TF_GraphGetTensorShape(op.graph, _as_tf_output(), dims, rank, tf.status.Handle); | |||
c_api.TF_GraphGetTensorShape(op.graph, _as_tf_output(), dims, rank, tf.Status.Handle); | |||
} | |||
else | |||
{ | |||
@@ -123,11 +123,11 @@ namespace Tensorflow | |||
set | |||
{ | |||
if (value == null) | |||
c_api.TF_GraphSetTensorShape(graph, _as_tf_output(), null, -1, tf.status.Handle); | |||
c_api.TF_GraphSetTensorShape(graph, _as_tf_output(), null, -1, tf.Status.Handle); | |||
else | |||
c_api.TF_GraphSetTensorShape(graph, _as_tf_output(), value.Select(Convert.ToInt64).ToArray(), value.Length, tf.status.Handle); | |||
c_api.TF_GraphSetTensorShape(graph, _as_tf_output(), value.Select(Convert.ToInt64).ToArray(), value.Length, tf.Status.Handle); | |||
tf.status.Check(true); | |||
tf.Status.Check(true); | |||
} | |||
} | |||
@@ -172,7 +172,7 @@ namespace Tensorflow | |||
if (_handle == IntPtr.Zero) | |||
{ | |||
var output = _as_tf_output(); | |||
int ndim = c_api.TF_GraphGetTensorNumDims(op.graph, output, tf.status.Handle); | |||
int ndim = c_api.TF_GraphGetTensorNumDims(op.graph, output, tf.Status.Handle); | |||
return ndim; | |||
} | |||
@@ -232,11 +232,11 @@ namespace Tensorflow | |||
switch (rank) | |||
{ | |||
case -1: | |||
return $"tf.Tensor '{name}' shape=<unknown> dtype={dtype}"; | |||
return $"tf.Tensor '{name}' shape={TensorShape} dtype={dtype.as_numpy_name()}"; | |||
case 0: | |||
return $"tf.Tensor '{name}' shape=() dtype={dtype}"; | |||
return $"tf.Tensor '{name}' shape={TensorShape} dtype={dtype.as_numpy_name()}"; | |||
default: | |||
return $"tf.Tensor '{name}' shape=({string.Join(",", shape)}) dtype={dtype}"; | |||
return $"tf.Tensor '{name}' shape={TensorShape} dtype={dtype.as_numpy_name()}"; | |||
} | |||
} | |||
@@ -20,6 +20,7 @@ using System.Collections.Generic; | |||
using Tensorflow.Eager; | |||
using static Tensorflow.Binding; | |||
using System.Linq; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow | |||
{ | |||
@@ -49,9 +50,9 @@ namespace Tensorflow | |||
bool verify_shape, | |||
bool allow_broadcast) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var t = convert_to_eager_tensor(value, tf.context, dtype: dtype); | |||
var t = convert_to_eager_tensor(value, tf.Context, dtype: dtype); | |||
if (shape == null) | |||
return t; | |||
@@ -69,7 +70,7 @@ namespace Tensorflow | |||
if (t.dtype == dtypes.@bool) | |||
throw new NotImplementedException(""); | |||
else | |||
return _eager_fill(shape, t, tf.context); | |||
return _eager_fill(shape, t, tf.Context); | |||
} | |||
} | |||
@@ -105,7 +106,7 @@ namespace Tensorflow | |||
var dims_t = convert_to_eager_tensor(dims, ctx, dtypes.int32); | |||
var inputs_flat = new[] { dims_t, value }; | |||
var attrs = new object[] { "T", attr_t, "index_type", TF_DataType.TF_INT32 }; | |||
var result = tf._execute.execute(ctx, "Fill", 1, inputs_flat, attrs); | |||
var result = tf.Runner.Execute(ctx, "Fill", 1, inputs_flat, attrs); | |||
return result[0]; | |||
} | |||
@@ -135,7 +136,7 @@ namespace Tensorflow | |||
if(dtype == TF_DataType.TF_STRING && value is byte[] bytes) | |||
{ | |||
return new EagerTensor(bytes, ctx.device_name, TF_DataType.TF_STRING); | |||
return new EagerTensor(bytes, ctx.DeviceName, TF_DataType.TF_STRING); | |||
} | |||
switch (value) | |||
@@ -143,53 +144,53 @@ namespace Tensorflow | |||
case EagerTensor val: | |||
return val; | |||
case NDArray val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case string val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case string[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case bool val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case byte val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case byte[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case byte[,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case byte[,,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case int val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case int[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case int[,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case int[,,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case long val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case long[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case long[,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case long[,,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case float val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case float[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case float[,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case float[,,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case double val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case double[] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case double[,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
case double[,,] val: | |||
return new EagerTensor(val, ctx.device_name); | |||
return new EagerTensor(val, ctx.DeviceName); | |||
default: | |||
throw new NotImplementedException($"convert_to_eager_tensor {value.GetType()}"); | |||
} | |||
@@ -212,7 +212,7 @@ namespace Tensorflow | |||
}); | |||
} | |||
if (!tf.context.executing_eagerly()) | |||
if (!tf.Context.executing_eagerly()) | |||
{ | |||
var train_op = ops.get_collection_ref<Operation>(tf.GraphKeys.TRAIN_OP); | |||
if (train_op != null && train_op.Contains(apply_updates)) | |||
@@ -155,7 +155,7 @@ namespace Tensorflow | |||
private void _check_saver_def() | |||
{ | |||
if (!tf.context.executing_eagerly()) | |||
if (!tf.Context.executing_eagerly()) | |||
{ | |||
if (string.IsNullOrEmpty(_saver_def.SaveTensorName)) | |||
throw new ValueError($"saver_def must specify the save_tensor_name: {_saver_def}"); | |||
@@ -244,7 +244,7 @@ namespace Tensorflow | |||
Console.WriteLine($"Restoring parameters from {save_path}"); | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
#pragma warning disable CS0642 // Possible mistaken empty statement | |||
; | |||
#pragma warning restore CS0642 // Possible mistaken empty statement | |||
@@ -33,7 +33,7 @@ namespace Tensorflow.Train | |||
#pragma warning disable CS0219 // Variable is assigned but its value is never used | |||
IInitializer checkpoint_initializer = null; | |||
#pragma warning restore CS0219 // Variable is assigned but its value is never used | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
#pragma warning disable CS0642 // Possible mistaken empty statement | |||
; | |||
#pragma warning restore CS0642 // Possible mistaken empty statement | |||
@@ -27,7 +27,7 @@ namespace Tensorflow | |||
Tensor lr, Tensor beta1, Tensor beta2, Tensor epsilon, Tensor grad, | |||
bool use_locking = false, bool use_nesterov = false, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ApplyAdam", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ApplyAdam", name, new | |||
{ | |||
var, | |||
m, | |||
@@ -48,7 +48,7 @@ namespace Tensorflow | |||
public static Tensor apply_gradient_descent(RefVariable var, Tensor alpha, Tensor delta, bool use_locking = false, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ApplyGradientDescent", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ApplyGradientDescent", name, new | |||
{ | |||
var, | |||
alpha, | |||
@@ -61,9 +61,9 @@ namespace Tensorflow | |||
public static Operation resource_apply_gradient_descent(Tensor var, Tensor alpha, Tensor delta, bool use_locking = false, string name = null) | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
var result = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
var result = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ResourceApplyGradientDescent", name, | |||
null, | |||
var, alpha, delta, | |||
@@ -71,7 +71,7 @@ namespace Tensorflow | |||
return null; | |||
} | |||
var _op = tf._op_def_lib._apply_op_helper("ResourceApplyGradientDescent", name, new | |||
var _op = tf.OpDefLib._apply_op_helper("ResourceApplyGradientDescent", name, new | |||
{ | |||
var, | |||
alpha, | |||
@@ -136,7 +136,7 @@ namespace Tensorflow | |||
public override string ToString() | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
return $"tf.Variable: '{Name}' shape={string.Join(",", shape)}, dtype={dtype.as_numpy_name()}, numpy={tensor_util.to_numpy_string(read_value())}"; | |||
else | |||
return $"tf.Variable: '{Name}' shape={string.Join(",", shape)}, dtype={dtype.as_numpy_name()}"; | |||
@@ -419,7 +419,7 @@ namespace Tensorflow | |||
public ITensorOrOperation assign_add<T>(T value, bool use_locking = false, string name = null, bool read_value = true) | |||
{ | |||
var variable = this; | |||
var _op = tf._op_def_lib._apply_op_helper("AssignAdd", name: name, args: new { variable, value, use_locking }); | |||
var _op = tf.OpDefLib._apply_op_helper("AssignAdd", name: name, args: new { variable, value, use_locking }); | |||
return _op; | |||
} | |||
} | |||
@@ -88,7 +88,7 @@ namespace Tensorflow | |||
collections.Add(tf.GraphKeys.TRAINABLE_VARIABLES); | |||
ops.init_scope(); | |||
_in_graph_mode = !tf.context.executing_eagerly(); | |||
_in_graph_mode = !tf.Context.executing_eagerly(); | |||
tf_with(ops.name_scope(name, "Variable"), scope => | |||
{ | |||
name = scope; | |||
@@ -104,7 +104,7 @@ namespace Tensorflow | |||
else | |||
{ | |||
unique_id = $"{handle_name}_{ops.uid()}"; | |||
shared_name = tf.context.shared_name(); | |||
shared_name = tf.Context.shared_name(); | |||
} | |||
var attr = new AttrValue(); | |||
@@ -34,7 +34,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor variable_v2(int[] shape, TF_DataType dtype, string name = null, string container = "", string shared_name = "") | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("VariableV2", name: name, args: new { dtype, shape, container, shared_name }); | |||
var _op = tf.OpDefLib._apply_op_helper("VariableV2", name: name, args: new { dtype, shape, container, shared_name }); | |||
var _result = _op.outputs; | |||
var _inputs_flat = _op.inputs; | |||
@@ -61,7 +61,7 @@ namespace Tensorflow | |||
bool use_locking = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
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; | |||
@@ -79,7 +79,7 @@ namespace Tensorflow | |||
bool use_locking = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
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; | |||
@@ -97,7 +97,7 @@ namespace Tensorflow | |||
bool use_locking = true, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
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; | |||
@@ -115,7 +115,7 @@ namespace Tensorflow | |||
bool use_locking = false, | |||
string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("AssignSub", name: name, args: new { @ref, value, use_locking }); | |||
var _op = tf.OpDefLib._apply_op_helper("AssignSub", name: name, args: new { @ref, value, use_locking }); | |||
return _op.outputs[0]; | |||
} | |||
@@ -131,13 +131,13 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static Tensor scatter_add(IVariableV1 @ref, Tensor indices, Tensor updates, bool use_locking = false, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | |||
var _op = tf.OpDefLib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | |||
return _op.outputs[0]; | |||
} | |||
public static Tensor is_variable_initialized(RefVariable @ref, string name = null) | |||
{ | |||
var _op = tf._op_def_lib._apply_op_helper("IsVariableInitialized", name: name, args: new { @ref }); | |||
var _op = tf.OpDefLib._apply_op_helper("IsVariableInitialized", name: name, args: new { @ref }); | |||
return _op.output; | |||
} | |||
} | |||
@@ -24,6 +24,7 @@ using NumSharp; | |||
using Tensorflow.Util; | |||
using static Tensorflow.Binding; | |||
using Tensorflow.Eager; | |||
using Tensorflow.Contexts; | |||
namespace Tensorflow | |||
{ | |||
@@ -176,7 +177,7 @@ namespace Tensorflow | |||
throw new NotImplementedException("_create_c_op"); | |||
} | |||
var status = tf.status; | |||
var status = tf.Status; | |||
// Add control inputs | |||
foreach (var control_input in control_inputs) | |||
@@ -240,7 +241,7 @@ namespace Tensorflow | |||
/// <returns></returns> | |||
public static void init_scope() | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
return; | |||
// Retrieve the active name scope: entering an `init_scope` preserves | |||
@@ -16,6 +16,7 @@ | |||
using System.Collections.Generic; | |||
using System.Diagnostics; | |||
using Tensorflow.Contexts; | |||
using Tensorflow.Eager; | |||
using static Tensorflow.Binding; | |||
@@ -48,9 +49,9 @@ namespace Tensorflow | |||
public void __enter__() | |||
{ | |||
_name = _name ?? _default_name; | |||
if (tf.context.executing_eagerly()) | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
(scope_name, old_scope_name) = enter_eager_name_scope(tf.context, _name); | |||
(scope_name, old_scope_name) = enter_eager_name_scope(tf.Context, _name); | |||
} | |||
else | |||
{ | |||
@@ -75,7 +76,7 @@ namespace Tensorflow | |||
name = ""; | |||
var scope_name = name; | |||
var old_name = ctx.scope_name; | |||
var old_name = ctx.ScopeName; | |||
// A trailing slash breaks out of nested name scopes, indicating a | |||
// fully specified scope name, for compatibility with Graph.name_scope. | |||
if (!name.EndsWith("/")) | |||
@@ -85,14 +86,14 @@ namespace Tensorflow | |||
scope_name = old_name + scope_name; | |||
} | |||
ctx.scope_name = scope_name; | |||
ctx.ScopeName = scope_name; | |||
return (scope_name, old_name); | |||
} | |||
public void Dispose() | |||
{ | |||
if (tf.context.executing_eagerly()) | |||
tf.context.scope_name = old_scope_name; | |||
if (tf.Context.executing_eagerly()) | |||
tf.Context.ScopeName = old_scope_name; | |||
else | |||
get_default_graph()._name_stack = old_scope_name; | |||
} | |||
@@ -20,6 +20,7 @@ using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Runtime.InteropServices; | |||
using System.Threading; | |||
using Tensorflow.Contexts; | |||
using Tensorflow.Eager; | |||
using Tensorflow.Gradients; | |||
@@ -41,19 +42,24 @@ namespace Tensorflow | |||
public delegate Tensor[] BackwardFunction(Tensor[] grads, long[] unneeded_gradients); | |||
public Status status = new Status(); | |||
public OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
public Context context = new Context(new ContextOptions(), new Status()); | |||
public Execute _execute = new Execute(); | |||
public IEagerRunner Runner = new EagerRunner(); | |||
public Status Status; | |||
public OpDefLibrary OpDefLib; | |||
public Context Context; | |||
public IEagerRunner Runner; | |||
public tensorflow() | |||
{ | |||
Status = new Status(); | |||
Context = new Context(new ContextOptions(), Status); | |||
enable_eager_execution(); | |||
_constructThreadingObjects(); | |||
OpDefLib = new OpDefLibrary(); | |||
ConstructThreadingObjects(); | |||
InitGradientEnvironment(); | |||
Runner = new EagerRunner(); | |||
} | |||
public string VERSION => c_api.StringPiece(c_api.TF_Version()); | |||
private void InitGradientEnvironment() | |||
{ | |||
ops.RegisterFromAssembly(); | |||
@@ -74,15 +80,10 @@ namespace Tensorflow | |||
shape: shape); | |||
public Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
=> gen_array_ops.placeholder(dtype, shape, name); | |||
=> array_ops.placeholder(dtype, shape, name); | |||
public void enable_eager_execution() | |||
{ | |||
// contex = new Context(); | |||
context.default_execution_mode = Context.EAGER_MODE; | |||
} | |||
public string VERSION => c_api.StringPiece(c_api.TF_Version()); | |||
=> Context.eager_mode(); | |||
public Session get_default_session() | |||
=> ops.get_default_session(); | |||
@@ -21,12 +21,12 @@ namespace Tensorflow | |||
{ | |||
public partial class tensorflow : ITensorFlowObject | |||
{ | |||
protected ThreadLocal<Session> _defaultSessionFactory; | |||
protected ThreadLocal<Session> defaultSessionFactory; | |||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | |||
public void _constructThreadingObjects() | |||
public void ConstructThreadingObjects() | |||
{ | |||
_defaultSessionFactory = new ThreadLocal<Session>(() => new Session()); | |||
defaultSessionFactory = new ThreadLocal<Session>(() => new Session()); | |||
} | |||
public Session defaultSession | |||
@@ -34,7 +34,7 @@ namespace Tensorflow | |||
get | |||
{ | |||
if (!ops.IsSingleThreaded) | |||
return _defaultSessionFactory.Value; | |||
return defaultSessionFactory.Value; | |||
return ops.get_default_session(); | |||
} | |||
@@ -42,7 +42,7 @@ namespace Tensorflow | |||
{ | |||
if (!ops.IsSingleThreaded) | |||
{ | |||
_defaultSessionFactory.Value = value; | |||
defaultSessionFactory.Value = value; | |||
return; | |||
} | |||
@@ -8,6 +8,7 @@ | |||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> | |||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> | |||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||
</PropertyGroup> | |||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||
@@ -52,7 +52,7 @@ Set ENV `BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\ | |||
1. Build static library | |||
`bazel build --config=opt //tensorflow:libtensorflow.so` | |||
`bazel build --config=opt //tensorflow:tensorflow` | |||
2. Build pip package | |||
@@ -6,13 +6,14 @@ using Tensorflow.Keras.Engine; | |||
using Tensorflow.Keras.Layers; | |||
using NumSharp; | |||
using Tensorflow.UnitTest; | |||
using static Tensorflow.Binding; | |||
namespace TensorFlowNET.UnitTest.Keras | |||
{ | |||
/// <summary> | |||
/// https://www.tensorflow.org/versions/r1.14/api_docs/python/tf/keras/layers/Embedding | |||
/// </summary> | |||
[TestClass] | |||
[TestClass, Ignore] | |||
public class EmbeddingTest : GraphModeTestBase | |||
{ | |||
[TestMethod] | |||
@@ -29,5 +30,13 @@ namespace TensorFlowNET.UnitTest.Keras | |||
var input_array = np.random.randint(1000, size: (32, 10)); | |||
model.compile("rmsprop", "mse"); | |||
} | |||
[TestMethod] | |||
public void Dense() | |||
{ | |||
var model = tf.keras.Sequential(); | |||
var dense_layer = tf.keras.layers.Dense(5, input_shape: 3); | |||
model.add(dense_layer); | |||
} | |||
} | |||
} |
@@ -47,7 +47,7 @@ | |||
<PackageReference Include="MSTest.TestAdapter" Version="2.1.2" /> | |||
<PackageReference Include="MSTest.TestFramework" Version="2.1.2" /> | |||
<PackageReference Include="NumSharp.Lite" Version="0.1.7" /> | |||
<PackageReference Include="SciSharp.TensorFlow.Redist" Version="2.2.0.2" /> | |||
<PackageReference Include="SciSharp.TensorFlow.Redist" Version="2.3.0" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||