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.

SessionTest.cs 7.4 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using FluentAssertions;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using NumSharp;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using Tensorflow;
  8. using Tensorflow.Util;
  9. using static Tensorflow.Binding;
  10. namespace TensorFlowNET.UnitTest.NativeAPI
  11. {
  12. [TestClass]
  13. public class SessionTest : CApiTest
  14. {
  15. /// <summary>
  16. /// tensorflow\c\c_api_test.cc
  17. /// `TEST(CAPI, Session)`
  18. /// </summary>
  19. [TestMethod, Ignore]
  20. public void Session()
  21. {
  22. lock (Locks.ProcessWide)
  23. {
  24. var s = new Status();
  25. var graph = new Graph().as_default();
  26. // Make a placeholder operation.
  27. var feed = c_test_util.Placeholder(graph, s);
  28. // Make a constant operation with the scalar "2".
  29. var two = c_test_util.ScalarConst(2, graph, s);
  30. // Add operation.
  31. var add = c_test_util.Add(feed, two, graph, s);
  32. var csession = new CSession(graph, s);
  33. ASSERT_EQ(TF_Code.TF_OK, s.Code);
  34. // Run the graph.
  35. var inputs = new Dictionary<Operation, Tensor>();
  36. inputs.Add(feed, new Tensor(3));
  37. csession.SetInputs(inputs);
  38. var outputs = new TF_Output[] { new TF_Output(add, 0) };
  39. csession.SetOutputs(outputs);
  40. csession.Run(s);
  41. Tensor outTensor = csession.output_tensor(0);
  42. EXPECT_EQ(TF_DataType.TF_INT32, outTensor.dtype);
  43. EXPECT_EQ(0, outTensor.NDims);
  44. ASSERT_EQ((ulong)sizeof(uint), outTensor.bytesize);
  45. var output_contents = outTensor.ToArray<int>();
  46. EXPECT_EQ(3 + 2, output_contents[0]);
  47. // Add another operation to the graph.
  48. var neg = c_test_util.Neg(add, graph, s);
  49. ASSERT_EQ(TF_Code.TF_OK, s.Code);
  50. // Run up to the new operation.
  51. inputs = new Dictionary<Operation, Tensor>();
  52. inputs.Add(feed, new Tensor(7));
  53. csession.SetInputs(inputs);
  54. outputs = new TF_Output[] { new TF_Output(neg, 0) };
  55. csession.SetOutputs(outputs);
  56. csession.Run(s);
  57. ASSERT_EQ(TF_Code.TF_OK, s.Code);
  58. outTensor = csession.output_tensor(0);
  59. ASSERT_TRUE(outTensor != IntPtr.Zero);
  60. EXPECT_EQ(TF_DataType.TF_INT32, outTensor.dtype);
  61. EXPECT_EQ(0, outTensor.NDims); // scalar
  62. ASSERT_EQ((ulong)sizeof(uint), outTensor.bytesize);
  63. output_contents = outTensor.ToArray<int>();
  64. EXPECT_EQ(-(7 + 2), output_contents[0]);
  65. // Clean up
  66. csession.CloseAndDelete(s);
  67. ASSERT_EQ(TF_Code.TF_OK, s.Code);
  68. }
  69. }
  70. [TestMethod]
  71. public void EvalTensor()
  72. {
  73. lock (this)
  74. {
  75. var a = constant_op.constant(np.array(3.0).reshape(1, 1));
  76. var b = constant_op.constant(np.array(2.0).reshape(1, 1));
  77. var c = math_ops.matmul(a, b, name: "matmul");
  78. using (var sess = tf.Session())
  79. {
  80. var result = c.eval(sess);
  81. Assert.AreEqual(6, result.GetAtIndex<double>(0));
  82. }
  83. }
  84. }
  85. [TestMethod]
  86. public void Eval_SmallString_Scalar()
  87. {
  88. lock (this)
  89. {
  90. var a = constant_op.constant("123 heythere 123 ", TF_DataType.TF_STRING);
  91. var c = tf.strings.substr(a, 4, 8);
  92. using (var sess = tf.Session())
  93. {
  94. var result = UTF8Encoding.UTF8.GetString((byte[])c.eval(sess));
  95. Console.WriteLine(result);
  96. result.Should().Be("heythere");
  97. }
  98. }
  99. }
  100. [TestMethod]
  101. public void Eval_LargeString_Scalar()
  102. {
  103. lock (this)
  104. {
  105. const int size = 30_000;
  106. var a = constant_op.constant(new string('a', size), TF_DataType.TF_STRING);
  107. var c = tf.strings.substr(a, 0, size - 5000);
  108. using (var sess = tf.Session())
  109. {
  110. var result = UTF8Encoding.UTF8.GetString((byte[])c.eval(sess));
  111. Console.WriteLine(result);
  112. result.Should().HaveLength(size - 5000).And.ContainAll("a");
  113. }
  114. }
  115. }
  116. [TestMethod]
  117. public void Autocast_Case0()
  118. {
  119. var sess = tf.Session().as_default();
  120. ITensorOrOperation operation = tf.global_variables_initializer();
  121. // the cast to ITensorOrOperation is essential for the test of this method signature
  122. var ret = sess.run(operation);
  123. ret.Should().BeNull();
  124. }
  125. [TestMethod]
  126. public void Autocast_Case1()
  127. {
  128. var sess = tf.Session().as_default();
  129. var input = tf.placeholder(tf.float32, shape: new TensorShape(6));
  130. var op = tf.reshape(input, new int[] { 2, 3 });
  131. sess.run(tf.global_variables_initializer());
  132. var ret = sess.run(op, feed_dict: (input, np.array(1, 2, 3, 4, 5, 6)));
  133. ret.Should().BeOfType<float>().And.BeShaped(2, 3).And.BeOfValues(1, 2, 3, 4, 5, 6);
  134. print(ret.dtype);
  135. print(ret);
  136. }
  137. [TestMethod]
  138. public void Autocast_Case2()
  139. {
  140. var sess = tf.Session().as_default();
  141. var input = tf.placeholder(tf.float64, shape: new TensorShape(6));
  142. var op = tf.reshape(input, new int[] { 2, 3 });
  143. sess.run(tf.global_variables_initializer());
  144. var ret = sess.run(op, feed_dict: (input, np.array(1, 2, 3, 4, 5, 6).astype(NPTypeCode.Single) + 0.1f));
  145. ret.Should().BeOfType<double>().And.BeShaped(2, 3).And.BeOfValuesApproximately(0.001d, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1);
  146. print(ret.dtype);
  147. print(ret);
  148. }
  149. [TestMethod]
  150. public void Autocast_Case3()
  151. {
  152. var sess = tf.Session().as_default();
  153. var input = tf.placeholder(tf.int64, shape: new TensorShape(6));
  154. var op = tf.reshape(input, new int[] { 2, 3 });
  155. sess.run(tf.global_variables_initializer());
  156. var ret = sess.run(op, feed_dict: (input, np.array(1, 2, 3, 4, 5, 6).astype(NPTypeCode.Single) + 0.1f));
  157. ret.Should().BeOfType<long>().And.BeShaped(2, 3).And.BeOfValues(1, 2, 3, 4, 5, 6);
  158. print(ret.dtype);
  159. print(ret);
  160. }
  161. [TestMethod]
  162. public void Autocast_Case4()
  163. {
  164. var sess = tf.Session().as_default();
  165. var input = tf.placeholder(tf.byte8, shape: new TensorShape(6));
  166. var op = tf.reshape(input, new int[] { 2, 3 });
  167. sess.run(tf.global_variables_initializer());
  168. var ret = sess.run(op, feed_dict: (input, np.array(1, 2, 3, 4, 5, 6).astype(NPTypeCode.Single) + 0.1f));
  169. ret.Should().BeOfType<byte>().And.BeShaped(2, 3).And.BeOfValues(1, 2, 3, 4, 5, 6);
  170. print(ret.dtype);
  171. print(ret);
  172. }
  173. }
  174. }