|
|
@@ -35,6 +35,72 @@ namespace TensorFlowNET.Keras.UnitTest |
|
|
|
var model = keras.Model(inputs, outputs, name: "mnist_model"); |
|
|
|
model.summary(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Custom layer test, used in Dueling DQN |
|
|
|
/// </summary> |
|
|
|
[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 |
|
|
|
//__________________________________________________________________________________________________ |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding |
|
|
|