You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ArrayOpsTest.cs 15 kB

2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using Tensorflow.NumPy;
  3. using Tensorflow;
  4. using static Tensorflow.Binding;
  5. using System.Linq;
  6. using Tensorflow.Operations;
  7. namespace TensorFlowNET.UnitTest.ManagedAPI
  8. {
  9. [TestClass]
  10. public class ArrayOpsTest : EagerModeTestBase
  11. {
  12. /// <summary>
  13. /// https://www.tensorflow.org/api_docs/python/tf/slice
  14. /// </summary>
  15. [TestMethod]
  16. public void Slice()
  17. {
  18. // Tests based on example code in TF documentation
  19. 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)));
  20. var indices = tf.constant(np.array(new int[] { 0, 2 }));
  21. 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 }));
  22. Assert.AreEqual(new Shape(1,1,3), r1.shape);
  23. var r1np = r1.numpy();
  24. Assert.AreEqual(r1np[0, 0, 0], 3);
  25. Assert.AreEqual(r1np[0, 0, 1], 3);
  26. Assert.AreEqual(r1np[0, 0, 2], 3);
  27. 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 }));
  28. Assert.AreEqual(new Shape(1, 2, 3), r2.shape);
  29. var r2np = r2.numpy();
  30. Assert.AreEqual(r2np[0, 0, 0], 3);
  31. Assert.AreEqual(r2np[0, 0, 1], 3);
  32. Assert.AreEqual(r2np[0, 0, 2], 3);
  33. Assert.AreEqual(r2np[0, 1, 0], 4);
  34. Assert.AreEqual(r2np[0, 1, 1], 4);
  35. Assert.AreEqual(r2np[0, 1, 2], 4);
  36. 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 }));
  37. Assert.AreEqual(new Shape(2, 1, 3), r3.shape);
  38. var r3np = r3.numpy();
  39. Assert.AreEqual(r3np[0, 0, 0], 3);
  40. Assert.AreEqual(r3np[0, 0, 1], 3);
  41. Assert.AreEqual(r3np[0, 0, 2], 3);
  42. Assert.AreEqual(r3np[1, 0, 0], 5);
  43. Assert.AreEqual(r3np[1, 0, 1], 5);
  44. Assert.AreEqual(r3np[1, 0, 2], 5);
  45. }
  46. /// <summary>
  47. /// https://www.tensorflow.org/api_docs/python/tf/gather
  48. /// </summary>
  49. [TestMethod]
  50. public void Gather()
  51. {
  52. var input_array = tf.constant(np.arange(12).reshape((3, 4)).astype(np.float32));
  53. var indices = tf.constant(np.array(new int[] { 0, 2 }));
  54. var result = array_ops.gather(input_array, indices);
  55. Assert.AreEqual(new Shape(2, 4), result.shape);
  56. Assert.AreEqual(result.numpy()[0, 0], 0.0f);
  57. Assert.AreEqual(result.numpy()[0, 1], 1.0f);
  58. Assert.AreEqual(result.numpy()[1, 3], 11.0f);
  59. // Tests based on example code in Python doc string for tf.gather()
  60. var p1 = tf.random.normal(new Shape(5, 6, 7, 8));
  61. var i1 = tf.random_uniform(new Shape(10, 11), maxval: 7, dtype: tf.int32);
  62. var r1 = tf.gather(p1, i1, axis:2);
  63. Assert.AreEqual(new Shape(5, 6, 10, 11, 8), r1.shape);
  64. var p2 = tf.random.normal(new Shape(4,3));
  65. var i2 = tf.constant(new int[,] { { 0, 2} });
  66. var r2 = tf.gather(p2, i2, axis: 0);
  67. Assert.AreEqual(new Shape(1, 2, 3), r2.shape);
  68. var r3 = tf.gather(p2, i2, axis: 1);
  69. Assert.AreEqual(new Shape(4,1,2), r3.shape);
  70. }
  71. /// <summary>
  72. /// https://www.tensorflow.org/api_docs/python/tf/TensorArray
  73. /// </summary>
  74. [TestMethod]
  75. public void TensorArray()
  76. {
  77. var ta = tf.TensorArray(tf.float32, size: 0, dynamic_size: true, clear_after_read: false);
  78. ta.write(0, 10);
  79. ta.write(1, 20);
  80. ta.write(2, 30);
  81. Assert.AreEqual(ta.read(0).numpy(), 10f);
  82. Assert.AreEqual(ta.read(1).numpy(), 20f);
  83. Assert.AreEqual(ta.read(2).numpy(), 30f);
  84. }
  85. /// <summary>
  86. /// https://www.tensorflow.org/api_docs/python/tf/reverse
  87. /// </summary>
  88. [TestMethod]
  89. public void ReverseArray()
  90. {
  91. var a = tf.random.normal((2, 3));
  92. var b = tf.reverse(a, -1);
  93. Assert.IsTrue(Equal(a[0].ToArray<float>().Reverse().ToArray(), b[0].ToArray<float>()));
  94. Assert.IsTrue(Equal(a[1].ToArray<float>().Reverse().ToArray(), b[1].ToArray<float>()));
  95. }
  96. [TestMethod]
  97. public void ReverseImgArray3D()
  98. {
  99. // 创建 sourceImg 数组
  100. var sourceImgArray = new float[,,] {
  101. {
  102. { 237, 28, 36 },
  103. { 255, 255, 255 },
  104. { 255, 255, 255 }
  105. },
  106. {
  107. { 255, 255, 255 },
  108. { 255, 255, 255 },
  109. { 255, 255, 255 }
  110. }
  111. };
  112. var sourceImg = ops.convert_to_tensor(sourceImgArray);
  113. // 创建 lrImg 数组
  114. var lrImgArray = new float[,,] {
  115. {
  116. { 255, 255, 255 },
  117. { 255, 255, 255 },
  118. { 237, 28, 36 }
  119. },
  120. {
  121. { 255, 255, 255 },
  122. { 255, 255, 255 },
  123. { 255, 255, 255 }
  124. }
  125. };
  126. var lrImg = ops.convert_to_tensor(lrImgArray);
  127. var lr = tf.image.flip_left_right(sourceImg);
  128. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
  129. var lr2 = tf.reverse(sourceImg, 1);
  130. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
  131. var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
  132. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
  133. // 创建 udImg 数组
  134. var udImgArray = new float[,,] {
  135. {
  136. { 255, 255, 255 },
  137. { 255, 255, 255 },
  138. { 255, 255, 255 }
  139. },
  140. {
  141. { 237, 28, 36 },
  142. { 255, 255, 255 },
  143. { 255, 255, 255 }
  144. }
  145. };
  146. var udImg = ops.convert_to_tensor(udImgArray);
  147. var ud = tf.image.flip_up_down(sourceImg);
  148. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
  149. var ud2 = tf.reverse(sourceImg, new Axis(0));
  150. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=0) fail.");
  151. var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
  152. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=0 fail.");
  153. }
  154. [TestMethod]
  155. public void ReverseImgArray4D()
  156. {
  157. // 原图左上角,加一张左右翻转后的图片
  158. var m = new float[,,,] {
  159. {
  160. {
  161. { 237, 28, 36 },
  162. { 255, 255, 255 },
  163. { 255, 255, 255 }
  164. },
  165. {
  166. { 255, 255, 255 },
  167. { 255, 255, 255 },
  168. { 255, 255, 255 }
  169. }
  170. },
  171. {
  172. {
  173. { 255, 255, 255 },
  174. { 255, 255, 255 },
  175. { 237, 28, 36 }
  176. },
  177. {
  178. { 255, 255, 255 },
  179. { 255, 255, 255 },
  180. { 255, 255, 255 }
  181. }
  182. }
  183. };
  184. var sourceImg = ops.convert_to_tensor(m);
  185. var lrArray = new float[,,,] {
  186. {
  187. {
  188. { 255, 255, 255 },
  189. { 255, 255, 255 },
  190. { 237, 28, 36 },
  191. },
  192. {
  193. { 255, 255, 255 },
  194. { 255, 255, 255 },
  195. { 255, 255, 255 }
  196. }
  197. },
  198. {
  199. {
  200. { 237, 28, 36 },
  201. { 255, 255, 255 },
  202. { 255, 255, 255 },
  203. },
  204. {
  205. { 255, 255, 255 },
  206. { 255, 255, 255 },
  207. { 255, 255, 255 }
  208. }
  209. }
  210. };
  211. var lrImg = ops.convert_to_tensor(lrArray);
  212. // 创建 ud 数组
  213. var udArray = new float[,,,] {
  214. {
  215. {
  216. { 255, 255, 255 },
  217. { 255, 255, 255 },
  218. { 255, 255, 255 }
  219. },
  220. {
  221. { 237, 28, 36 },
  222. { 255, 255, 255 },
  223. { 255, 255, 255 }
  224. }
  225. },
  226. {
  227. {
  228. { 255, 255, 255 },
  229. { 255, 255, 255 },
  230. { 255, 255, 255 }
  231. },
  232. {
  233. { 255, 255, 255 },
  234. { 255, 255, 255 },
  235. { 237, 28, 36 }
  236. }
  237. }
  238. };
  239. var udImg = ops.convert_to_tensor(udArray);
  240. var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
  241. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
  242. var ud2 = tf.reverse(sourceImg, new Axis(1));
  243. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
  244. var ud = tf.image.flip_up_down(sourceImg);
  245. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
  246. // 左右翻转
  247. var lr = tf.image.flip_left_right(sourceImg);
  248. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
  249. var lr2 = tf.reverse(sourceImg, 0);
  250. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
  251. var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
  252. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
  253. }
  254. [TestMethod]
  255. public void ReverseImgArray4D_3x3()
  256. {
  257. // 原图左上角,加一张左右翻转后的图片
  258. var m = new float[,,,] {
  259. {
  260. {
  261. { 237, 28, 36 },
  262. { 255, 255, 255 },
  263. { 255, 255, 255 }
  264. },
  265. {
  266. { 255, 255, 255 },
  267. { 255, 255, 255 },
  268. { 255, 255, 255 }
  269. },
  270. {
  271. { 255, 255, 255 },
  272. { 255, 255, 255 },
  273. { 255, 255, 255 }
  274. }
  275. },
  276. {
  277. {
  278. { 255, 255, 255 },
  279. { 255, 255, 255 },
  280. { 237, 28, 36 }
  281. },
  282. {
  283. { 255, 255, 255 },
  284. { 255, 255, 255 },
  285. { 255, 255, 255 }
  286. },
  287. {
  288. { 255, 255, 255 },
  289. { 255, 255, 255 },
  290. { 255, 255, 255 }
  291. }
  292. }
  293. };
  294. var sourceImg = ops.convert_to_tensor(m);
  295. var lrArray = new float[,,,] {
  296. {
  297. {
  298. { 255, 255, 255 },
  299. { 255, 255, 255 },
  300. { 237, 28, 36 },
  301. },
  302. {
  303. { 255, 255, 255 },
  304. { 255, 255, 255 },
  305. { 255, 255, 255 }
  306. },
  307. {
  308. { 255, 255, 255 },
  309. { 255, 255, 255 },
  310. { 255, 255, 255 }
  311. }
  312. },
  313. {
  314. {
  315. { 237, 28, 36 },
  316. { 255, 255, 255 },
  317. { 255, 255, 255 },
  318. },
  319. {
  320. { 255, 255, 255 },
  321. { 255, 255, 255 },
  322. { 255, 255, 255 }
  323. },
  324. {
  325. { 255, 255, 255 },
  326. { 255, 255, 255 },
  327. { 255, 255, 255 }
  328. }
  329. }
  330. };
  331. var lrImg = ops.convert_to_tensor(lrArray);
  332. // 创建 ud 数组
  333. var udArray = new float[,,,] {
  334. {
  335. {
  336. { 255, 255, 255 },
  337. { 255, 255, 255 },
  338. { 255, 255, 255 }
  339. },
  340. {
  341. { 255, 255, 255 },
  342. { 255, 255, 255 },
  343. { 255, 255, 255 }
  344. },
  345. {
  346. { 237, 28, 36 },
  347. { 255, 255, 255 },
  348. { 255, 255, 255 }
  349. }
  350. },
  351. { {
  352. { 255, 255, 255 },
  353. { 255, 255, 255 },
  354. { 255, 255, 255 }
  355. },
  356. {
  357. { 255, 255, 255 },
  358. { 255, 255, 255 },
  359. { 255, 255, 255 }
  360. },
  361. {
  362. { 255, 255, 255 },
  363. { 255, 255, 255 },
  364. { 237, 28, 36 }
  365. }
  366. }
  367. };
  368. var udImg = ops.convert_to_tensor(udArray);
  369. var ud3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 1 }));
  370. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
  371. var ud2 = tf.reverse(sourceImg, new Axis(1));
  372. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
  373. var ud = tf.image.flip_up_down(sourceImg);
  374. Assert.IsTrue(Equal(udImg.numpy().ToArray<float>(), ud.numpy().ToArray<float>()), "tf.image.flip_up_down fail.");
  375. // 左右翻转
  376. var lr = tf.image.flip_left_right(sourceImg);
  377. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr.numpy().ToArray<float>()), "tf.image.flip_left_right fail.");
  378. var lr2 = tf.reverse(sourceImg, 0);
  379. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr2.numpy().ToArray<float>()), "tf.reverse (axis=1) fail.");
  380. var lr3 = gen_array_ops.reverse_v2(sourceImg, ops.convert_to_tensor(new[] { 0 }));
  381. Assert.IsTrue(Equal(lrImg.numpy().ToArray<float>(), lr3.numpy().ToArray<float>()), "gen_array_ops.reverse_v2 axis=1 fail.");
  382. }
  383. }
  384. }