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.

LayersTest.cs 6.3 kB

4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using Tensorflow.NumPy;
  3. using System.Collections.Generic;
  4. using Tensorflow;
  5. using Tensorflow.Keras;
  6. using static Tensorflow.Binding;
  7. using static Tensorflow.KerasApi;
  8. using System.Linq;
  9. namespace TensorFlowNET.Keras.UnitTest
  10. {
  11. /// <summary>
  12. /// https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/layers
  13. /// </summary>
  14. [TestClass]
  15. public class LayersTest : EagerModeTestBase
  16. {
  17. // [TestMethod]
  18. public void InputLayer()
  19. {
  20. var model = keras.Sequential(new List<ILayer>
  21. {
  22. keras.layers.InputLayer(input_shape: 4),
  23. keras.layers.Dense(8)
  24. });
  25. model.compile(optimizer: keras.optimizers.RMSprop(0.001f));
  26. model.fit(np.zeros((10, 4)), np.ones((10, 8)));
  27. }
  28. [TestMethod]
  29. public void Sequential()
  30. {
  31. var model = keras.Sequential();
  32. model.add(keras.Input(shape: 16));
  33. }
  34. [TestMethod]
  35. public void Functional()
  36. {
  37. var layers = keras.layers;
  38. var inputs = keras.Input(shape: 784);
  39. Assert.AreEqual((-1, 784), inputs.shape);
  40. var dense = layers.Dense(64, activation: keras.activations.Relu);
  41. var x = dense.Apply(inputs);
  42. x = layers.Dense(64, activation: keras.activations.Relu).Apply(x);
  43. var outputs = layers.Dense(10).Apply(x);
  44. var model = keras.Model(inputs, outputs, name: "mnist_model");
  45. model.summary();
  46. }
  47. /// <summary>
  48. /// Custom layer test, used in Dueling DQN
  49. /// </summary>
  50. [TestMethod, Ignore]
  51. public void TensorFlowOpLayer()
  52. {
  53. var layers = keras.layers;
  54. var inputs = layers.Input(shape: 24);
  55. var x = layers.Dense(128, activation: "relu").Apply(inputs);
  56. var value = layers.Dense(24).Apply(x);
  57. var adv = layers.Dense(1).Apply(x);
  58. var mean = adv - tf.reduce_mean(adv, axis: 1, keepdims: true);
  59. adv = layers.Subtract().Apply((adv, mean));
  60. var outputs = layers.Add().Apply((value, adv));
  61. var model = keras.Model(inputs, outputs);
  62. model.compile(optimizer: keras.optimizers.RMSprop(0.001f),
  63. loss: keras.losses.MeanSquaredError(),
  64. metrics: new[] { "acc" });
  65. model.summary();
  66. Assert.AreEqual(model.Layers.Count, 8);
  67. var result = model.predict(tf.constant(np.arange(24).astype(np.float32)[np.newaxis, Slice.All]));
  68. Assert.AreEqual(result.shape, new Shape(1, 24));
  69. model.fit(np.arange(24).astype(np.float32)[np.newaxis, Slice.All], np.arange(24).astype(np.float32)[np.newaxis, Slice.All], verbose: 0);
  70. }
  71. /// <summary>
  72. /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding
  73. /// </summary>
  74. [TestMethod]
  75. public void Embedding_Simple()
  76. {
  77. var emb = keras.layers.Embedding(256, 12, input_length: 4);
  78. var input_array = np.arange(12).reshape((3, 4)).astype(np.float32);
  79. var output = emb.Apply(input_array);
  80. Assert.AreEqual((3, 4, 12), output.shape);
  81. }
  82. /// <summary>
  83. /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding
  84. /// </summary>
  85. [TestMethod]
  86. [Ignore]
  87. public void Embedding()
  88. {
  89. var model = keras.Sequential();
  90. var layer = keras.layers.Embedding(7, 2, input_length: 4);
  91. model.add(layer);
  92. // the model will take as input an integer matrix of size (batch,
  93. // input_length).
  94. // the largest integer (i.e. word index) in the input should be no larger
  95. // than 999 (vocabulary size).
  96. // now model.output_shape == (None, 10, 64), where None is the batch
  97. // dimension.
  98. var input_array = np.array(new int[,]
  99. {
  100. { 1, 2, 3, 4 },
  101. { 2, 3, 4, 5 },
  102. { 3, 4, 5, 6 }
  103. });
  104. // model.compile("rmsprop", "mse");
  105. var output_array = model.predict(input_array);
  106. Assert.AreEqual((32, 10, 64), output_array.shape);
  107. }
  108. /// <summary>
  109. /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense
  110. /// </summary>
  111. [TestMethod]
  112. public void Dense()
  113. {
  114. // Create a `Sequential` model and add a Dense layer as the first layer.
  115. var model = keras.Sequential();
  116. model.add(keras.Input(shape: 16));
  117. model.add(keras.layers.Dense(32, activation: keras.activations.Relu));
  118. // Now the model will take as input arrays of shape (None, 16)
  119. // and output arrays of shape (None, 32).
  120. // Note that after the first layer, you don't need to specify
  121. // the size of the input anymore:
  122. model.add(keras.layers.Dense(32));
  123. Assert.AreEqual((-1, 32), model.output_shape);
  124. }
  125. [TestMethod]
  126. [Ignore]
  127. public void SimpleRNN()
  128. {
  129. var inputs = np.random.rand(32, 10, 8).astype(np.float32);
  130. var simple_rnn = keras.layers.SimpleRNN(4);
  131. var output = simple_rnn.Apply(inputs);
  132. Assert.AreEqual((32, 4), output.shape);
  133. }
  134. [TestMethod]
  135. public void Resizing()
  136. {
  137. var inputs = tf.random.uniform((10, 32, 32, 3));
  138. var layer = keras.layers.preprocessing.Resizing(16, 16);
  139. var output = layer.Apply(inputs);
  140. Assert.AreEqual((10, 16, 16, 3), output.shape);
  141. }
  142. [TestMethod]
  143. public void LayerNormalization()
  144. {
  145. var inputs = tf.constant(np.arange(10).reshape((5, 2)) * 10, dtype: tf.float32);
  146. var layer = keras.layers.LayerNormalization(axis: 1);
  147. Tensor output = layer.Apply(inputs);
  148. Assert.AreEqual((5, 2), output.shape);
  149. Assert.IsTrue(output[0].numpy().Equals(new[] { -0.99998f, 0.99998f }));
  150. }
  151. }
  152. }