|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using Tensorflow.NumPy;
- using Tensorflow;
- using static Tensorflow.Binding;
- using System.Linq;
- using Tensorflow.Operations;
-
- namespace TensorFlowNET.UnitTest.ManagedAPI
- {
- [TestClass]
- public class ArrayOpsTest : EagerModeTestBase
- {
- /// <summary>
- /// https://www.tensorflow.org/api_docs/python/tf/slice
- /// </summary>
- [TestMethod]
- public void Slice()
- {
- // Tests based on example code in TF documentation
- var input_array = tf.constant(np.array(new int[] { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 }).reshape((3,2,3)));
- var indices = tf.constant(np.array(new int[] { 0, 2 }));
-
- var r1 = array_ops.slice(input_array, ops.convert_n_to_tensor(new object[] { 1, 0, 0 }), ops.convert_n_to_tensor(new object[] { 1, 1, 3 }));
- Assert.AreEqual(new Shape(1,1,3), r1.shape);
- var r1np = r1.numpy();
- Assert.AreEqual(r1np[0, 0, 0], 3);
- Assert.AreEqual(r1np[0, 0, 1], 3);
- Assert.AreEqual(r1np[0, 0, 2], 3);
-
-
- var r2 = array_ops.slice(input_array, ops.convert_n_to_tensor(new object[] { 1, 0, 0 }), ops.convert_n_to_tensor(new object[] { 1, 2, 3 }));
- Assert.AreEqual(new Shape(1, 2, 3), r2.shape);
- var r2np = r2.numpy();
- Assert.AreEqual(r2np[0, 0, 0], 3);
- Assert.AreEqual(r2np[0, 0, 1], 3);
- Assert.AreEqual(r2np[0, 0, 2], 3);
- Assert.AreEqual(r2np[0, 1, 0], 4);
- Assert.AreEqual(r2np[0, 1, 1], 4);
- Assert.AreEqual(r2np[0, 1, 2], 4);
-
- var r3 = array_ops.slice(input_array, ops.convert_n_to_tensor(new object[] { 1, 0, 0 }), ops.convert_n_to_tensor(new object[] { 2, 1, 3 }));
- Assert.AreEqual(new Shape(2, 1, 3), r3.shape);
- var r3np = r3.numpy();
- Assert.AreEqual(r3np[0, 0, 0], 3);
- Assert.AreEqual(r3np[0, 0, 1], 3);
- Assert.AreEqual(r3np[0, 0, 2], 3);
- Assert.AreEqual(r3np[1, 0, 0], 5);
- Assert.AreEqual(r3np[1, 0, 1], 5);
- Assert.AreEqual(r3np[1, 0, 2], 5);
- }
-
- /// <summary>
- /// https://www.tensorflow.org/api_docs/python/tf/gather
- /// </summary>
- [TestMethod]
- public void Gather()
- {
- var input_array = tf.constant(np.arange(12).reshape((3, 4)).astype(np.float32));
- var indices = tf.constant(np.array(new int[] { 0, 2 }));
-
- var result = array_ops.gather(input_array, indices);
- Assert.AreEqual(new Shape(2, 4), result.shape);
- Assert.AreEqual(result.numpy()[0, 0], 0.0f);
- Assert.AreEqual(result.numpy()[0, 1], 1.0f);
- Assert.AreEqual(result.numpy()[1, 3], 11.0f);
-
- // Tests based on example code in Python doc string for tf.gather()
-
- var p1 = tf.random.normal(new Shape(5, 6, 7, 8));
- var i1 = tf.random_uniform(new Shape(10, 11), maxval: 7, dtype: tf.int32);
- var r1 = tf.gather(p1, i1, axis:2);
- Assert.AreEqual(new Shape(5, 6, 10, 11, 8), r1.shape);
-
- var p2 = tf.random.normal(new Shape(4,3));
- var i2 = tf.constant(new int[,] { { 0, 2} });
- var r2 = tf.gather(p2, i2, axis: 0);
- Assert.AreEqual(new Shape(1, 2, 3), r2.shape);
-
- var r3 = tf.gather(p2, i2, axis: 1);
- Assert.AreEqual(new Shape(4,1,2), r3.shape);
- }
-
- /// <summary>
- /// https://www.tensorflow.org/api_docs/python/tf/TensorArray
- /// </summary>
- [TestMethod]
- public void TensorArray()
- {
- var ta = tf.TensorArray(tf.float32, size: 0, dynamic_size: true, clear_after_read: false);
- ta.write(0, 10);
- ta.write(1, 20);
- ta.write(2, 30);
- Assert.AreEqual(ta.read(0).numpy(), 10f);
- Assert.AreEqual(ta.read(1).numpy(), 20f);
- Assert.AreEqual(ta.read(2).numpy(), 30f);
- }
-
- /// <summary>
- /// https://www.tensorflow.org/api_docs/python/tf/reverse
- /// </summary>
- [TestMethod]
- public void ReverseArray()
- {
- var a = tf.random.normal((2, 3));
- var b = tf.reverse(a, -1);
- Assert.IsTrue(Equal(a[0].ToArray<float>().Reverse().ToArray(), b[0].ToArray<float>()));
- Assert.IsTrue(Equal(a[1].ToArray<float>().Reverse().ToArray(), b[1].ToArray<float>()));
- }
-
- [TestMethod]
- public void ReverseImgArray3D()
- {
- // 创建 sourceImg 数组
- var sourceImgArray = new float[,,] {
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- };
- var sourceImg = ops.convert_to_tensor(sourceImgArray);
-
- // 创建 lrImg 数组
- var lrImgArray = new float[,,] {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- };
- var lrImg = ops.convert_to_tensor(lrImgArray);
-
- var lr = tf.image.flip_left_right(sourceImg);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
-
- var lr2 = tf.reverse(sourceImg, 1);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
-
- var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
-
- // 创建 udImg 数组
- var udImgArray = new float[,,] {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- };
- var udImg = ops.convert_to_tensor(udImgArray);
-
- var ud = tf.image.flip_up_down(sourceImg);
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
-
- var ud2 = tf.reverse(sourceImg, new Axis(0));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=0) fail.");
-
- var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=0 fail.");
- }
-
- [TestMethod]
- public void ReverseImgArray4D()
- {
- // 原图左上角,加一张左右翻转后的图片
- var m = new float[,,,] {
- {
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- }
- };
- var sourceImg = ops.convert_to_tensor(m);
-
- var lrArray = new float[,,,] {
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 },
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- {
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 },
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- }
- };
- var lrImg = ops.convert_to_tensor(lrArray);
-
- // 创建 ud 数组
- var udArray = new float[,,,] {
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 }
- }
- }
- };
- var udImg = ops.convert_to_tensor(udArray);
-
- var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
-
- var ud2 = tf.reverse(sourceImg, new Axis(1));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
-
- var ud = tf.image.flip_up_down(sourceImg);
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
-
- // 左右翻转
- var lr = tf.image.flip_left_right(sourceImg);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
-
- var lr2 = tf.reverse(sourceImg, 0);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
-
- var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
-
- }
-
- [TestMethod]
- public void ReverseImgArray4D_3x3()
- {
- // 原图左上角,加一张左右翻转后的图片
- var m = new float[,,,] {
- {
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- }
- };
- var sourceImg = ops.convert_to_tensor(m);
-
- var lrArray = new float[,,,] {
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 },
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- {
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 },
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- }
- };
- var lrImg = ops.convert_to_tensor(lrArray);
-
- // 创建 ud 数组
- var udArray = new float[,,,] {
- {
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 237, 28, 36 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- }
- },
- { {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 255, 255, 255 }
- },
- {
- { 255, 255, 255 },
- { 255, 255, 255 },
- { 237, 28, 36 }
- }
- }
- };
- var udImg = ops.convert_to_tensor(udArray);
-
- var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
-
- var ud2 = tf.reverse(sourceImg, new Axis(1));
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
-
- var ud = tf.image.flip_up_down(sourceImg);
- Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
-
- // 左右翻转
- var lr = tf.image.flip_left_right(sourceImg);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
-
- var lr2 = tf.reverse(sourceImg, 0);
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
-
- var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
- Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
-
- }
- }
- }
|