| @@ -203,49 +203,21 @@ namespace Tensorflow | |||
| 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] | |||
| 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] | |||
| 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() | |||
| @@ -60,21 +60,22 @@ namespace Tensorflow | |||
| var (seed, seed2) = get_seed(op_seed); | |||
| Tensor _seed, _seed2; | |||
| if (seed is null) | |||
| _seed = constant_op.constant(0, dtype: TF_DataType.TF_INT64, name: "seed"); | |||
| _seed = constant_op.constant(0L, name: "seed"); | |||
| 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) | |||
| _seed2 = constant_op.constant(0, dtype: TF_DataType.TF_INT64, name: "seed2"); | |||
| _seed2 = constant_op.constant(0L, name: "seed2"); | |||
| else | |||
| { | |||
| _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( | |||
| 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, | |||
| 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 | |||
| { | |||
| public class Session : BaseSession, ITensorFlowObject | |||
| public class Session : BaseSession | |||
| { | |||
| public Session(string target = "", Graph g = null) : base(target, g, null) | |||
| { } | |||
| @@ -2,7 +2,7 @@ | |||
| <PropertyGroup> | |||
| <TargetFramework>netstandard2.0</TargetFramework> | |||
| <AssemblyName>TensorFlow.NET</AssemblyName> | |||
| <AssemblyName>Tensorflow.Binding</AssemblyName> | |||
| <RootNamespace>Tensorflow</RootNamespace> | |||
| <TargetTensorFlow>2.2.0</TargetTensorFlow> | |||
| <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] | |||
| public void Dispose() | |||
| { | |||
| if (tf.Context.executing_eagerly()) | |||
| tf.Context.ScopeName = old_scope_name; | |||
| else | |||
| get_default_graph()._name_stack = old_scope_name; | |||
| } | |||
| [DebuggerStepThrough] | |||
| public void __exit__() | |||
| { | |||
| if (tf.Context.executing_eagerly()) | |||
| tf.Context.ScopeName = old_scope_name; | |||
| else | |||
| get_default_graph()._name_stack = old_scope_name; | |||
| } | |||
| [DebuggerNonUserCode] | |||
| @@ -33,18 +33,20 @@ namespace Tensorflow.Keras.Engine | |||
| else | |||
| 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; | |||
| } | |||
| @@ -26,26 +26,27 @@ namespace Tensorflow.Keras.Engine | |||
| var graph = keras.backend.get_graph(); | |||
| 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(); | |||
| return outputs; | |||
| @@ -60,7 +60,7 @@ Keras is an API designed for human beings, not machines. Keras follows best prac | |||
| </PropertyGroup> | |||
| <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="Newtonsoft.Json" Version="13.0.1" /> | |||
| <PackageReference Include="SharpZipLib" Version="1.3.3" /> | |||
| @@ -252,35 +252,10 @@ namespace TensorFlowNET.UnitTest | |||
| //else | |||
| //{ | |||
| s = self._create_session(graph, config, force_gpu); | |||
| self._constrain_devices_and_set_default(s, use_gpu, force_gpu); | |||
| //} | |||
| 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. | |||
| private Session _create_session(Graph graph, object cfg, bool forceGpu) | |||
| { | |||
| @@ -42,10 +42,7 @@ namespace TensorFlowNET.UnitTest.Basics | |||
| public void ImportSavedModel() | |||
| { | |||
| tf_with(Session.LoadFromSavedModel("mobilenet"), sess => | |||
| { | |||
| }); | |||
| Session.LoadFromSavedModel("mobilenet"); | |||
| } | |||
| public void ImportGraphDefFromPbFile() | |||
| @@ -266,35 +266,10 @@ namespace TensorFlowNET.UnitTest | |||
| //else | |||
| //{ | |||
| s = self._create_session(graph, config, force_gpu); | |||
| self._constrain_devices_and_set_default(s, use_gpu, force_gpu); | |||
| //} | |||
| 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. | |||
| private Session _create_session(Graph graph, object cfg, bool forceGpu) | |||
| { | |||