diff --git a/TensorFlow.NET.sln b/TensorFlow.NET.sln
index ffc39b5a..8cf330e0 100644
--- a/TensorFlow.NET.sln
+++ b/TensorFlow.NET.sln
@@ -19,6 +19,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Recommenders", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Native.UnitTest", "test\TensorFlowNET.Native.UnitTest\Tensorflow.Native.UnitTest.csproj", "{84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Keras.UnitTest", "test\TensorFlowNET.Keras.UnitTest\Tensorflow.Keras.UnitTest.csproj", "{79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -227,6 +229,30 @@ Global
{84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x64.Build.0 = Release|Any CPU
{84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x86.ActiveCfg = Release|Any CPU
{84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x86.Build.0 = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|x64.ActiveCfg = Debug|x64
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|x64.Build.0 = Debug|x64
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|x86.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|Any CPU.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|Any CPU.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|x64.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|x64.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|x86.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug-Minimal|x86.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|Any CPU.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|Any CPU.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|x64.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|x64.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|x86.ActiveCfg = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Publish|x86.Build.0 = Debug|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.ActiveCfg = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.Build.0 = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x86.ActiveCfg = Release|Any CPU
+ {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/TensorFlowNET.Core/Tensorflow.Binding.csproj b/src/TensorFlowNET.Core/Tensorflow.Binding.csproj
index 635ef5d0..aea2ac4f 100644
--- a/src/TensorFlowNET.Core/Tensorflow.Binding.csproj
+++ b/src/TensorFlowNET.Core/Tensorflow.Binding.csproj
@@ -82,7 +82,7 @@ TensorFlow .NET v0.3x is focused on making more Keras API works
-
+
diff --git a/test/TensorFlowNET.Keras.UnitTest/EagerModeTestBase.cs b/test/TensorFlowNET.Keras.UnitTest/EagerModeTestBase.cs
new file mode 100644
index 00000000..566ade30
--- /dev/null
+++ b/test/TensorFlowNET.Keras.UnitTest/EagerModeTestBase.cs
@@ -0,0 +1,50 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using static Tensorflow.Binding;
+
+namespace TensorFlowNET.Keras.UnitTest
+{
+ public class EagerModeTestBase
+ {
+ [TestInitialize]
+ public void TestInit()
+ {
+ if (!tf.executing_eagerly())
+ tf.enable_eager_execution();
+ tf.Context.ensure_initialized();
+ }
+
+ [TestCleanup]
+ public void TestClean()
+ {
+ }
+
+ public bool Equal(float[] f1, float[] f2)
+ {
+ bool ret = false;
+ var tolerance = .000001f;
+ for (var i = 0; i < f1.Length; i++)
+ {
+ ret = Math.Abs(f1[i] - f2[i]) <= tolerance;
+ if (!ret)
+ break;
+ }
+
+ return ret;
+ }
+
+ public bool Equal(double[] d1, double[] d2)
+ {
+ bool ret = false;
+ var tolerance = .000000000000001f;
+ for (var i = 0; i < d1.Length; i++)
+ {
+ ret = Math.Abs(d1[i] - d2[i]) <= tolerance;
+ if (!ret)
+ break;
+ }
+
+ return ret;
+ }
+ }
+}
diff --git a/test/TensorFlowNET.UnitTest/Keras/ActivationTest.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/ActivationTest.cs
similarity index 56%
rename from test/TensorFlowNET.UnitTest/Keras/ActivationTest.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/ActivationTest.cs
index d26a2ac7..62e8ae28 100644
--- a/test/TensorFlowNET.UnitTest/Keras/ActivationTest.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/ActivationTest.cs
@@ -6,7 +6,7 @@ using NumSharp;
using static Tensorflow.KerasApi;
using Tensorflow;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class ActivationTest : EagerModeTestBase
@@ -16,11 +16,7 @@ namespace TensorFlowNET.UnitTest.Keras
{
var layer = keras.layers.LeakyReLU();
Tensor output = layer.Apply(np.array(-3.0f, -1.0f, 0.0f, 2.0f));
- var outputArray = output.ToArray();
- assertFloat32Equal(-0.9f, outputArray[0], "Not equal");
- assertFloat32Equal(-0.3f, outputArray[1], "Not equal");
- assertFloat32Equal(0.0f, outputArray[2], "Not equal");
- assertFloat32Equal(2.0f, outputArray[3], "Not equal");
+ Equal(new[] { -0.9f, -0.3f, 0.0f, 2.0f }, output.ToArray());
}
}
}
diff --git a/test/TensorFlowNET.UnitTest/Keras/CosineSimilarity.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/CosineSimilarity.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/CosineSimilarity.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/CosineSimilarity.Test.cs
index 70e07264..5d2fa9e5 100644
--- a/test/TensorFlowNET.UnitTest/Keras/CosineSimilarity.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/CosineSimilarity.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class CosineSimilarity
diff --git a/test/TensorFlowNET.UnitTest/Keras/Huber.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/Huber.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/Huber.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/Huber.Test.cs
index cbc16eab..538c281f 100644
--- a/test/TensorFlowNET.UnitTest/Keras/Huber.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/Huber.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class Huber
diff --git a/test/TensorFlowNET.UnitTest/Keras/Layers.Merging.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Merging.Test.cs
similarity index 93%
rename from test/TensorFlowNET.UnitTest/Keras/Layers.Merging.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Merging.Test.cs
index 5dad1390..785bd2b6 100644
--- a/test/TensorFlowNET.UnitTest/Keras/Layers.Merging.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Merging.Test.cs
@@ -3,7 +3,7 @@ using NumSharp;
using Tensorflow;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class LayersMergingTest : EagerModeTestBase
diff --git a/test/TensorFlowNET.UnitTest/Keras/Layers.Reshaping.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Reshaping.Test.cs
similarity index 96%
rename from test/TensorFlowNET.UnitTest/Keras/Layers.Reshaping.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Reshaping.Test.cs
index 6ce816d6..74f19a08 100644
--- a/test/TensorFlowNET.UnitTest/Keras/Layers.Reshaping.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/Layers.Reshaping.Test.cs
@@ -3,7 +3,7 @@ using NumSharp;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class LayersReshapingTest : EagerModeTestBase
diff --git a/test/TensorFlowNET.UnitTest/Keras/LayersTest.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs
similarity index 94%
rename from test/TensorFlowNET.UnitTest/Keras/LayersTest.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs
index c6858ba0..57af6b16 100644
--- a/test/TensorFlowNET.UnitTest/Keras/LayersTest.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs
@@ -3,7 +3,7 @@ using NumSharp;
using Tensorflow;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
///
/// https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/layers
@@ -24,7 +24,7 @@ namespace TensorFlowNET.UnitTest.Keras
var layers = keras.layers;
var inputs = keras.Input(shape: 784);
- Assert.AreEqual((None, 784), inputs.TensorShape);
+ Assert.AreEqual((-1, 784), inputs.TensorShape);
var dense = layers.Dense(64, activation: keras.activations.Relu);
var x = dense.Apply(inputs);
@@ -59,7 +59,7 @@ namespace TensorFlowNET.UnitTest.Keras
});
// model.compile("rmsprop", "mse");
var output_array = model.predict(input_array);
- Assert.AreEqual((32, 10, 64), output_array.TensorShape);
+ Assert.AreEqual((32, 10, 64), output_array.shape);
}
///
diff --git a/test/TensorFlowNET.UnitTest/Keras/LogCosh.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/LogCosh.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/LogCosh.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/LogCosh.Test.cs
index 48d2d862..8cbbfbae 100644
--- a/test/TensorFlowNET.UnitTest/Keras/LogCosh.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/LogCosh.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class LogCosh
diff --git a/test/TensorFlowNET.UnitTest/Keras/MeanAbsoluteError.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsoluteError.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/MeanAbsoluteError.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsoluteError.Test.cs
index 2b7a2504..5055efdf 100644
--- a/test/TensorFlowNET.UnitTest/Keras/MeanAbsoluteError.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsoluteError.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class MeanAbsoluteError
diff --git a/test/TensorFlowNET.UnitTest/Keras/MeanAbsolutePercentageError.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsolutePercentageError.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/MeanAbsolutePercentageError.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsolutePercentageError.Test.cs
index 97b43503..acd9a142 100644
--- a/test/TensorFlowNET.UnitTest/Keras/MeanAbsolutePercentageError.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanAbsolutePercentageError.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class MeanAbsolutePercentageError
diff --git a/test/TensorFlowNET.UnitTest/Keras/MeanSquaredError.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredError.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/MeanSquaredError.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredError.Test.cs
index f1c782f8..4d94d119 100644
--- a/test/TensorFlowNET.UnitTest/Keras/MeanSquaredError.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredError.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class MeanSquaredErrorTest
diff --git a/test/TensorFlowNET.UnitTest/Keras/MeanSquaredLogarithmicError.Test.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredLogarithmicError.Test.cs
similarity index 98%
rename from test/TensorFlowNET.UnitTest/Keras/MeanSquaredLogarithmicError.Test.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredLogarithmicError.Test.cs
index 28499143..e5b0cf3b 100644
--- a/test/TensorFlowNET.UnitTest/Keras/MeanSquaredLogarithmicError.Test.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/MeanSquaredLogarithmicError.Test.cs
@@ -5,7 +5,7 @@ using Tensorflow.Keras.Losses;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
[TestClass]
public class MeanSquaredLogarithmicError
diff --git a/test/TensorFlowNET.UnitTest/Keras/ModelSaveTest.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/ModelSaveTest.cs
similarity index 95%
rename from test/TensorFlowNET.UnitTest/Keras/ModelSaveTest.cs
rename to test/TensorFlowNET.Keras.UnitTest/Layers/ModelSaveTest.cs
index 901ecf02..0a1098af 100644
--- a/test/TensorFlowNET.UnitTest/Keras/ModelSaveTest.cs
+++ b/test/TensorFlowNET.Keras.UnitTest/Layers/ModelSaveTest.cs
@@ -2,7 +2,7 @@
using Tensorflow.Keras.Engine;
using static Tensorflow.KerasApi;
-namespace TensorFlowNET.UnitTest.Keras
+namespace TensorFlowNET.Keras.UnitTest
{
///
/// https://www.tensorflow.org/guide/keras/save_and_serialize
diff --git a/test/TensorFlowNET.Keras.UnitTest/Tensorflow.Keras.UnitTest.csproj b/test/TensorFlowNET.Keras.UnitTest/Tensorflow.Keras.UnitTest.csproj
new file mode 100644
index 00000000..e9d5b8ef
--- /dev/null
+++ b/test/TensorFlowNET.Keras.UnitTest/Tensorflow.Keras.UnitTest.csproj
@@ -0,0 +1,28 @@
+
+
+
+ netcoreapp3.1
+
+ false
+
+ AnyCPU;x64
+
+
+
+ DEBUG;TRACE
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+