diff --git a/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs b/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs index 57af6b16..f7e6155c 100644 --- a/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs +++ b/test/TensorFlowNET.Keras.UnitTest/Layers/LayersTest.cs @@ -35,6 +35,72 @@ namespace TensorFlowNET.Keras.UnitTest var model = keras.Model(inputs, outputs, name: "mnist_model"); model.summary(); } + + /// + /// Custom layer test, used in Dueling DQN + /// + [TestMethod, Ignore] + public void FunctionalTest() + { + var layers = keras.layers; + var inputs = layers.Input(shape: 24); + var x = layers.Dense(128, activation:"relu").Apply(inputs); + var value = layers.Dense(24).Apply(x); + var adv = layers.Dense(1).Apply(x); + + var adv_out = adv - Binding.tf.reduce_mean(adv, axis: 1, keepdims: true); // Here's problem. + var outputs = layers.Add().Apply(new Tensors(adv_out, value)); + var model = keras.Model(inputs, outputs); + model.summary(); + model.compile(optimizer: keras.optimizers.RMSprop(0.001f), + loss: keras.losses.MeanSquaredError(), + metrics: new[] { "acc" }); + // Here we consider the adv_out is one layer, which is a little different from py's version + Assert.AreEqual(model.Layers.Count, 6); + + // py code: + //from tensorflow.keras.layers import Input, Dense, Add, Subtract, Lambda + //from tensorflow.keras.models import Model + //from tensorflow.keras.optimizers import RMSprop + //import tensorflow.keras.backend as K + + //inputs = Input(24) + //x = Dense(128, activation = "relu")(inputs) + //value = Dense(24)(x) + //adv = Dense(1)(x) + //meam = Lambda(lambda x: K.mean(x, axis = 1, keepdims = True))(adv) + //adv = Subtract()([adv, meam]) + //outputs = Add()([value, adv]) + //model = Model(inputs, outputs) + //model.compile(loss = "mse", optimizer = RMSprop(1e-3)) + //model.summary() + + //py output: + //Model: "functional_3" + //__________________________________________________________________________________________________ + //Layer(type) Output Shape Param # Connected to + //================================================================================================== + //input_2 (InputLayer) [(None, 24)] 0 + //__________________________________________________________________________________________________ + //dense_3 (Dense) (None, 128) 3200 input_2[0][0] + //__________________________________________________________________________________________________ + //dense_5 (Dense) (None, 1) 129 dense_3[0][0] + //__________________________________________________________________________________________________ + //lambda_1 (Lambda) (None, 1) 0 dense_5[0][0] + //__________________________________________________________________________________________________ + //dense_4 (Dense) (None, 24) 3096 dense_3[0][0] + //__________________________________________________________________________________________________ + //subtract_1 (Subtract) (None, 1) 0 dense_5[0][0] + // lambda_1[0][0] + //__________________________________________________________________________________________________ + //add_1 (Add) (None, 24) 0 dense_4[0][0] + // subtract_1[0][0] + //================================================================================================== + //Total params: 6,425 + //Trainable params: 6,425 + //Non-trainable params: 0 + //__________________________________________________________________________________________________ + } /// /// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding