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.1 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 AveragePooling2D()
  19. {
  20. var x = tf.constant(new float[,]
  21. {
  22. { 1, 2, 3 },
  23. { 4, 5, 6 },
  24. { 7, 8, 9 }
  25. });
  26. x = tf.reshape(x, (1, 3, 3, 1));
  27. var avg_pool_2d = keras.layers.AveragePooling2D(pool_size: (2, 2),
  28. strides: (1, 1), padding: "valid");
  29. Tensor avg = avg_pool_2d.Apply(x);
  30. Assert.AreEqual((1, 2, 2, 1), avg.shape);
  31. Equal(new float[] { 3, 4, 6, 7 }, avg.ToArray<float>());
  32. }
  33. [TestMethod]
  34. public void InputLayer()
  35. {
  36. var model = keras.Sequential(new List<ILayer>
  37. {
  38. keras.layers.InputLayer(input_shape: 4),
  39. keras.layers.Dense(8)
  40. });
  41. model.compile(optimizer: keras.optimizers.RMSprop(0.001f),
  42. loss: keras.losses.MeanSquaredError(),
  43. metrics: new[] { "accuracy" });
  44. model.fit(np.zeros((10, 4), dtype: tf.float32), np.ones((10, 8), dtype: tf.float32));
  45. }
  46. [TestMethod]
  47. public void Sequential()
  48. {
  49. var model = keras.Sequential();
  50. model.add(keras.Input(shape: 16));
  51. }
  52. [TestMethod]
  53. public void Functional()
  54. {
  55. var layers = keras.layers;
  56. var inputs = keras.Input(shape: 784);
  57. Assert.AreEqual((-1, 784), inputs.shape);
  58. var dense = layers.Dense(64, activation: keras.activations.Relu);
  59. var x = dense.Apply(inputs);
  60. x = layers.Dense(64, activation: keras.activations.Relu).Apply(x);
  61. var outputs = layers.Dense(10).Apply(x);
  62. var model = keras.Model(inputs, outputs, name: "mnist_model");
  63. model.summary();
  64. }
  65. /// <summary>
  66. /// Custom layer test, used in Dueling DQN
  67. /// </summary>
  68. [TestMethod, Ignore]
  69. public void TensorFlowOpLayer()
  70. {
  71. var layers = keras.layers;
  72. var inputs = layers.Input(shape: 24);
  73. var x = layers.Dense(128, activation: "relu").Apply(inputs);
  74. var value = layers.Dense(24).Apply(x);
  75. var adv = layers.Dense(1).Apply(x);
  76. var mean = adv - tf.reduce_mean(adv, axis: 1, keepdims: true);
  77. adv = layers.Subtract().Apply((adv, mean));
  78. var outputs = layers.Add().Apply((value, adv));
  79. var model = keras.Model(inputs, outputs);
  80. model.compile(optimizer: keras.optimizers.RMSprop(0.001f),
  81. loss: keras.losses.MeanSquaredError(),
  82. metrics: new[] { "acc" });
  83. model.summary();
  84. Assert.AreEqual(model.Layers.Count, 8);
  85. var result = model.predict(tf.constant(np.arange(24).astype(np.float32)[np.newaxis, Slice.All]));
  86. Assert.AreEqual(result.shape, new Shape(1, 24));
  87. model.fit(np.arange(24).astype(np.float32)[np.newaxis, Slice.All], np.arange(24).astype(np.float32)[np.newaxis, Slice.All], verbose: 0);
  88. }
  89. /// <summary>
  90. /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding
  91. /// </summary>
  92. [TestMethod]
  93. public void Embedding()
  94. {
  95. var model = keras.Sequential();
  96. var layer = keras.layers.Embedding(1000, 64, input_length: 10);
  97. model.add(layer);
  98. var input_array = np.random.randint(1000, size: (32, 10));
  99. model.compile("rmsprop", "mse", new[] { "accuracy" });
  100. var output_array = model.predict(input_array);
  101. Assert.AreEqual((32, 10, 64), output_array.shape);
  102. }
  103. /// <summary>
  104. /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense
  105. /// </summary>
  106. [TestMethod]
  107. public void Dense()
  108. {
  109. // Create a `Sequential` model and add a Dense layer as the first layer.
  110. var model = keras.Sequential();
  111. model.add(keras.Input(shape: 16));
  112. model.add(keras.layers.Dense(32, activation: keras.activations.Relu));
  113. // Now the model will take as input arrays of shape (None, 16)
  114. // and output arrays of shape (None, 32).
  115. // Note that after the first layer, you don't need to specify
  116. // the size of the input anymore:
  117. model.add(keras.layers.Dense(32));
  118. Assert.AreEqual((-1, 32), model.output_shape);
  119. }
  120. [TestMethod]
  121. [Ignore]
  122. public void SimpleRNN()
  123. {
  124. var inputs = np.random.rand(32, 10, 8).astype(np.float32);
  125. var simple_rnn = keras.layers.SimpleRNN(4);
  126. var output = simple_rnn.Apply(inputs);
  127. Assert.AreEqual((32, 4), output.shape);
  128. }
  129. [TestMethod]
  130. public void Resizing()
  131. {
  132. var inputs = tf.random.uniform((10, 32, 32, 3));
  133. var layer = keras.layers.preprocessing.Resizing(16, 16);
  134. var output = layer.Apply(inputs);
  135. Assert.AreEqual((10, 16, 16, 3), output.shape);
  136. }
  137. [TestMethod]
  138. public void LayerNormalization()
  139. {
  140. var inputs = tf.constant(np.arange(10).reshape((5, 2)) * 10, dtype: tf.float32);
  141. var layer = keras.layers.LayerNormalization(axis: 1);
  142. Tensor output = layer.Apply(inputs);
  143. Assert.AreEqual((5, 2), output.shape);
  144. Assert.IsTrue(output[0].numpy().Equals(new[] { -0.99998f, 0.99998f }));
  145. }
  146. }
  147. }