From ff27eae6dd638ec5c59b0a87c4afb363eaf988f2 Mon Sep 17 00:00:00 2001 From: Thibault Neveu Date: Mon, 25 Jun 2018 16:35:45 +0100 Subject: [PATCH] Model dumps --- demo/webapp/public/js/DDPG/ddpg.js | 19 ---------------- demo/webapp/public/js/DDPG/ddpg_agent.js | 16 +++++++++++++ demo/webapp/public/js/DDPG/index.js | 21 +++++------------- demo/webapp/public/js/level1.js | 2 +- .../models/ddpg/actor-model-ddpg-agent.json | 1 + .../ddpg/actor-model-ddpg-agent.weights.bin | Bin 0 -> 13192 bytes .../models/ddpg/critic-model-ddpg-agent.json | 1 + .../ddpg/critic-model-ddpg-agent.weights.bin | Bin 0 -> 13828 bytes 8 files changed, 25 insertions(+), 35 deletions(-) create mode 100644 demo/webapp/public/models/ddpg/actor-model-ddpg-agent.json create mode 100644 demo/webapp/public/models/ddpg/actor-model-ddpg-agent.weights.bin create mode 100644 demo/webapp/public/models/ddpg/critic-model-ddpg-agent.json create mode 100644 demo/webapp/public/models/ddpg/critic-model-ddpg-agent.weights.bin diff --git a/demo/webapp/public/js/DDPG/ddpg.js b/demo/webapp/public/js/DDPG/ddpg.js index 3655528..63fd1cc 100644 --- a/demo/webapp/public/js/DDPG/ddpg.js +++ b/demo/webapp/public/js/DDPG/ddpg.js @@ -211,26 +211,7 @@ class DDPG { return tf.mean(tfQPredictions0).mul(tf.scalar(-1.)) }, true, this.actorWeights); - /* - const sanityTfLoss = tf.tidy(() => { - const tfQPredictions0 = this.criticTargetWithActor(tfObs0); - const mn = tf.mean(tfQPredictions0); - const loss = mn.mul(tf.scalar(-1)); - return loss; - }); - - const sanityLoss = sanityTfLoss.buffer().values[0]; - - - if (sanityLoss == loss){ - console.warn("Sanity check failed. The optimisation have no effet here."); - } - */ - - //if (this.trainActorCt % 200 == 0 && this.trainActorCt != 0){ targetUpdate(this.actorTarget, this.actor, this.config); - //} - //this.trainActorCt += 1; const loss = actorLoss.buffer().values[0]; actorLoss.dispose(); diff --git a/demo/webapp/public/js/DDPG/ddpg_agent.js b/demo/webapp/public/js/DDPG/ddpg_agent.js index 553575b..2a6050c 100644 --- a/demo/webapp/public/js/DDPG/ddpg_agent.js +++ b/demo/webapp/public/js/DDPG/ddpg_agent.js @@ -51,6 +51,22 @@ class DDPGAgent { this.ddpg = new DDPG(this.actor, this.critic, this.memory, this.noise, this.config); } + save(env){ + /* + Save the network + */ + this.ddpg.critic.model.save('downloads://critic-model-ddpg-agent'); + this.ddpg.actor.model.save('downloads://actor-model-ddpg-agent'); + } + + async restore(){ + /* + Restore the weights of the network + */ + this.ddpg.critic.model = await tf.loadModel('http://localhost:3000/public/models/ddpg/critic-model-ddpg-agent.json'); + this.ddpg.actor.model = await tf.loadModel("http://localhost:3000/public/models/ddpg/actor-model-ddpg-agent.json"); + } + /** * Play one step */ diff --git a/demo/webapp/public/js/DDPG/index.js b/demo/webapp/public/js/DDPG/index.js index 6ceed76..2eacb40 100644 --- a/demo/webapp/public/js/DDPG/index.js +++ b/demo/webapp/public/js/DDPG/index.js @@ -51,10 +51,6 @@ env.load().then(() => { RECORD = false; }); - env.addEvent("trainOnRecord", () => { - agent.ddpg.trainRecord(); - }); - env.addEvent("TrainRealTime", () => { env.steping(false); agent.train(true); @@ -66,17 +62,12 @@ env.load().then(() => { env.addEvent("reset_env"); - env.addEvent("load", (content) => { - content = JSON.parse(content); + env.addEvent("save", () => { + agent.save(); + }); - for (let c=0; c < content.obs0.length; c++){ - if (content.obs0[c] != 0){ - agent.ddpg.memory.append(content.obs0[c], content.actions[c], content.rewards[c], content.obs0[c], content.terminals[c]); - } - } - - console.log("dataReady"); - - }, {local: true}); + env.addEvent("load", () => { + agent.restore() + }); }); diff --git a/demo/webapp/public/js/level1.js b/demo/webapp/public/js/level1.js index 513f8de..c40dc16 100644 --- a/demo/webapp/public/js/level1.js +++ b/demo/webapp/public/js/level1.js @@ -30,6 +30,6 @@ env.load().then(() => { env.addEvent("save", () => agent.save()); env.addEvent("load", () => { document.getElementById("metacar_canvas_button_train").style.display = "none"; - agent.restore() + agent.restore(); }); }); diff --git a/demo/webapp/public/models/ddpg/actor-model-ddpg-agent.json b/demo/webapp/public/models/ddpg/actor-model-ddpg-agent.json new file mode 100644 index 0000000..3cc61fd --- /dev/null +++ b/demo/webapp/public/models/ddpg/actor-model-ddpg-agent.json @@ -0,0 +1 @@ +{"modelTopology":{"class_name":"Model","config":{"name":"model1","layers":[{"name":"input1","class_name":"InputLayer","config":{"batch_input_shape":[null,17],"dtype":"float32","sparse":false,"name":"input1"},"inbound_nodes":[]},{"name":"dense_Dense1","class_name":"Dense","config":{"units":64,"activation":"relu","use_bias":true,"kernel_initializer":{"class_name":"VarianceScaling","config":{"scale":1,"mode":"fan_avg","distribution":"uniform","seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense1","trainable":true},"inbound_nodes":[[["input1",0,0,{}]]]},{"name":"dense_Dense2","class_name":"Dense","config":{"units":32,"activation":"relu","use_bias":true,"kernel_initializer":{"class_name":"VarianceScaling","config":{"scale":1,"mode":"fan_avg","distribution":"uniform","seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense2","trainable":true},"inbound_nodes":[[["dense_Dense1",0,0,{}]]]},{"name":"dense_Dense3","class_name":"Dense","config":{"units":2,"activation":"tanh","use_bias":true,"kernel_initializer":{"class_name":"RandomUniform","config":{"minval":0.003,"maxval":0.003,"seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense3","trainable":true},"inbound_nodes":[[["dense_Dense2",0,0,{}]]]}],"input_layers":[["input1",0,0]],"output_layers":[["dense_Dense3",0,0]]},"keras_version":"tfjs-layers 0.6.6","backend":"tensor_flow.js"},"weightsManifest":[{"paths":["./actor-model-ddpg-agent.weights.bin"],"weights":[{"name":"dense_Dense1/kernel","shape":[17,64],"dtype":"float32"},{"name":"dense_Dense1/bias","shape":[64],"dtype":"float32"},{"name":"dense_Dense2/kernel","shape":[64,32],"dtype":"float32"},{"name":"dense_Dense2/bias","shape":[32],"dtype":"float32"},{"name":"dense_Dense3/kernel","shape":[32,2],"dtype":"float32"},{"name":"dense_Dense3/bias","shape":[2],"dtype":"float32"}]}]} \ No newline at end of file diff --git a/demo/webapp/public/models/ddpg/actor-model-ddpg-agent.weights.bin b/demo/webapp/public/models/ddpg/actor-model-ddpg-agent.weights.bin new file mode 100644 index 0000000000000000000000000000000000000000..5ed364cb5311567bdd68f6790294d03a80e62c96 GIT binary patch literal 13192 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�DD1TIT@pSH1KI}I?qiGWhYJU^X6c}^+rdr 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 literal 0 HcmV?d00001 diff --git a/demo/webapp/public/models/ddpg/critic-model-ddpg-agent.json b/demo/webapp/public/models/ddpg/critic-model-ddpg-agent.json new file mode 100644 index 0000000..0f8345c --- /dev/null +++ b/demo/webapp/public/models/ddpg/critic-model-ddpg-agent.json @@ -0,0 +1 @@ +{"modelTopology":{"class_name":"Model","config":{"name":"model2","layers":[{"name":"input2","class_name":"InputLayer","config":{"batch_input_shape":[null,2],"dtype":"float32","sparse":false,"name":"input2"},"inbound_nodes":[]},{"name":"input1","class_name":"InputLayer","config":{"batch_input_shape":[null,17],"dtype":"float32","sparse":false,"name":"input1"},"inbound_nodes":[]},{"name":"dense_Dense5","class_name":"Dense","config":{"units":64,"activation":"linear","use_bias":true,"kernel_initializer":{"class_name":"VarianceScaling","config":{"scale":1,"mode":"fan_avg","distribution":"uniform","seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense5","trainable":true},"inbound_nodes":[[["input2",0,0,{}]]]},{"name":"dense_Dense4","class_name":"Dense","config":{"units":64,"activation":"linear","use_bias":true,"kernel_initializer":{"class_name":"VarianceScaling","config":{"scale":1,"mode":"fan_avg","distribution":"uniform","seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense4","trainable":true},"inbound_nodes":[[["input1",0,0,{}]]]},{"name":"add_Add1","class_name":"Add","config":{"name":"add_Add1","trainable":true},"inbound_nodes":[[["dense_Dense5",0,0,{}],["dense_Dense4",0,0,{}]]]},{"name":"dense_Dense6","class_name":"Dense","config":{"units":32,"activation":"relu","use_bias":true,"kernel_initializer":{"class_name":"VarianceScaling","config":{"scale":1,"mode":"fan_avg","distribution":"uniform","seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense6","trainable":true},"inbound_nodes":[[["add_Add1",0,0,{}]]]},{"name":"dense_Dense7","class_name":"Dense","config":{"units":1,"activation":"linear","use_bias":true,"kernel_initializer":{"class_name":"RandomUniform","config":{"minval":0.003,"maxval":0.003,"seed":0}},"bias_initializer":{"class_name":"Zeros","config":{}},"kernel_regularizer":null,"bias_regularizer":null,"activity_regularizer":null,"kernel_constraint":null,"bias_constraint":null,"name":"dense_Dense7","trainable":true},"inbound_nodes":[[["dense_Dense6",0,0,{}]]]}],"input_layers":[["input1",0,0],["input2",0,0]],"output_layers":[["dense_Dense7",0,0]]},"keras_version":"tfjs-layers 0.6.6","backend":"tensor_flow.js"},"weightsManifest":[{"paths":["./critic-model-ddpg-agent.weights.bin"],"weights":[{"name":"dense_Dense5/kernel","shape":[2,64],"dtype":"float32"},{"name":"dense_Dense5/bias","shape":[64],"dtype":"float32"},{"name":"dense_Dense4/kernel","shape":[17,64],"dtype":"float32"},{"name":"dense_Dense4/bias","shape":[64],"dtype":"float32"},{"name":"dense_Dense6/kernel","shape":[64,32],"dtype":"float32"},{"name":"dense_Dense6/bias","shape":[32],"dtype":"float32"},{"name":"dense_Dense7/kernel","shape":[32,1],"dtype":"float32"},{"name":"dense_Dense7/bias","shape":[1],"dtype":"float32"}]}]} \ No newline at end of file diff --git a/demo/webapp/public/models/ddpg/critic-model-ddpg-agent.weights.bin b/demo/webapp/public/models/ddpg/critic-model-ddpg-agent.weights.bin new file mode 100644 index 0000000000000000000000000000000000000000..82a1e3c59749280ca3e32f4bc4ead483647b3fc5 GIT binary patch literal 13828 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 a{aSgf$gLQxtJ=c;i#Z1RK~6y3#NdD4a$&Oo literal 0 HcmV?d00001