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