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.6 kB

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