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