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