| @@ -203,49 +203,21 @@ namespace Tensorflow | |||||
| yield return values[i]; | yield return values[i]; | ||||
| } | } | ||||
| [DebuggerStepThrough] | |||||
| public static void tf_with(ITensorFlowObject py, Action<ITensorFlowObject> action) | |||||
| { | |||||
| try | |||||
| { | |||||
| py.__enter__(); | |||||
| action(py); | |||||
| } | |||||
| finally | |||||
| { | |||||
| py.__exit__(); | |||||
| py.Dispose(); | |||||
| } | |||||
| } | |||||
| [DebuggerStepThrough] | [DebuggerStepThrough] | ||||
| public static void tf_with<T>(T py, Action<T> action) where T : ITensorFlowObject | public static void tf_with<T>(T py, Action<T> action) where T : ITensorFlowObject | ||||
| { | { | ||||
| try | |||||
| { | |||||
| py.__enter__(); | |||||
| action(py); | |||||
| } | |||||
| finally | |||||
| { | |||||
| py.__exit__(); | |||||
| py.Dispose(); | |||||
| } | |||||
| py.__enter__(); | |||||
| action(py); | |||||
| py.__exit__(); | |||||
| } | } | ||||
| [DebuggerStepThrough] | [DebuggerStepThrough] | ||||
| public static TOut tf_with<TIn, TOut>(TIn py, Func<TIn, TOut> action) where TIn : ITensorFlowObject | public static TOut tf_with<TIn, TOut>(TIn py, Func<TIn, TOut> action) where TIn : ITensorFlowObject | ||||
| { | { | ||||
| try | |||||
| { | |||||
| py.__enter__(); | |||||
| return action(py); | |||||
| } | |||||
| finally | |||||
| { | |||||
| py.__exit__(); | |||||
| py.Dispose(); | |||||
| } | |||||
| py.__enter__(); | |||||
| var result = action(py); | |||||
| py.__exit__(); | |||||
| return result; | |||||
| } | } | ||||
| public static float time() | public static float time() | ||||
| @@ -60,21 +60,22 @@ namespace Tensorflow | |||||
| var (seed, seed2) = get_seed(op_seed); | var (seed, seed2) = get_seed(op_seed); | ||||
| Tensor _seed, _seed2; | Tensor _seed, _seed2; | ||||
| if (seed is null) | if (seed is null) | ||||
| _seed = constant_op.constant(0, dtype: TF_DataType.TF_INT64, name: "seed"); | |||||
| _seed = constant_op.constant(0L, name: "seed"); | |||||
| else | else | ||||
| _seed = constant_op.constant(seed.Value, dtype: TF_DataType.TF_INT64, name: "seed"); | |||||
| _seed = constant_op.constant((long)seed.Value, name: "seed"); | |||||
| if (seed2 is null) | if (seed2 is null) | ||||
| _seed2 = constant_op.constant(0, dtype: TF_DataType.TF_INT64, name: "seed2"); | |||||
| _seed2 = constant_op.constant(0L, name: "seed2"); | |||||
| else | else | ||||
| { | { | ||||
| _seed2 = tf_with(ops.name_scope("seed2"), scope => | _seed2 = tf_with(ops.name_scope("seed2"), scope => | ||||
| { | { | ||||
| _seed2 = constant_op.constant(seed2.Value, dtype: TF_DataType.TF_INT64); | |||||
| _seed2 = constant_op.constant((long)seed2.Value); | |||||
| return array_ops.where_v2( | return array_ops.where_v2( | ||||
| math_ops.logical_and( | math_ops.logical_and( | ||||
| math_ops.equal(_seed, 0l), math_ops.equal(_seed2, 0l)), | |||||
| constant_op.constant(2^31 - 1, dtype: dtypes.int64), | |||||
| math_ops.equal(_seed, 0L), | |||||
| math_ops.equal(_seed2, 0L)), | |||||
| constant_op.constant(2^31L - 1), | |||||
| _seed2, | _seed2, | ||||
| name: scope); | name: scope); | ||||
| }); | }); | ||||
| @@ -1,32 +0,0 @@ | |||||
| using System; | |||||
| namespace Tensorflow | |||||
| { | |||||
| public class NullContextmanager : ITensorFlowObject | |||||
| { | |||||
| public void __init__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __enter__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __del__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __exit__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void Dispose() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -21,7 +21,7 @@ using Tensorflow.Util; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| public class Session : BaseSession, ITensorFlowObject | |||||
| public class Session : BaseSession | |||||
| { | { | ||||
| public Session(string target = "", Graph g = null) : base(target, g, null) | public Session(string target = "", Graph g = null) : base(target, g, null) | ||||
| { } | { } | ||||
| @@ -2,7 +2,7 @@ | |||||
| <PropertyGroup> | <PropertyGroup> | ||||
| <TargetFramework>netstandard2.0</TargetFramework> | <TargetFramework>netstandard2.0</TargetFramework> | ||||
| <AssemblyName>TensorFlow.NET</AssemblyName> | |||||
| <AssemblyName>Tensorflow.Binding</AssemblyName> | |||||
| <RootNamespace>Tensorflow</RootNamespace> | <RootNamespace>Tensorflow</RootNamespace> | ||||
| <TargetTensorFlow>2.2.0</TargetTensorFlow> | <TargetTensorFlow>2.2.0</TargetTensorFlow> | ||||
| <Version>0.70.0</Version> | <Version>0.70.0</Version> | ||||
| @@ -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; | |||||
| using System.Collections.Generic; | |||||
| namespace Tensorflow | |||||
| { | |||||
| public partial class ops | |||||
| { | |||||
| _DefaultStack _default_session_stack = new _DefaultStack(); | |||||
| public class _DefaultStack : ITensorFlowObject | |||||
| { | |||||
| Stack<object> stack; | |||||
| #pragma warning disable CS0414 // The field 'ops._DefaultStack._enforce_nesting' is assigned but its value is never used | |||||
| bool _enforce_nesting = true; | |||||
| #pragma warning restore CS0414 // The field 'ops._DefaultStack._enforce_nesting' is assigned but its value is never used | |||||
| public _DefaultStack() | |||||
| { | |||||
| stack = new Stack<object>(); | |||||
| } | |||||
| public void __enter__() | |||||
| { | |||||
| } | |||||
| public void __exit__() | |||||
| { | |||||
| } | |||||
| public void Dispose() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __init__() | |||||
| { | |||||
| } | |||||
| public void __del__() | |||||
| { | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -99,15 +99,16 @@ namespace Tensorflow | |||||
| [DebuggerStepThrough] | [DebuggerStepThrough] | ||||
| public void Dispose() | public void Dispose() | ||||
| { | { | ||||
| if (tf.Context.executing_eagerly()) | |||||
| tf.Context.ScopeName = old_scope_name; | |||||
| else | |||||
| get_default_graph()._name_stack = old_scope_name; | |||||
| } | } | ||||
| [DebuggerStepThrough] | [DebuggerStepThrough] | ||||
| public void __exit__() | public void __exit__() | ||||
| { | { | ||||
| if (tf.Context.executing_eagerly()) | |||||
| tf.Context.ScopeName = old_scope_name; | |||||
| else | |||||
| get_default_graph()._name_stack = old_scope_name; | |||||
| } | } | ||||
| [DebuggerNonUserCode] | [DebuggerNonUserCode] | ||||
| @@ -33,18 +33,20 @@ namespace Tensorflow.Keras.Engine | |||||
| else | else | ||||
| nameScope = _name_scope(); | nameScope = _name_scope(); | ||||
| tf_with(ops.name_scope(nameScope), scope => | |||||
| { | |||||
| if (!built) | |||||
| MaybeBuild(inputs); | |||||
| var scope = ops.name_scope(nameScope); | |||||
| scope.__enter__(); | |||||
| if (!built) | |||||
| MaybeBuild(inputs); | |||||
| outputs = Call(inputs, state: state, training: training); | |||||
| outputs = Call(inputs, state: state, training: training); | |||||
| // memory leak | |||||
| // _set_connectivity_metadata_(inputs, outputs); | |||||
| _handle_activity_regularization(inputs, outputs); | |||||
| _set_mask_metadata(inputs, outputs, null); | |||||
| // memory leak | |||||
| // _set_connectivity_metadata_(inputs, outputs); | |||||
| _handle_activity_regularization(inputs, outputs); | |||||
| _set_mask_metadata(inputs, outputs, null); | |||||
| }); | |||||
| scope.__exit__(); | |||||
| return outputs; | return outputs; | ||||
| } | } | ||||
| @@ -26,26 +26,27 @@ namespace Tensorflow.Keras.Engine | |||||
| var graph = keras.backend.get_graph(); | var graph = keras.backend.get_graph(); | ||||
| graph.as_default(); | graph.as_default(); | ||||
| tf_with(ops.name_scope(_name_scope()), scope => | |||||
| { | |||||
| MaybeBuild(inputs); | |||||
| // Wrapping `call` function in autograph to allow for dynamic control | |||||
| // flow and control dependencies in call. We are limiting this to | |||||
| // subclassed layers as autograph is strictly needed only for | |||||
| // subclassed layers and models. | |||||
| // tf_convert will respect the value of autograph setting in the | |||||
| // enclosing tf.function, if any. | |||||
| if (!dynamic) | |||||
| throw new NotImplementedException(""); | |||||
| outputs = Call(inputs); | |||||
| var scope = ops.name_scope(_name_scope()); | |||||
| scope.__enter__(); | |||||
| MaybeBuild(inputs); | |||||
| // Wrapping `call` function in autograph to allow for dynamic control | |||||
| // flow and control dependencies in call. We are limiting this to | |||||
| // subclassed layers as autograph is strictly needed only for | |||||
| // subclassed layers and models. | |||||
| // tf_convert will respect the value of autograph setting in the | |||||
| // enclosing tf.function, if any. | |||||
| if (!dynamic) | |||||
| throw new NotImplementedException(""); | |||||
| outputs = Call(inputs); | |||||
| _set_connectivity_metadata_(inputs, outputs); | |||||
| _handle_activity_regularization(inputs, outputs); | |||||
| _set_mask_metadata(inputs, outputs, null); | |||||
| }); | |||||
| _set_connectivity_metadata_(inputs, outputs); | |||||
| _handle_activity_regularization(inputs, outputs); | |||||
| _set_mask_metadata(inputs, outputs, null); | |||||
| scope.__exit__(); | |||||
| graph.Exit(); | graph.Exit(); | ||||
| return outputs; | return outputs; | ||||
| @@ -60,7 +60,7 @@ Keras is an API designed for human beings, not machines. Keras follows best prac | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="HDF5-CSharp" Version="1.12.4" /> | |||||
| <PackageReference Include="HDF5-CSharp" Version="1.12.5" /> | |||||
| <PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.144" /> | <PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.144" /> | ||||
| <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> | <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> | ||||
| <PackageReference Include="SharpZipLib" Version="1.3.3" /> | <PackageReference Include="SharpZipLib" Version="1.3.3" /> | ||||
| @@ -252,35 +252,10 @@ namespace TensorFlowNET.UnitTest | |||||
| //else | //else | ||||
| //{ | //{ | ||||
| s = self._create_session(graph, config, force_gpu); | s = self._create_session(graph, config, force_gpu); | ||||
| self._constrain_devices_and_set_default(s, use_gpu, force_gpu); | |||||
| //} | //} | ||||
| return s.as_default(); | return s.as_default(); | ||||
| } | } | ||||
| private ITensorFlowObject _constrain_devices_and_set_default(Session sess, bool useGpu, bool forceGpu) | |||||
| { | |||||
| //def _constrain_devices_and_set_default(self, sess, use_gpu, force_gpu): | |||||
| //"""Set the session and its graph to global default and constrain devices.""" | |||||
| //if context.executing_eagerly(): | |||||
| // yield None | |||||
| //else: | |||||
| // with sess.graph.as_default(), sess.as_default(): | |||||
| // if force_gpu: | |||||
| // # Use the name of an actual device if one is detected, or | |||||
| // # '/device:GPU:0' otherwise | |||||
| // gpu_name = gpu_device_name() | |||||
| // if not gpu_name: | |||||
| // gpu_name = "/device:GPU:0" | |||||
| // with sess.graph.device(gpu_name): | |||||
| // yield sess | |||||
| // elif use_gpu: | |||||
| // yield sess | |||||
| // else: | |||||
| // with sess.graph.device("/device:CPU:0"): | |||||
| // yield sess | |||||
| return sess; | |||||
| } | |||||
| // See session() for details. | // See session() for details. | ||||
| private Session _create_session(Graph graph, object cfg, bool forceGpu) | private Session _create_session(Graph graph, object cfg, bool forceGpu) | ||||
| { | { | ||||
| @@ -42,10 +42,7 @@ namespace TensorFlowNET.UnitTest.Basics | |||||
| public void ImportSavedModel() | public void ImportSavedModel() | ||||
| { | { | ||||
| tf_with(Session.LoadFromSavedModel("mobilenet"), sess => | |||||
| { | |||||
| }); | |||||
| Session.LoadFromSavedModel("mobilenet"); | |||||
| } | } | ||||
| public void ImportGraphDefFromPbFile() | public void ImportGraphDefFromPbFile() | ||||
| @@ -266,35 +266,10 @@ namespace TensorFlowNET.UnitTest | |||||
| //else | //else | ||||
| //{ | //{ | ||||
| s = self._create_session(graph, config, force_gpu); | s = self._create_session(graph, config, force_gpu); | ||||
| self._constrain_devices_and_set_default(s, use_gpu, force_gpu); | |||||
| //} | //} | ||||
| return s.as_default(); | return s.as_default(); | ||||
| } | } | ||||
| private ITensorFlowObject _constrain_devices_and_set_default(Session sess, bool useGpu, bool forceGpu) | |||||
| { | |||||
| //def _constrain_devices_and_set_default(self, sess, use_gpu, force_gpu): | |||||
| //"""Set the session and its graph to global default and constrain devices.""" | |||||
| //if context.executing_eagerly(): | |||||
| // yield None | |||||
| //else: | |||||
| // with sess.graph.as_default(), sess.as_default(): | |||||
| // if force_gpu: | |||||
| // # Use the name of an actual device if one is detected, or | |||||
| // # '/device:GPU:0' otherwise | |||||
| // gpu_name = gpu_device_name() | |||||
| // if not gpu_name: | |||||
| // gpu_name = "/device:GPU:0" | |||||
| // with sess.graph.device(gpu_name): | |||||
| // yield sess | |||||
| // elif use_gpu: | |||||
| // yield sess | |||||
| // else: | |||||
| // with sess.graph.device("/device:CPU:0"): | |||||
| // yield sess | |||||
| return sess; | |||||
| } | |||||
| // See session() for details. | // See session() for details. | ||||
| private Session _create_session(Graph graph, object cfg, bool forceGpu) | private Session _create_session(Graph graph, object cfg, bool forceGpu) | ||||
| { | { | ||||