From 56899033d2c9235dd9128941aab8104fc414fca3 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:49:38 +0800 Subject: [PATCH 01/29] Create A --- chapter3_obs/Q1/A | 1 + 1 file changed, 1 insertion(+) create mode 100644 chapter3_obs/Q1/A diff --git a/chapter3_obs/Q1/A b/chapter3_obs/Q1/A new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/chapter3_obs/Q1/A @@ -0,0 +1 @@ + From be372c06b03e50eee020f5c5e79c037839666b3c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:50:26 +0800 Subject: [PATCH 02/29] Add files via upload --- chapter3_obs/Q1/analyse.md | 7 ++ chapter3_obs/Q1/loss_plt1.png | Bin 0 -> 2396 bytes chapter3_obs/Q1/loss_plt2.png | Bin 0 -> 2396 bytes chapter3_obs/Q1/loss_plt3.png | Bin 0 -> 2396 bytes chapter3_obs/Q1/q1.log | 33 +++++ chapter3_obs/Q1/q1.py | 228 ++++++++++++++++++++++++++++++++++ 6 files changed, 268 insertions(+) create mode 100644 chapter3_obs/Q1/analyse.md create mode 100644 chapter3_obs/Q1/loss_plt1.png create mode 100644 chapter3_obs/Q1/loss_plt2.png create mode 100644 chapter3_obs/Q1/loss_plt3.png create mode 100644 chapter3_obs/Q1/q1.log create mode 100644 chapter3_obs/Q1/q1.py diff --git a/chapter3_obs/Q1/analyse.md b/chapter3_obs/Q1/analyse.md new file mode 100644 index 0000000..ea90ca4 --- /dev/null +++ b/chapter3_obs/Q1/analyse.md @@ -0,0 +1,7 @@ +## 收敛可行性 + +根据loss_plt1,loss_plt12,loss_plt3可知,方案2和方案3是收敛可行的。 + +## 最优方案 + +由收敛loss曲线的收敛快慢和平滑性可以得出,方案3是最优方案。三角函数是光滑的周期函数,对于模型的拟合更加有优势。 \ No newline at end of file diff --git a/chapter3_obs/Q1/loss_plt1.png b/chapter3_obs/Q1/loss_plt1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b76927a57ef500630c5495b552a4285d6385662 GIT binary patch literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/loss_plt2.png b/chapter3_obs/Q1/loss_plt2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b76927a57ef500630c5495b552a4285d6385662 GIT binary patch literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/loss_plt3.png b/chapter3_obs/Q1/loss_plt3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b76927a57ef500630c5495b552a4285d6385662 GIT binary patch literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/q1.log b/chapter3_obs/Q1/q1.log new file mode 100644 index 0000000..65fd30d --- /dev/null +++ b/chapter3_obs/Q1/q1.log @@ -0,0 +1,33 @@ +epoch:[ 0] loss:0.9782 accuracy:0.5000 +epoch:[ 10] loss:36.8449 accuracy:0.4986 +epoch:[ 20] loss:32.3964 accuracy:0.5014 +epoch:[ 30] loss:44.1199 accuracy:0.5014 +epoch:[ 40] loss:47.7680 accuracy:0.5014 +epoch:[ 50] loss:47.8981 accuracy:0.5014 +epoch:[ 60] loss:47.3736 accuracy:0.5014 +epoch:[ 70] loss:44.8779 accuracy:0.5014 +epoch:[ 80] loss:32.0941 accuracy:0.5000 +epoch:[ 90] loss:38.6557 accuracy:0.5000 +epoch:[ 0] loss:0.6789 accuracy:0.5329 +epoch:[ 10] loss:0.5207 accuracy:0.9686 +epoch:[ 20] loss:0.2992 accuracy:1.0000 +epoch:[ 30] loss:0.1245 accuracy:1.0000 +epoch:[ 40] loss:0.0435 accuracy:1.0000 +epoch:[ 50] loss:0.0175 accuracy:1.0000 +epoch:[ 60] loss:0.0092 accuracy:1.0000 +epoch:[ 70] loss:0.0060 accuracy:1.0000 +epoch:[ 80] loss:0.0044 accuracy:1.0000 +epoch:[ 90] loss:0.0035 accuracy:1.0000 +epoch:[ 0] loss:0.6706 accuracy:0.5000 +epoch:[ 10] loss:0.2948 accuracy:1.0000 +epoch:[ 20] loss:0.1091 accuracy:1.0000 +epoch:[ 30] loss:0.0388 accuracy:1.0000 +epoch:[ 40] loss:0.0168 accuracy:1.0000 +epoch:[ 50] loss:0.0093 accuracy:1.0000 +epoch:[ 60] loss:0.0062 accuracy:1.0000 +epoch:[ 70] loss:0.0047 accuracy:1.0000 +epoch:[ 80] loss:0.0037 accuracy:1.0000 +epoch:[ 90] loss:0.0031 accuracy:1.0000 +test_1_acc:%.4f 0.5 +test_2_acc:%.4f 1.0 +test_3_acc:%.4f 1.0 \ No newline at end of file diff --git a/chapter3_obs/Q1/q1.py b/chapter3_obs/Q1/q1.py new file mode 100644 index 0000000..08d4969 --- /dev/null +++ b/chapter3_obs/Q1/q1.py @@ -0,0 +1,228 @@ +import torch +import torch.nn as nn +import torch.optim as optim +import torch.utils.data +import torch.nn.functional as F + +import torch +import torch.nn as nn +import numpy as np +import matplotlib.pyplot as plt +import os +os.environ['KMP_DUPLICATE_LIB_OK']='True' + + + + +def one_hot(val: torch.LongTensor, num: int) -> torch.FloatTensor: + """ + **Overview**: + Convert a ``torch.LongTensor`` to one hot encoding with scatter API. + This implementation can be slightly faster than ``torch.nn.functional.one_hot`` . + """ + # Remember original shape of val. + old_shape = val.shape + # Reshape val into 2D tensor. + val_reshape = val.reshape(-1, 1) + # Initialize return tensor with float32 dtype and the same device as val. + ret = torch.zeros(val_reshape.shape[0], num, device=val.device) + # Fill value 1 into tensor ``ret`` , according to the index stored in ``val_reshape`` . It is an inplace operation. + ret.scatter_(1, val_reshape, 1) + # Return the reshaped result with the same prefix shape as original shape of val. + return ret.reshape(*old_shape, num) + + +# delimiter +def get_one_hot_encoding(num: int): + """ + **Overview**: + Implementation of one hot encoding with nn.Embedding API. + """ + # Use the identity matrix as weight tensor. + # Use freezed embedding as fixed one-hot transformation. + return nn.Embedding.from_pretrained(torch.eye(num), freeze=True, padding_idx=None) + + +# delimiter +def get_binary_encoding(bit_num: int): + """ + **Overview**: + Implementation of binary encoding with nn.Embedding API. + """ + # Generate a matrix with shape $$2^{B} \times B $$ where B is the bit_num. + # Each row with index n contains the binary representation of n. + location_embedding = [] + for n in range(2**bit_num): + s = '0' * (bit_num - len(bin(n)[2:])) + bin(n)[2:] + location_embedding.append(list(int(i) for i in s)) + mat = torch.FloatTensor(location_embedding) + # Use the generated result as transformation.. + return torch.nn.Embedding.from_pretrained(mat, freeze=True, padding_idx=None) + + +# delimiter +def test_encoding(): + """ + **Overview**: + Test different encoding methods. + """ + # Test one-hot encoding with nn.Embedding and scatter, compare two float32 dtype tensor. + x = torch.LongTensor([9, 0, 1, 2, 1, 3, 5]) + one_hot_enc = get_one_hot_encoding(10) + y = one_hot_enc(x) + y_ = one_hot(x, num=10) + assert torch.sum(torch.abs(y - y_)) < 1e-6 + # Test binary encoding, compare two int64 dtype tensor. + bin_enc = get_binary_encoding(4) + x = torch.arange(10) + y = bin_enc(x) + ground_truth = torch.LongTensor([ + [0, 0], + [0, 1], + [1, 0], + [1, 1] + ]) + print(y) + print((1%100)%10) + print(torch.randn(10, 2)) + assert torch.eq(y, ground_truth).all() + +class Parity(nn.Module): + def __init__(self, in_size, hidden_size, out_size): + super().__init__() + self.n1 = nn.Linear(in_size, hidden_size) + self.n2 = nn.Linear(hidden_size, out_size) + self.relu = nn.ReLU() + self.sigmoid = nn.Sigmoid() + + def forward(self, x): + x = self.n1(x) + x = self.relu(x) + x = self.n2(x) + out = self.sigmoid(x) + return out + +train_data = np.arange(0, 700, 1) +test_data = np.arange(700, 1000, 1) +bin_enc = get_binary_encoding(10) +Parity1 = Parity(1,32,1) +Parity2 = Parity(10,32,1) +Parity3 = Parity(1,32,1) +pi = torch.pi + +def train_1(): + loss_plt1 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity1.parameters(), lr=0.01) + trainX = torch.tensor(train_data).float().reshape(-1, 1) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity1.train() + for epoch in range(100): + pred = Parity1(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt1.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt1) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.savefig("loss_plt1.png") + plt.close() + +def test_1(): + Parity1.eval() + testX = torch.tensor(test_data).float().reshape(-1, 1) + pred = Parity1(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + + acc = (pred.round() == testY).float().mean() + return acc + +def train_2(): + loss_plt2 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity2.parameters(), lr=0.01) + trainX = torch.tensor(train_data) + trainX = bin_enc(trainX) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity2.train() + for epoch in range(100): + pred = Parity2(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt2.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt2) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.savefig("loss_plt2.png") + plt.close() + +def test_2(): + Parity2.eval() + testX = torch.tensor(test_data) + testX = bin_enc(testX) + pred = Parity2(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + acc = (pred.round() == testY).float().mean() + return acc + +def train_3(): + loss_plt3 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity3.parameters(), lr=0.01) + trainX = torch.tensor(train_data) + trainX = np.sin(np.pi/2*(2*trainX-1)).reshape(-1, 1) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity3.train() + for epoch in range(100): + pred = Parity3(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt3.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt3) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.savefig("loss_plt3.png") + plt.close() + +def test_3(): + Parity3.eval() + testX = torch.tensor(test_data) + testX = np.sin(np.pi/2*(2*testX-1)).reshape(-1, 1) + pred = Parity3(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + acc = (pred.round() == testY).float().mean() + return acc + + +def main(): + train_1() + train_2() + train_3() + print("test_1_acc:%.4f", test_1().item()) + print("test_2_acc:%.4f", test_2().item()) + print("test_3_acc:%.4f", test_3().item()) + + +if __name__ == "__main__": + main() From c2a18d6599d8bd7aa0b55b728ef64d0c48200c7b Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:50:39 +0800 Subject: [PATCH 03/29] Delete A --- chapter3_obs/Q1/A | 1 - 1 file changed, 1 deletion(-) delete mode 100644 chapter3_obs/Q1/A diff --git a/chapter3_obs/Q1/A b/chapter3_obs/Q1/A deleted file mode 100644 index 8b13789..0000000 --- a/chapter3_obs/Q1/A +++ /dev/null @@ -1 +0,0 @@ - From 8d3e295f00fde7a0ba1a424a417ffe1ea3316b11 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:51:00 +0800 Subject: [PATCH 04/29] Create 1 --- chapter3_obs/Q2/1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 chapter3_obs/Q2/1 diff --git a/chapter3_obs/Q2/1 b/chapter3_obs/Q2/1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/chapter3_obs/Q2/1 @@ -0,0 +1 @@ + From 5570912cfc971052c77c5399424c49356a7610f0 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:51:28 +0800 Subject: [PATCH 05/29] Add files via upload --- chapter3_obs/Q2/q2.py | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 chapter3_obs/Q2/q2.py diff --git a/chapter3_obs/Q2/q2.py b/chapter3_obs/Q2/q2.py new file mode 100644 index 0000000..7a4f026 --- /dev/null +++ b/chapter3_obs/Q2/q2.py @@ -0,0 +1,61 @@ +# Please install latest DI-engine's main branch first +from ding.bonus import PPOF + + +def bipedalwalker(): + # Please install bipedalwalker env first, `pip3 install box2d` + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/bipedalwalker_zh.html) for more details + agent = PPOF(env='bipedalwalker', exp_name='./bipedalwalker_demo') + agent.train(step=int(1e6)) + # Classic RL interaction loop and save replay video + agent.deploy(enable_save_replay=True) + + +def evogym_carrier(): + # Please install evogym env first, refer to its doc (https://github.com/EvolutionGym/evogym#installation) + # Or you can use our provided docker (opendilab/ding:nightly-evogym) + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/Evogym_zh.html) for more details + agent = PPOF(env='evogym_carrier', exp_name='./evogym_carrier_demo') + agent.train(step=int(1e6)) + + +def mario(): + # Please install mario env first, `pip install gym-super-mario-bros` + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/gym_super_mario_bros_zh.html) for more details + agent = PPOF(env='mario', exp_name='./mario_demo') + agent.train(step=int(3e6)) + + +def di_sheep(): + # Please prepare di_sheep env and modelfirst, you can copy the env and model file to to current directory, + # which are placed in https://github.com/opendilab/DI-sheep/blob/master/service + from sheep_env import SheepEnv + from sheep_model import SheepModel + env = SheepEnv(level=9) + obs_space = env.observation_space + model = SheepModel( + item_obs_size=obs_space['item_obs'].shape[1], + item_num=obs_space['item_obs'].shape[0], + item_encoder_type='TF', + bucket_obs_size=obs_space['bucket_obs'].shape[0], + global_obs_size=obs_space['global_obs'].shape[0], + ttorch_return=True, + ) + agent = PPOF(env='di_sheep', exp_name='./di_sheep_demo', model=model) + agent.train(step=int(1e6)) + + +def procgen_bigfish(): + # Please install procgen env first, `pip install procgen` + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/procgen_zh.html) for more details + agent = PPOF(env='procgen_bigfish', exp_name='./procgen_bigfish_demo') + agent.train(step=int(1e7)) + + +if __name__ == "__main__": + # You can select and run your favorite demo + # bipedalwalker() + # evogym_carrier() + mario() + # di_sheep() + # procgen_bigfish() \ No newline at end of file From 2397954eaf76260a427594eb69842c6a217fed21 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:51:56 +0800 Subject: [PATCH 06/29] Delete 1 --- chapter3_obs/Q2/1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 chapter3_obs/Q2/1 diff --git a/chapter3_obs/Q2/1 b/chapter3_obs/Q2/1 deleted file mode 100644 index 8b13789..0000000 --- a/chapter3_obs/Q2/1 +++ /dev/null @@ -1 +0,0 @@ - From c61ae2ed52526807cc27b184eafc50f996d06e84 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:42:16 +0800 Subject: [PATCH 07/29] Add files via upload --- chapter3_obs/Q2/q2.log | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 chapter3_obs/Q2/q2.log diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log new file mode 100644 index 0000000..8679b74 --- /dev/null +++ b/chapter3_obs/Q2/q2.log @@ -0,0 +1,86 @@ +[02-15 18:59:21] INFO Env Space Information: func.py:93 +[02-15 18:59:21] INFO Observation Space: Box(0.0, 1.0, (4, 84, 84), float32) func.py:93 +[02-15 18:59:21] INFO Action Space: Discrete(2) func.py:93 +[02-15 18:59:21] INFO Reward Space: Box(-15.0, 15.0, (1,), float32) func.py:93 +D:\muzilyd\anaconda\envs\pytorch-gpu\lib\site-packages\gym\utils\passive_env_checker.py:228: DeprecationWarning: WARN: Core environment is written in old step API which returns one bool instead of two. It is recommended to rewrite the environment with new step API. + "Core environment is written in old step API which returns one bool instead of two. " +[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 +[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 +[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 +[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 +[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 +[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 +[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 +[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 +[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 +[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 +[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 +[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 +[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 +[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 +[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 +[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 +[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 +[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 +[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 +[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 +[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 +[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 +[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 +[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 +[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 +[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 +[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 +[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 +[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 +[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 +[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 +[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 +[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 +[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 +[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 +[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 +[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 +[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 +[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 +[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 +[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 +[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 +[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 +[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 +[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 +[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 +[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 +[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 +[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 +[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 +[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 +[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 +[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 +[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 +[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 +[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 +[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 +[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 +[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 +[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 +[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 +[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 +[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 +[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 +[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 +[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 +[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 +[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 +[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 +[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 +[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 +[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 +[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 +[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 +[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 +[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 +[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 +[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 +[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 +[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 \ No newline at end of file From 8d2543780a7462fa583c8d8aa43d837f71a0df00 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:48:21 +0800 Subject: [PATCH 08/29] Delete q1.py --- chapter3_obs/Q1/q1.py | 228 ------------------------------------------ 1 file changed, 228 deletions(-) delete mode 100644 chapter3_obs/Q1/q1.py diff --git a/chapter3_obs/Q1/q1.py b/chapter3_obs/Q1/q1.py deleted file mode 100644 index 08d4969..0000000 --- a/chapter3_obs/Q1/q1.py +++ /dev/null @@ -1,228 +0,0 @@ -import torch -import torch.nn as nn -import torch.optim as optim -import torch.utils.data -import torch.nn.functional as F - -import torch -import torch.nn as nn -import numpy as np -import matplotlib.pyplot as plt -import os -os.environ['KMP_DUPLICATE_LIB_OK']='True' - - - - -def one_hot(val: torch.LongTensor, num: int) -> torch.FloatTensor: - """ - **Overview**: - Convert a ``torch.LongTensor`` to one hot encoding with scatter API. - This implementation can be slightly faster than ``torch.nn.functional.one_hot`` . - """ - # Remember original shape of val. - old_shape = val.shape - # Reshape val into 2D tensor. - val_reshape = val.reshape(-1, 1) - # Initialize return tensor with float32 dtype and the same device as val. - ret = torch.zeros(val_reshape.shape[0], num, device=val.device) - # Fill value 1 into tensor ``ret`` , according to the index stored in ``val_reshape`` . It is an inplace operation. - ret.scatter_(1, val_reshape, 1) - # Return the reshaped result with the same prefix shape as original shape of val. - return ret.reshape(*old_shape, num) - - -# delimiter -def get_one_hot_encoding(num: int): - """ - **Overview**: - Implementation of one hot encoding with nn.Embedding API. - """ - # Use the identity matrix as weight tensor. - # Use freezed embedding as fixed one-hot transformation. - return nn.Embedding.from_pretrained(torch.eye(num), freeze=True, padding_idx=None) - - -# delimiter -def get_binary_encoding(bit_num: int): - """ - **Overview**: - Implementation of binary encoding with nn.Embedding API. - """ - # Generate a matrix with shape $$2^{B} \times B $$ where B is the bit_num. - # Each row with index n contains the binary representation of n. - location_embedding = [] - for n in range(2**bit_num): - s = '0' * (bit_num - len(bin(n)[2:])) + bin(n)[2:] - location_embedding.append(list(int(i) for i in s)) - mat = torch.FloatTensor(location_embedding) - # Use the generated result as transformation.. - return torch.nn.Embedding.from_pretrained(mat, freeze=True, padding_idx=None) - - -# delimiter -def test_encoding(): - """ - **Overview**: - Test different encoding methods. - """ - # Test one-hot encoding with nn.Embedding and scatter, compare two float32 dtype tensor. - x = torch.LongTensor([9, 0, 1, 2, 1, 3, 5]) - one_hot_enc = get_one_hot_encoding(10) - y = one_hot_enc(x) - y_ = one_hot(x, num=10) - assert torch.sum(torch.abs(y - y_)) < 1e-6 - # Test binary encoding, compare two int64 dtype tensor. - bin_enc = get_binary_encoding(4) - x = torch.arange(10) - y = bin_enc(x) - ground_truth = torch.LongTensor([ - [0, 0], - [0, 1], - [1, 0], - [1, 1] - ]) - print(y) - print((1%100)%10) - print(torch.randn(10, 2)) - assert torch.eq(y, ground_truth).all() - -class Parity(nn.Module): - def __init__(self, in_size, hidden_size, out_size): - super().__init__() - self.n1 = nn.Linear(in_size, hidden_size) - self.n2 = nn.Linear(hidden_size, out_size) - self.relu = nn.ReLU() - self.sigmoid = nn.Sigmoid() - - def forward(self, x): - x = self.n1(x) - x = self.relu(x) - x = self.n2(x) - out = self.sigmoid(x) - return out - -train_data = np.arange(0, 700, 1) -test_data = np.arange(700, 1000, 1) -bin_enc = get_binary_encoding(10) -Parity1 = Parity(1,32,1) -Parity2 = Parity(10,32,1) -Parity3 = Parity(1,32,1) -pi = torch.pi - -def train_1(): - loss_plt1 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity1.parameters(), lr=0.01) - trainX = torch.tensor(train_data).float().reshape(-1, 1) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity1.train() - for epoch in range(100): - pred = Parity1(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt1.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt1) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.savefig("loss_plt1.png") - plt.close() - -def test_1(): - Parity1.eval() - testX = torch.tensor(test_data).float().reshape(-1, 1) - pred = Parity1(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - - acc = (pred.round() == testY).float().mean() - return acc - -def train_2(): - loss_plt2 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity2.parameters(), lr=0.01) - trainX = torch.tensor(train_data) - trainX = bin_enc(trainX) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity2.train() - for epoch in range(100): - pred = Parity2(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt2.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt2) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.savefig("loss_plt2.png") - plt.close() - -def test_2(): - Parity2.eval() - testX = torch.tensor(test_data) - testX = bin_enc(testX) - pred = Parity2(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - acc = (pred.round() == testY).float().mean() - return acc - -def train_3(): - loss_plt3 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity3.parameters(), lr=0.01) - trainX = torch.tensor(train_data) - trainX = np.sin(np.pi/2*(2*trainX-1)).reshape(-1, 1) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity3.train() - for epoch in range(100): - pred = Parity3(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt3.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt3) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.savefig("loss_plt3.png") - plt.close() - -def test_3(): - Parity3.eval() - testX = torch.tensor(test_data) - testX = np.sin(np.pi/2*(2*testX-1)).reshape(-1, 1) - pred = Parity3(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - acc = (pred.round() == testY).float().mean() - return acc - - -def main(): - train_1() - train_2() - train_3() - print("test_1_acc:%.4f", test_1().item()) - print("test_2_acc:%.4f", test_2().item()) - print("test_3_acc:%.4f", test_3().item()) - - -if __name__ == "__main__": - main() From d3d492e9039fe3141f569a3d2ff97bca08e6bb70 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:49:19 +0800 Subject: [PATCH 09/29] Delete loss_plt1.png --- chapter3_obs/Q1/loss_plt1.png | Bin 2396 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 chapter3_obs/Q1/loss_plt1.png diff --git a/chapter3_obs/Q1/loss_plt1.png b/chapter3_obs/Q1/loss_plt1.png deleted file mode 100644 index 4b76927a57ef500630c5495b552a4285d6385662..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL From da2b47b37bb488801c4a95ad053700090838400d Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:49:27 +0800 Subject: [PATCH 10/29] Delete loss_plt2.png --- chapter3_obs/Q1/loss_plt2.png | Bin 2396 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 chapter3_obs/Q1/loss_plt2.png diff --git a/chapter3_obs/Q1/loss_plt2.png b/chapter3_obs/Q1/loss_plt2.png deleted file mode 100644 index 4b76927a57ef500630c5495b552a4285d6385662..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL From d010262b3a5a24c8558de9538243e7567e62a988 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:49:33 +0800 Subject: [PATCH 11/29] Delete loss_plt3.png --- chapter3_obs/Q1/loss_plt3.png | Bin 2396 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 chapter3_obs/Q1/loss_plt3.png diff --git a/chapter3_obs/Q1/loss_plt3.png b/chapter3_obs/Q1/loss_plt3.png deleted file mode 100644 index 4b76927a57ef500630c5495b552a4285d6385662..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2396 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_vMh0pC<)F_D=AMbN@eg( zEGfvzFUiSFQYcF;D$dN$GuAWJGt^PYC@Co@w$j(ng)7j@FG|`7=5U3`XbP19jdr zYG7b6WD{UeIL5%la74m^p+SO~gFzsffsrAJM}fhihmnP$!*Ep5Xb_C1g3*jHS{95J jhod#ZXr)Nkc7dK+CHtP`%Qqzf+bay7u6{1-oD!M<#T}qL From c807e957dd93a8a795f441c203b855f1013db4ec Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:51:04 +0800 Subject: [PATCH 12/29] Add files via upload --- chapter3_obs/Q1/loss_plt1.png | Bin 0 -> 51257 bytes chapter3_obs/Q1/loss_plt2.png | Bin 0 -> 35885 bytes chapter3_obs/Q1/loss_plt3.png | Bin 0 -> 33370 bytes chapter3_obs/Q1/q1.py | 225 ++++++++++++++++++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 chapter3_obs/Q1/loss_plt1.png create mode 100644 chapter3_obs/Q1/loss_plt2.png create mode 100644 chapter3_obs/Q1/loss_plt3.png create mode 100644 chapter3_obs/Q1/q1.py diff --git a/chapter3_obs/Q1/loss_plt1.png b/chapter3_obs/Q1/loss_plt1.png new file mode 100644 index 0000000000000000000000000000000000000000..a86e6eb73a41335c12df23466deff4cad3cf0fd8 GIT binary patch literal 51257 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 I5Y_Yff46!_1^@s6 literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/loss_plt2.png b/chapter3_obs/Q1/loss_plt2.png new file mode 100644 index 0000000000000000000000000000000000000000..7130ae108045a50f7e8be28d601292a9651ba0ab GIT binary patch literal 35885 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 P;6Ewx2V&WGA3gnFq!ctX literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/loss_plt3.png b/chapter3_obs/Q1/loss_plt3.png new file mode 100644 index 0000000000000000000000000000000000000000..12f82669b9251a01b16b0161a2a87e82bcd55421 GIT binary patch literal 33370 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 literal 0 HcmV?d00001 diff --git a/chapter3_obs/Q1/q1.py b/chapter3_obs/Q1/q1.py new file mode 100644 index 0000000..6164436 --- /dev/null +++ b/chapter3_obs/Q1/q1.py @@ -0,0 +1,225 @@ +import torch +import torch.nn as nn +import torch.optim as optim +import torch.utils.data +import torch.nn.functional as F + +import torch +import torch.nn as nn +import numpy as np +import matplotlib.pyplot as plt +import os +os.environ['KMP_DUPLICATE_LIB_OK']='True' + + + + +def one_hot(val: torch.LongTensor, num: int) -> torch.FloatTensor: + """ + **Overview**: + Convert a ``torch.LongTensor`` to one hot encoding with scatter API. + This implementation can be slightly faster than ``torch.nn.functional.one_hot`` . + """ + # Remember original shape of val. + old_shape = val.shape + # Reshape val into 2D tensor. + val_reshape = val.reshape(-1, 1) + # Initialize return tensor with float32 dtype and the same device as val. + ret = torch.zeros(val_reshape.shape[0], num, device=val.device) + # Fill value 1 into tensor ``ret`` , according to the index stored in ``val_reshape`` . It is an inplace operation. + ret.scatter_(1, val_reshape, 1) + # Return the reshaped result with the same prefix shape as original shape of val. + return ret.reshape(*old_shape, num) + + +# delimiter +def get_one_hot_encoding(num: int): + """ + **Overview**: + Implementation of one hot encoding with nn.Embedding API. + """ + # Use the identity matrix as weight tensor. + # Use freezed embedding as fixed one-hot transformation. + return nn.Embedding.from_pretrained(torch.eye(num), freeze=True, padding_idx=None) + + +# delimiter +def get_binary_encoding(bit_num: int): + """ + **Overview**: + Implementation of binary encoding with nn.Embedding API. + """ + # Generate a matrix with shape $$2^{B} \times B $$ where B is the bit_num. + # Each row with index n contains the binary representation of n. + location_embedding = [] + for n in range(2**bit_num): + s = '0' * (bit_num - len(bin(n)[2:])) + bin(n)[2:] + location_embedding.append(list(int(i) for i in s)) + mat = torch.FloatTensor(location_embedding) + # Use the generated result as transformation.. + return torch.nn.Embedding.from_pretrained(mat, freeze=True, padding_idx=None) + + +# delimiter +def test_encoding(): + """ + **Overview**: + Test different encoding methods. + """ + # Test one-hot encoding with nn.Embedding and scatter, compare two float32 dtype tensor. + x = torch.LongTensor([9, 0, 1, 2, 1, 3, 5]) + one_hot_enc = get_one_hot_encoding(10) + y = one_hot_enc(x) + y_ = one_hot(x, num=10) + assert torch.sum(torch.abs(y - y_)) < 1e-6 + # Test binary encoding, compare two int64 dtype tensor. + bin_enc = get_binary_encoding(4) + x = torch.arange(10) + y = bin_enc(x) + ground_truth = torch.LongTensor([ + [0, 0], + [0, 1], + [1, 0], + [1, 1] + ]) + print(y) + print((1%100)%10) + print(torch.randn(10, 2)) + assert torch.eq(y, ground_truth).all() + +class Parity(nn.Module): + def __init__(self, in_size, hidden_size, out_size): + super().__init__() + self.n1 = nn.Linear(in_size, hidden_size) + self.n2 = nn.Linear(hidden_size, out_size) + self.relu = nn.ReLU() + self.sigmoid = nn.Sigmoid() + + def forward(self, x): + x = self.n1(x) + x = self.relu(x) + x = self.n2(x) + out = self.sigmoid(x) + return out + +train_data = np.arange(0, 700, 1) +test_data = np.arange(700, 1000, 1) +bin_enc = get_binary_encoding(10) +Parity1 = Parity(1,32,1) +Parity2 = Parity(10,32,1) +Parity3 = Parity(1,32,1) +pi = torch.pi + +def train_1(): + loss_plt1 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity1.parameters(), lr=0.01) + trainX = torch.tensor(train_data).float().reshape(-1, 1) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity1.train() + for epoch in range(100): + pred = Parity1(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt1.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt1) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.close() + +def test_1(): + Parity1.eval() + testX = torch.tensor(test_data).float().reshape(-1, 1) + pred = Parity1(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + + acc = (pred.round() == testY).float().mean() + return acc + +def train_2(): + loss_plt2 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity2.parameters(), lr=0.01) + trainX = torch.tensor(train_data) + trainX = bin_enc(trainX) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity2.train() + for epoch in range(100): + pred = Parity2(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt2.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt2) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.close() + +def test_2(): + Parity2.eval() + testX = torch.tensor(test_data) + testX = bin_enc(testX) + pred = Parity2(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + acc = (pred.round() == testY).float().mean() + return acc + +def train_3(): + loss_plt3 = [] + loss_func = nn.BCELoss() + optimizer = torch.optim.Adam(Parity3.parameters(), lr=0.01) + trainX = torch.tensor(train_data) + trainX = np.sin(np.pi/2*(2*trainX-1)).reshape(-1, 1) + trainY = torch.tensor(train_data%2).float().reshape(-1, 1) + Parity3.train() + for epoch in range(100): + pred = Parity3(trainX) + acc = (pred.round() == trainY).float().mean() + loss = loss_func(pred, trainY) + optimizer.zero_grad() + loss.backward() + optimizer.step() + loss_plt3.append(loss.item()) + if epoch % 10 == 0: + print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) + + plt.plot(loss_plt3) + plt.xlabel("epoch") + plt.ylabel("loss") + plt.show() + plt.close() + +def test_3(): + Parity3.eval() + testX = torch.tensor(test_data) + testX = np.sin(np.pi/2*(2*testX-1)).reshape(-1, 1) + pred = Parity3(testX) + testY = torch.tensor(test_data%2).float().reshape(-1, 1) + acc = (pred.round() == testY).float().mean() + return acc + + +def main(): + train_1() + train_2() + train_3() + print("test_1_acc:%.4f", test_1().item()) + print("test_2_acc:%.4f", test_2().item()) + print("test_3_acc:%.4f", test_3().item()) + + +if __name__ == "__main__": + main() From afcb4d21426f7a9961a3d9151aef928e6af5eda5 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:59:51 +0800 Subject: [PATCH 13/29] Create q1.py --- chapter2_action/Q1/q1.py | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 chapter2_action/Q1/q1.py diff --git a/chapter2_action/Q1/q1.py b/chapter2_action/Q1/q1.py new file mode 100644 index 0000000..2c8ed82 --- /dev/null +++ b/chapter2_action/Q1/q1.py @@ -0,0 +1,43 @@ +import numpy as np +import matplotlib.pyplot as plt + +def naive_grad(x,mu): + return np.mean(x**2*(x-mu)) + +def reparam_grad(eps,mu): + return np.mean(eps**2*(eps-mu)) + + +def main(): + data_size_list = [10,100,500,1000,5000] + sample_num = 100 + mu, sigma = 2.0, 1.0 + + var1 = np.zeros(len(data_size_list)) + var2 = np.zeros(len(data_size_list)) + + for i, data_size in enumerate(data_size_list): + estimation1 = np.zeros(sample_num) + estimation2 = np.zeros(sample_num) + for n in range(sample_num): + x = np.random.normal(mu, sigma, size=(data_size, )) + estimation1[n] = naive_grad(x,mu) + eps = np.random.normal(0.0,1.0,size = (data_size, )) + x = eps * sigma + mu + estimation2[n] = reparam_grad(eps, mu) + + var1[i] = np.var(estimation1) + var2[i] = np.var(estimation2) + + print('naive grad variance:{}'.format(var1)) + print('reparameterization grad variance:{}'.format(var2)) + + index = [_ for _ in range(len(data_size_list))] + plt.plot(index, var1) + plt.plot(index, var2) + plt.xticks(index,data_size_list) + plt.savefig('reparam.png') + plt.show() + +if __name__ == "__main__": + main() From 6e1b819401fac2b18a34d369b0b2dbf9f562527c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:00:03 +0800 Subject: [PATCH 14/29] Add files via upload --- chapter2_action/Q1/q1.png | Bin 0 -> 16416 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 chapter2_action/Q1/q1.png diff --git a/chapter2_action/Q1/q1.png b/chapter2_action/Q1/q1.png new file mode 100644 index 0000000000000000000000000000000000000000..38add865c88475b76cfca8cb2f9da836745322e4 GIT binary patch literal 16416 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 DBL)i2 literal 0 HcmV?d00001 From 72efc0fb039343c1d1571cd7aea02fde426ed96b Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:00:36 +0800 Subject: [PATCH 15/29] Create q2_continuous.py --- chapter2_action/Q2/q2_continuous.py | 141 ++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 chapter2_action/Q2/q2_continuous.py diff --git a/chapter2_action/Q2/q2_continuous.py b/chapter2_action/Q2/q2_continuous.py new file mode 100644 index 0000000..c2a7d63 --- /dev/null +++ b/chapter2_action/Q2/q2_continuous.py @@ -0,0 +1,141 @@ +""" + ``Proximal Policy Optimization (PPO)`` 算法建模连续动作空间的入门示例(PyTorch版) + +PPO 是最经典常用的强化学习算法之一(策略梯度类)。它结合了经典的 Actor-Critic 范式和信赖域策略优化方法,并把相关工作整合为一个简洁而有效的算法。和之前传统的策略梯度类强化学习算法相比(例如 REINFORCE 和 A2C),PPO 可以更稳定高效地提升智能体策略,通过如下所示的截断式优化目标不断强化智能体: +$$J(\theta) = \min(\frac{\pi_{\theta}(a_{t}|s_{t})}{\pi_{\theta_k}(a_{t}|s_{t})}A^{\theta_k}(s_{t},a_{t}),\text{clip}(\frac{\pi_{\theta}(a_{t}|s_{t})}{\pi_{\theta_k}(a_{t}|s_{t})}, 1-\epsilon,1+\epsilon)A^{\theta_k}(s_{t},a_{t}))$$ +这个截断式的优化目标是原始未截断版本的一个下界(即一种悲观的约束)。通过公式中的 ``min`` 操作,忽略掉一些对于策略提升较大的重要性采样系数(IS),但又在策略优化变得糟糕时保留足够的 IS,从而让整个优化过程更稳定。 +详细的数学符号定义可以在符号表中找到 。 +连续动作空间是最常见的动作空间之一,它常常用于机器人操纵,无人机控制这样的决策问题中。一般包含一系列可控制的连续动作,每次决策时需要让 RL 智能体输出合适且精确的连续值。连续动作空间可以被直接回归,也可以被建模成一个高斯分布(整体类似一个回归问题)。 +本文档将主要分为三个部分,读者可以从这些样例代码中一步一步进行学习,也可以将其中一些代码片段用到自己的程序中: + - 策略神经网络架构 + - 动作采样函数 + - 主函数(测试函数) +更多的可视化结果和实际应用样例,可以参考这个链接 +""" +from typing import Dict +import torch +import torch.nn as nn +from torch.distributions import Normal, Independent +import numpy as np +from jump_env import Jump_Env + +class ContinuousPolicyNetwork(nn.Module): + def __init__(self, obs_shape: int, action_shape: int) -> None: + """ + **ContinuousPolicyNetwork 定义概述**: + 定义 PPO 中所使用的连续动作策略网络,其主要包含三部分:编码器(encoder),均值(mu)和对数空间标准差(log_sigma) + """ + # 继承 PyTorch 神经网络类所必需的操作,自定义的神经网络必须是 ``nn.Module`` 的子类 + super(ContinuousPolicyNetwork, self).__init__() + # 定义编码器模块,将原始的状态映射为特征向量。对于不同的环境,可能状态信息的模态不同,需要根据情况选择适当的编码器神经网络,例如对于图片状态信息就常常使用卷积神经网络 + # 这里我们用一个简单的两层 MLP 作为例子,即: + # $$ y = max(W_2 max(W_1x+b_1, 0) + b_2, 0)$$ + self.encoder = nn.Sequential( + nn.Linear(obs_shape, 16), + nn.Tanh(), + nn.Linear(16, 32), + nn.Tanh(), + ) + # 定义输出均值 mu 的模块,一般使用一层全连接层即可,输出的 mu 将用于构建高斯分布 + # $$ \mu = Wx + b $$ + self.mu = nn.Linear(32, action_shape) + # 定义对数空间标准差 log_sigma 模块,它是一个与输入状态无关的可学习参数。 + # 这里定义成对数空间,取值和使用比较方便。你也可以根据自己的需要,调整它的初始化值 + # $$\sigma = e^w$$ + self.log_sigma = nn.Parameter(torch.zeros(1, action_shape)) + + # delimiter + def forward(self, x: torch.Tensor) -> Dict[str, torch.Tensor]: + """ + **forward 函数功能概述**: + 描述 PPO 中所使用的连续动作策略网络的前向计算图 + ``x -> encoder -> mu -> \mu`` . + ``log_sigma -> exp -> sigma`` . + """ + # 将原始的状态信息转换为特征向量,维度变化为: $$(B, *) -> (B, N)$$ + x = self.encoder(x) + # 根据特征向量输出动作均值 mu,维度变化为: $$(B, N) -> (B, A)$$ + mu_init = self.mu(x) + input_init = nn.Tanh() + mu = input_init(mu_init) + mu_trans = torch.ones((4, 2)) + mu_trans1 = [i[0] for i in mu] + mu_trans2 = [i[1] for i in mu] + for i in range(len(mu)): + mu_trans[i][0] = (mu_trans1[i]+1)/2*(np.pi/2) + mu_trans[i][1] = (mu_trans2[i]+1)/2*10 + print('mu_trans:', mu_trans) + print('mu:', mu) + + # 借助”广播“机制让对数空间标准差的维度和均值一致(在 batch 维度上复制) + # ``zeros_like`` 操作并不会传递梯度 + # + log_sigma = self.log_sigma + torch.zeros_like(mu_trans) + + # 通过取指数操作得到最终的标准差 sigma + # $$\sigma = e^w$$ + sigma = torch.exp(log_sigma) + sigma_trans = torch.ones((4, 2)) + sigma_trans1 = [i[0] for i in sigma] + sigma_trans2 = [i[1] for i in sigma] + for i in range(len(sigma)): + sigma_trans[i][0] = sigma_trans1[i]*(np.pi/2) + sigma_trans[i][1] = sigma_trans2[i]*10 + print('sigma_trans:', sigma_trans) + return {'mu': mu_trans, 'sigma': sigma_trans} + + +# delimiter +def sample_continuous_action(logit: Dict[str, torch.Tensor]) -> torch.Tensor: + """ + **sample_continuous_action 函数功能概述**: + 输入 logit(包含 mu 和 sigma)采样得到离散动作,输入是一个包含 mu 和 sigma 的字典,它们的维度都是 (B, action_shape),输出的维度是 (B, action_shape)。 + 在这个示例中,课程中提到的 distributions 工具库的三个维度分别为 + batch_shape = (B, ), event_shape = (action_shape, ), sample_shape = () + """ + # 根据 mu 和 sigma 构建高斯分布 + # $$X \sim \mathcal{N}(\mu,\,\sigma^{2})$$ + # 它的概率密度函数为: $$f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left( -\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{\!2}\,\right)$$ + # + dist = Normal(logit['mu'], logit['sigma']) + # 将 ``action_shape`` 个高斯分布转义为一个有着对角协方差矩阵的多维高斯分布。 + # 并保证高斯分布中,每一维之间都是互相独立的(因为协方差矩阵是对角矩阵) + # + dist = Independent(dist, 1) + # 为一个 batch 里的每个样本采样一个维度为 ``action_shape`` 的连续动作,并返回它 + return dist.sample() + + +# delimiter +def test_sample_continuous_action(state): + """ + **test_sample_continuous_action 函数功能概述**: + 连续动作空间的主函数,构建一个简单的连续动作策略网络,执行前向计算过程,并采样得到一组连续动作 + """ + # 设置相关参数 batch_size = 4, obs_shape = 10, action_shape = 6. + # ``action_shape`` 在离散和连续动作空间中的语义不太一样,前者是表示可选择的离散选项的个数,但只从中选出某一离散动作,而后者是连续动作的数量(维度) + B, obs_shape, action_shape = 4, 2, 2 + # Jump_Env_model = Jump_Env + # # 从0-1 的均匀分布中生成状态数据 + # state = Jump_Env_model().reset() + print('state:',state) + # 定义策略网络(类似重参数化方法) + # state = torch.rand(B, obs_shape) + policy_network = ContinuousPolicyNetwork(obs_shape, action_shape) + # 策略网络执行前向计算,即输入状态输出字典类型的 logit + # $$ \mu, \sigma = \pi(a|s)$$ + logit = policy_network(torch.tensor(state).float()) + # logit = policy_network(state) + assert isinstance(logit, dict) + assert logit['mu'].shape == (B, action_shape) + assert logit['sigma'].shape == (B, action_shape) + # 根据 logit (mu, sigma) 采样得到最终的连续动作 + action = sample_continuous_action(logit) + print('action:', action) + # Jump_Env_model().step(state, action) + assert action.shape == (B, action_shape) + return logit, action + + +if __name__ == "__main__": + test_sample_continuous_action() From 6bce1394dd0477abd73e0c97f3f253182eeeb11b Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:00:54 +0800 Subject: [PATCH 16/29] Add files via upload --- chapter2_action/Q2/q2_jump_env.py | 54 ++++++++++++++++++++++++++ chapter2_action/Q2/q2_pg.py | 63 +++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 chapter2_action/Q2/q2_jump_env.py create mode 100644 chapter2_action/Q2/q2_pg.py diff --git a/chapter2_action/Q2/q2_jump_env.py b/chapter2_action/Q2/q2_jump_env.py new file mode 100644 index 0000000..51c1414 --- /dev/null +++ b/chapter2_action/Q2/q2_jump_env.py @@ -0,0 +1,54 @@ +import gym +from gym import spaces +from gym.utils import seeding +from stable_baselines3.common.env_checker import check_env +import numpy as np +import math + +class Jump_Env(gym.Env): + """Custom Environment that follows gym interface""" + metadata = {'render.modes': ['human']} + + def __init__(self): + super(Jump_Env, self).__init__() + # Define action and observation space + # They must be gym.spaces objects + # # Example when using discrete actions: + # self.action_space = spaces.Discrete(N_DISCRETE_ACTIONS) + # # Example for using image as input: + # self.observation_space = spaces.Box(low=0, high=255, + # shape=(HEIGHT, WIDTH, N_CHANNELS), dtype=np.uint8) + self.action_space = spaces.Box(low=np.array([0, 0]), high=np.array([np.pi, 10]), dtype=np.double) + self.observation_space = spaces.Box(low=0, high=1, shape=(2, ), dtype=np.double) + self.state = None + self.seed() + + def seed(self, seed=None): + self.np_random, seed = seeding.np_random(seed) + return [seed] + + def step(self, state, action): + g = 10 + reward = 0 + done = 0 + info = {} + d = state + Vx = action[0][1]*math.cos(action[0][0]) + Vy = action[0][1]*math.sin(action[0][0]) + t = d[0][0]/Vx + dif_y = Vy*t-(1/2)*g*(t**2) + if dif_y > d[0][1]: + reward = 100-action[0][1]**2 + else: + reward = 0 + return np.array(self.state), reward, done, info + + def reset(self): + self.state = self.np_random.uniform(low=0, high=1, size=(4,2)) + return np.array(self.state) + + def render(self, mode='human'): + pass + + def close(self): + pass diff --git a/chapter2_action/Q2/q2_pg.py b/chapter2_action/Q2/q2_pg.py new file mode 100644 index 0000000..d10f978 --- /dev/null +++ b/chapter2_action/Q2/q2_pg.py @@ -0,0 +1,63 @@ +""" +PyTorch implementation of Policy Gradient (PG) +Policy gradient (also known as REINFORCE) is a classical method for learning a policy. +Each $$(s_t,a_t)$$ will be used to compute corresponding log probability. Then the probability is back-propagated then and calculate gradient. The gradient will be multiplied by a weight value, which is the accumulated return in this game. +The final target function is formulated as: +$$- \frac 1 N \sum_{n=1}^{N} log(\pi(a^n|s^n)) G_t^n$$ +This document mainly includes: +- Implementation of PG error. +- Main function (test function) +""" +from collections import namedtuple +import continuous +import torch +from jump_env import Jump_Env + +pg_data = namedtuple('pg_data', ['logit', 'action', 'return_']) +pg_loss = namedtuple('pg_loss', ['policy_loss', 'entropy_loss']) + + +def pg_error(data: namedtuple) -> namedtuple: + """ + **Overview**: + Implementation of PG (Policy Gradient) + """ + # Unpack data: $$<\pi(a|s), a, G_t>$$ + logit, action, return_ = data + # Prepare policy distribution from logit and get log propability. + dist = torch.distributions.categorical.Categorical(logits=logit) + log_prob = dist.log_prob(action) + # Policy loss: $$- \frac 1 N \sum_{n=1}^{N} log(\pi(a^n|s^n)) G_t^n$$ + policy_loss = -(log_prob * return_).mean() + # Entropy bonus: $$\frac 1 N \sum_{n=1}^{N} \sum_{a^n}\pi(a^n|s^n) log(\pi(a^n|s^n))$$ + # P.S. the final loss is ``policy_loss - entropy_weight * entropy_loss`` + entropy_loss = dist.entropy().mean() + # Return the concrete loss items. + return pg_loss(policy_loss, entropy_loss) + + +def test_pg(): + # batch size=4, action=2 + B, N = 4, 2 + Jump_Env_model = Jump_Env + state = Jump_Env_model().reset() + logit, action = continuous.test_sample_continuous_action(state) + # Generate logit, action, return_. + logit = torch.randn(B, N).requires_grad_(True) + # action = torch.randint(0, N, size=(B, )) + # logit = torch.tensor(logit).requires_grad_(True) + return_ = torch.randn(B) * 2 + # Compute PG error. + state, return_, done, info = Jump_Env_model().step(state, action) + data = pg_data(logit, action, return_) + loss = pg_error(data) + # Assert the loss is differentiable. + assert all([l.shape == tuple() for l in loss]) + assert logit.grad is None + total_loss = sum(loss) + total_loss.backward() + assert isinstance(logit.grad, torch.Tensor) + + +if __name__ == '__main__': + test_pg() \ No newline at end of file From 07fd4c5ea26f4210b832c55a2b8784389750a376 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:02:02 +0800 Subject: [PATCH 17/29] Delete chapter2_action/Q1 directory --- chapter2_action/Q1/q1.png | Bin 16416 -> 0 bytes chapter2_action/Q1/q1.py | 43 -------------------------------------- 2 files changed, 43 deletions(-) delete mode 100644 chapter2_action/Q1/q1.png delete mode 100644 chapter2_action/Q1/q1.py diff --git a/chapter2_action/Q1/q1.png b/chapter2_action/Q1/q1.png deleted file mode 100644 index 38add865c88475b76cfca8cb2f9da836745322e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16416 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 DBL)i2 diff --git a/chapter2_action/Q1/q1.py b/chapter2_action/Q1/q1.py deleted file mode 100644 index 2c8ed82..0000000 --- a/chapter2_action/Q1/q1.py +++ /dev/null @@ -1,43 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -def naive_grad(x,mu): - return np.mean(x**2*(x-mu)) - -def reparam_grad(eps,mu): - return np.mean(eps**2*(eps-mu)) - - -def main(): - data_size_list = [10,100,500,1000,5000] - sample_num = 100 - mu, sigma = 2.0, 1.0 - - var1 = np.zeros(len(data_size_list)) - var2 = np.zeros(len(data_size_list)) - - for i, data_size in enumerate(data_size_list): - estimation1 = np.zeros(sample_num) - estimation2 = np.zeros(sample_num) - for n in range(sample_num): - x = np.random.normal(mu, sigma, size=(data_size, )) - estimation1[n] = naive_grad(x,mu) - eps = np.random.normal(0.0,1.0,size = (data_size, )) - x = eps * sigma + mu - estimation2[n] = reparam_grad(eps, mu) - - var1[i] = np.var(estimation1) - var2[i] = np.var(estimation2) - - print('naive grad variance:{}'.format(var1)) - print('reparameterization grad variance:{}'.format(var2)) - - index = [_ for _ in range(len(data_size_list))] - plt.plot(index, var1) - plt.plot(index, var2) - plt.xticks(index,data_size_list) - plt.savefig('reparam.png') - plt.show() - -if __name__ == "__main__": - main() From c0293a0f733caa36ba30c53473bcd416a4515576 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:02:10 +0800 Subject: [PATCH 18/29] Delete chapter2_action/Q2 directory --- chapter2_action/Q2/q2_continuous.py | 141 ---------------------------- chapter2_action/Q2/q2_jump_env.py | 54 ----------- chapter2_action/Q2/q2_pg.py | 63 ------------- 3 files changed, 258 deletions(-) delete mode 100644 chapter2_action/Q2/q2_continuous.py delete mode 100644 chapter2_action/Q2/q2_jump_env.py delete mode 100644 chapter2_action/Q2/q2_pg.py diff --git a/chapter2_action/Q2/q2_continuous.py b/chapter2_action/Q2/q2_continuous.py deleted file mode 100644 index c2a7d63..0000000 --- a/chapter2_action/Q2/q2_continuous.py +++ /dev/null @@ -1,141 +0,0 @@ -""" - ``Proximal Policy Optimization (PPO)`` 算法建模连续动作空间的入门示例(PyTorch版) - -PPO 是最经典常用的强化学习算法之一(策略梯度类)。它结合了经典的 Actor-Critic 范式和信赖域策略优化方法,并把相关工作整合为一个简洁而有效的算法。和之前传统的策略梯度类强化学习算法相比(例如 REINFORCE 和 A2C),PPO 可以更稳定高效地提升智能体策略,通过如下所示的截断式优化目标不断强化智能体: -$$J(\theta) = \min(\frac{\pi_{\theta}(a_{t}|s_{t})}{\pi_{\theta_k}(a_{t}|s_{t})}A^{\theta_k}(s_{t},a_{t}),\text{clip}(\frac{\pi_{\theta}(a_{t}|s_{t})}{\pi_{\theta_k}(a_{t}|s_{t})}, 1-\epsilon,1+\epsilon)A^{\theta_k}(s_{t},a_{t}))$$ -这个截断式的优化目标是原始未截断版本的一个下界(即一种悲观的约束)。通过公式中的 ``min`` 操作,忽略掉一些对于策略提升较大的重要性采样系数(IS),但又在策略优化变得糟糕时保留足够的 IS,从而让整个优化过程更稳定。 -详细的数学符号定义可以在符号表中找到 。 -连续动作空间是最常见的动作空间之一,它常常用于机器人操纵,无人机控制这样的决策问题中。一般包含一系列可控制的连续动作,每次决策时需要让 RL 智能体输出合适且精确的连续值。连续动作空间可以被直接回归,也可以被建模成一个高斯分布(整体类似一个回归问题)。 -本文档将主要分为三个部分,读者可以从这些样例代码中一步一步进行学习,也可以将其中一些代码片段用到自己的程序中: - - 策略神经网络架构 - - 动作采样函数 - - 主函数(测试函数) -更多的可视化结果和实际应用样例,可以参考这个链接 -""" -from typing import Dict -import torch -import torch.nn as nn -from torch.distributions import Normal, Independent -import numpy as np -from jump_env import Jump_Env - -class ContinuousPolicyNetwork(nn.Module): - def __init__(self, obs_shape: int, action_shape: int) -> None: - """ - **ContinuousPolicyNetwork 定义概述**: - 定义 PPO 中所使用的连续动作策略网络,其主要包含三部分:编码器(encoder),均值(mu)和对数空间标准差(log_sigma) - """ - # 继承 PyTorch 神经网络类所必需的操作,自定义的神经网络必须是 ``nn.Module`` 的子类 - super(ContinuousPolicyNetwork, self).__init__() - # 定义编码器模块,将原始的状态映射为特征向量。对于不同的环境,可能状态信息的模态不同,需要根据情况选择适当的编码器神经网络,例如对于图片状态信息就常常使用卷积神经网络 - # 这里我们用一个简单的两层 MLP 作为例子,即: - # $$ y = max(W_2 max(W_1x+b_1, 0) + b_2, 0)$$ - self.encoder = nn.Sequential( - nn.Linear(obs_shape, 16), - nn.Tanh(), - nn.Linear(16, 32), - nn.Tanh(), - ) - # 定义输出均值 mu 的模块,一般使用一层全连接层即可,输出的 mu 将用于构建高斯分布 - # $$ \mu = Wx + b $$ - self.mu = nn.Linear(32, action_shape) - # 定义对数空间标准差 log_sigma 模块,它是一个与输入状态无关的可学习参数。 - # 这里定义成对数空间,取值和使用比较方便。你也可以根据自己的需要,调整它的初始化值 - # $$\sigma = e^w$$ - self.log_sigma = nn.Parameter(torch.zeros(1, action_shape)) - - # delimiter - def forward(self, x: torch.Tensor) -> Dict[str, torch.Tensor]: - """ - **forward 函数功能概述**: - 描述 PPO 中所使用的连续动作策略网络的前向计算图 - ``x -> encoder -> mu -> \mu`` . - ``log_sigma -> exp -> sigma`` . - """ - # 将原始的状态信息转换为特征向量,维度变化为: $$(B, *) -> (B, N)$$ - x = self.encoder(x) - # 根据特征向量输出动作均值 mu,维度变化为: $$(B, N) -> (B, A)$$ - mu_init = self.mu(x) - input_init = nn.Tanh() - mu = input_init(mu_init) - mu_trans = torch.ones((4, 2)) - mu_trans1 = [i[0] for i in mu] - mu_trans2 = [i[1] for i in mu] - for i in range(len(mu)): - mu_trans[i][0] = (mu_trans1[i]+1)/2*(np.pi/2) - mu_trans[i][1] = (mu_trans2[i]+1)/2*10 - print('mu_trans:', mu_trans) - print('mu:', mu) - - # 借助”广播“机制让对数空间标准差的维度和均值一致(在 batch 维度上复制) - # ``zeros_like`` 操作并不会传递梯度 - # - log_sigma = self.log_sigma + torch.zeros_like(mu_trans) - - # 通过取指数操作得到最终的标准差 sigma - # $$\sigma = e^w$$ - sigma = torch.exp(log_sigma) - sigma_trans = torch.ones((4, 2)) - sigma_trans1 = [i[0] for i in sigma] - sigma_trans2 = [i[1] for i in sigma] - for i in range(len(sigma)): - sigma_trans[i][0] = sigma_trans1[i]*(np.pi/2) - sigma_trans[i][1] = sigma_trans2[i]*10 - print('sigma_trans:', sigma_trans) - return {'mu': mu_trans, 'sigma': sigma_trans} - - -# delimiter -def sample_continuous_action(logit: Dict[str, torch.Tensor]) -> torch.Tensor: - """ - **sample_continuous_action 函数功能概述**: - 输入 logit(包含 mu 和 sigma)采样得到离散动作,输入是一个包含 mu 和 sigma 的字典,它们的维度都是 (B, action_shape),输出的维度是 (B, action_shape)。 - 在这个示例中,课程中提到的 distributions 工具库的三个维度分别为 - batch_shape = (B, ), event_shape = (action_shape, ), sample_shape = () - """ - # 根据 mu 和 sigma 构建高斯分布 - # $$X \sim \mathcal{N}(\mu,\,\sigma^{2})$$ - # 它的概率密度函数为: $$f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left( -\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{\!2}\,\right)$$ - # - dist = Normal(logit['mu'], logit['sigma']) - # 将 ``action_shape`` 个高斯分布转义为一个有着对角协方差矩阵的多维高斯分布。 - # 并保证高斯分布中,每一维之间都是互相独立的(因为协方差矩阵是对角矩阵) - # - dist = Independent(dist, 1) - # 为一个 batch 里的每个样本采样一个维度为 ``action_shape`` 的连续动作,并返回它 - return dist.sample() - - -# delimiter -def test_sample_continuous_action(state): - """ - **test_sample_continuous_action 函数功能概述**: - 连续动作空间的主函数,构建一个简单的连续动作策略网络,执行前向计算过程,并采样得到一组连续动作 - """ - # 设置相关参数 batch_size = 4, obs_shape = 10, action_shape = 6. - # ``action_shape`` 在离散和连续动作空间中的语义不太一样,前者是表示可选择的离散选项的个数,但只从中选出某一离散动作,而后者是连续动作的数量(维度) - B, obs_shape, action_shape = 4, 2, 2 - # Jump_Env_model = Jump_Env - # # 从0-1 的均匀分布中生成状态数据 - # state = Jump_Env_model().reset() - print('state:',state) - # 定义策略网络(类似重参数化方法) - # state = torch.rand(B, obs_shape) - policy_network = ContinuousPolicyNetwork(obs_shape, action_shape) - # 策略网络执行前向计算,即输入状态输出字典类型的 logit - # $$ \mu, \sigma = \pi(a|s)$$ - logit = policy_network(torch.tensor(state).float()) - # logit = policy_network(state) - assert isinstance(logit, dict) - assert logit['mu'].shape == (B, action_shape) - assert logit['sigma'].shape == (B, action_shape) - # 根据 logit (mu, sigma) 采样得到最终的连续动作 - action = sample_continuous_action(logit) - print('action:', action) - # Jump_Env_model().step(state, action) - assert action.shape == (B, action_shape) - return logit, action - - -if __name__ == "__main__": - test_sample_continuous_action() diff --git a/chapter2_action/Q2/q2_jump_env.py b/chapter2_action/Q2/q2_jump_env.py deleted file mode 100644 index 51c1414..0000000 --- a/chapter2_action/Q2/q2_jump_env.py +++ /dev/null @@ -1,54 +0,0 @@ -import gym -from gym import spaces -from gym.utils import seeding -from stable_baselines3.common.env_checker import check_env -import numpy as np -import math - -class Jump_Env(gym.Env): - """Custom Environment that follows gym interface""" - metadata = {'render.modes': ['human']} - - def __init__(self): - super(Jump_Env, self).__init__() - # Define action and observation space - # They must be gym.spaces objects - # # Example when using discrete actions: - # self.action_space = spaces.Discrete(N_DISCRETE_ACTIONS) - # # Example for using image as input: - # self.observation_space = spaces.Box(low=0, high=255, - # shape=(HEIGHT, WIDTH, N_CHANNELS), dtype=np.uint8) - self.action_space = spaces.Box(low=np.array([0, 0]), high=np.array([np.pi, 10]), dtype=np.double) - self.observation_space = spaces.Box(low=0, high=1, shape=(2, ), dtype=np.double) - self.state = None - self.seed() - - def seed(self, seed=None): - self.np_random, seed = seeding.np_random(seed) - return [seed] - - def step(self, state, action): - g = 10 - reward = 0 - done = 0 - info = {} - d = state - Vx = action[0][1]*math.cos(action[0][0]) - Vy = action[0][1]*math.sin(action[0][0]) - t = d[0][0]/Vx - dif_y = Vy*t-(1/2)*g*(t**2) - if dif_y > d[0][1]: - reward = 100-action[0][1]**2 - else: - reward = 0 - return np.array(self.state), reward, done, info - - def reset(self): - self.state = self.np_random.uniform(low=0, high=1, size=(4,2)) - return np.array(self.state) - - def render(self, mode='human'): - pass - - def close(self): - pass diff --git a/chapter2_action/Q2/q2_pg.py b/chapter2_action/Q2/q2_pg.py deleted file mode 100644 index d10f978..0000000 --- a/chapter2_action/Q2/q2_pg.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -PyTorch implementation of Policy Gradient (PG) -Policy gradient (also known as REINFORCE) is a classical method for learning a policy. -Each $$(s_t,a_t)$$ will be used to compute corresponding log probability. Then the probability is back-propagated then and calculate gradient. The gradient will be multiplied by a weight value, which is the accumulated return in this game. -The final target function is formulated as: -$$- \frac 1 N \sum_{n=1}^{N} log(\pi(a^n|s^n)) G_t^n$$ -This document mainly includes: -- Implementation of PG error. -- Main function (test function) -""" -from collections import namedtuple -import continuous -import torch -from jump_env import Jump_Env - -pg_data = namedtuple('pg_data', ['logit', 'action', 'return_']) -pg_loss = namedtuple('pg_loss', ['policy_loss', 'entropy_loss']) - - -def pg_error(data: namedtuple) -> namedtuple: - """ - **Overview**: - Implementation of PG (Policy Gradient) - """ - # Unpack data: $$<\pi(a|s), a, G_t>$$ - logit, action, return_ = data - # Prepare policy distribution from logit and get log propability. - dist = torch.distributions.categorical.Categorical(logits=logit) - log_prob = dist.log_prob(action) - # Policy loss: $$- \frac 1 N \sum_{n=1}^{N} log(\pi(a^n|s^n)) G_t^n$$ - policy_loss = -(log_prob * return_).mean() - # Entropy bonus: $$\frac 1 N \sum_{n=1}^{N} \sum_{a^n}\pi(a^n|s^n) log(\pi(a^n|s^n))$$ - # P.S. the final loss is ``policy_loss - entropy_weight * entropy_loss`` - entropy_loss = dist.entropy().mean() - # Return the concrete loss items. - return pg_loss(policy_loss, entropy_loss) - - -def test_pg(): - # batch size=4, action=2 - B, N = 4, 2 - Jump_Env_model = Jump_Env - state = Jump_Env_model().reset() - logit, action = continuous.test_sample_continuous_action(state) - # Generate logit, action, return_. - logit = torch.randn(B, N).requires_grad_(True) - # action = torch.randint(0, N, size=(B, )) - # logit = torch.tensor(logit).requires_grad_(True) - return_ = torch.randn(B) * 2 - # Compute PG error. - state, return_, done, info = Jump_Env_model().step(state, action) - data = pg_data(logit, action, return_) - loss = pg_error(data) - # Assert the loss is differentiable. - assert all([l.shape == tuple() for l in loss]) - assert logit.grad is None - total_loss = sum(loss) - total_loss.backward() - assert isinstance(logit.grad, torch.Tensor) - - -if __name__ == '__main__': - test_pg() \ No newline at end of file From ab92b454b3e3467ca4896de8214c855e38d2b75d Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 23:44:49 +0800 Subject: [PATCH 19/29] Delete q2.log --- chapter3_obs/Q2/q2.log | 86 ------------------------------------------ 1 file changed, 86 deletions(-) delete mode 100644 chapter3_obs/Q2/q2.log diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log deleted file mode 100644 index 8679b74..0000000 --- a/chapter3_obs/Q2/q2.log +++ /dev/null @@ -1,86 +0,0 @@ -[02-15 18:59:21] INFO Env Space Information: func.py:93 -[02-15 18:59:21] INFO Observation Space: Box(0.0, 1.0, (4, 84, 84), float32) func.py:93 -[02-15 18:59:21] INFO Action Space: Discrete(2) func.py:93 -[02-15 18:59:21] INFO Reward Space: Box(-15.0, 15.0, (1,), float32) func.py:93 -D:\muzilyd\anaconda\envs\pytorch-gpu\lib\site-packages\gym\utils\passive_env_checker.py:228: DeprecationWarning: WARN: Core environment is written in old step API which returns one bool instead of two. It is recommended to rewrite the environment with new step API. - "Core environment is written in old step API which returns one bool instead of two. " -[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 -[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 -[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 -[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 -[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 -[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 -[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 -[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 -[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 -[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 -[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 -[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 -[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 -[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 -[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 -[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 -[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 -[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 -[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 -[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 -[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 -[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 -[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 -[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 -[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 -[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 -[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 -[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 -[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 -[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 -[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 -[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 -[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 -[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 -[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 -[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 -[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 -[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 -[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 -[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 -[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 -[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 -[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 -[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 -[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 -[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 -[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 -[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 -[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 -[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 -[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 -[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 -[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 -[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 -[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 -[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 -[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 -[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 -[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 -[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 -[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 -[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 -[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 -[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 -[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 -[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 -[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 -[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 -[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 -[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 -[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 -[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 -[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 -[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 -[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 -[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 -[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 -[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 -[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 -[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 \ No newline at end of file From e5d9b845417478b99268ec93137e5073f399a452 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 23:44:58 +0800 Subject: [PATCH 20/29] Add files via upload --- chapter3_obs/Q2/q2.log | 215 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 chapter3_obs/Q2/q2.log diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log new file mode 100644 index 0000000..b5cc6d0 --- /dev/null +++ b/chapter3_obs/Q2/q2.log @@ -0,0 +1,215 @@ +[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 +[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 +[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 +[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 +[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 +[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 +[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 +[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 +[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 +[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 +[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 +[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 +[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 +[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 +[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 +[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 +[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 +[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 +[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 +[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 +[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 +[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 +[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 +[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 +[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 +[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 +[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 +[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 +[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 +[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 +[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 +[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 +[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 +[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 +[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 +[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 +[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 +[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 +[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 +[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 +[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 +[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 +[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 +[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 +[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 +[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 +[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 +[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 +[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 +[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 +[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 +[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 +[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 +[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 +[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 +[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 +[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 +[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 +[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 +[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 +[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 +[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 +[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 +[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 +[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 +[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 +[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 +[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 +[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 +[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 +[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 +[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 +[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 +[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 +[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 +[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 +[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 +[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 +[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 +[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 +[02-15 20:42:05] INFO Training: Train Iter(26208) Env Step(838912) Loss(0.302) func.py:93 +[02-15 20:44:05] INFO Training: Train Iter(26712) Env Step(855040) Loss(0.115) func.py:93 +[02-15 20:45:17] INFO Evaluation: Train Iter(27000) Env Step(864000) Mean Episode Return(923.500) func.py:93 +[02-15 20:46:17] INFO Training: Train Iter(27216) Env Step(871168) Loss(0.178) func.py:93 +[02-15 20:48:20] INFO Training: Train Iter(27720) Env Step(887296) Loss(0.102) func.py:93 +[02-15 20:49:29] INFO Evaluation: Train Iter(28000) Env Step(896000) Mean Episode Return(381.750) func.py:93 +[02-15 20:50:24] INFO Training: Train Iter(28224) Env Step(903424) Loss(0.302) func.py:93 +[02-15 20:52:25] INFO Training: Train Iter(28728) Env Step(919552) Loss(0.193) func.py:93 +[02-15 20:53:31] INFO Evaluation: Train Iter(29000) Env Step(928000) Mean Episode Return(645.500) func.py:93 +[02-15 20:54:27] INFO Training: Train Iter(29232) Env Step(935680) Loss(0.090) func.py:93 +[02-15 20:56:24] INFO Training: Train Iter(29736) Env Step(951808) Loss(0.199) func.py:93 +[02-15 20:57:30] INFO Evaluation: Train Iter(30000) Env Step(960000) Mean Episode Return(923.500) func.py:93 +[02-15 20:58:28] INFO Training: Train Iter(30240) Env Step(967936) Loss(0.302) func.py:93 +[02-15 21:00:26] INFO Training: Train Iter(30744) Env Step(984064) Loss(0.252) func.py:93 +[02-15 21:01:29] INFO Evaluation: Train Iter(31000) Env Step(992000) Mean Episode Return(372.750) func.py:93 +[02-15 21:02:31] INFO Training: Train Iter(31248) Env Step(1000192) Loss(0.170) func.py:93 +[02-15 21:04:30] INFO Training: Train Iter(31752) Env Step(1016320) Loss(0.097) func.py:93 +[02-15 21:05:32] INFO Evaluation: Train Iter(32000) Env Step(1024000) Mean Episode Return(383.500) func.py:93 +[02-15 21:06:35] INFO Training: Train Iter(32256) Env Step(1032448) Loss(0.122) func.py:93 +[02-15 21:08:34] INFO Training: Train Iter(32760) Env Step(1048576) Loss(0.552) func.py:93 +[02-15 21:09:35] INFO Evaluation: Train Iter(33000) Env Step(1056000) Mean Episode Return(923.500) func.py:93 +[02-15 21:10:41] INFO Training: Train Iter(33264) Env Step(1064704) Loss(0.670) func.py:93 +[02-15 21:12:39] INFO Training: Train Iter(33768) Env Step(1080832) Loss(0.005) func.py:93 +[02-15 21:13:37] INFO Evaluation: Train Iter(34000) Env Step(1088000) Mean Episode Return(923.500) func.py:93 +[02-15 21:14:43] INFO Training: Train Iter(34272) Env Step(1096960) Loss(0.005) func.py:93 +[02-15 21:16:41] INFO Training: Train Iter(34776) Env Step(1113088) Loss(0.531) func.py:93 +[02-15 21:17:42] INFO Evaluation: Train Iter(35000) Env Step(1120000) Mean Episode Return(923.500) func.py:93 +[02-15 21:18:51] INFO Training: Train Iter(35280) Env Step(1129216) Loss(0.001) func.py:93 +[02-15 21:20:50] INFO Training: Train Iter(35784) Env Step(1145344) Loss(0.002) func.py:93 +[02-15 21:21:42] INFO Evaluation: Train Iter(36000) Env Step(1152000) Mean Episode Return(923.500) func.py:93 +[02-15 21:22:50] INFO Training: Train Iter(36288) Env Step(1161472) Loss(0.172) func.py:93 +[02-15 21:24:46] INFO Training: Train Iter(36792) Env Step(1177600) Loss(0.230) func.py:93 +[02-15 21:25:40] INFO Evaluation: Train Iter(37000) Env Step(1184000) Mean Episode Return(58.750) func.py:93 +[02-15 21:26:52] INFO Training: Train Iter(37296) Env Step(1193728) Loss(0.080) func.py:93 +[02-15 21:28:51] INFO Training: Train Iter(37800) Env Step(1209856) Loss(0.228) func.py:93 +[02-15 21:29:43] INFO Evaluation: Train Iter(38000) Env Step(1216000) Mean Episode Return(923.500) func.py:93 +[02-15 21:30:58] INFO Training: Train Iter(38304) Env Step(1225984) Loss(0.180) func.py:93 +[02-15 21:32:56] INFO Training: Train Iter(38808) Env Step(1242112) Loss(0.155) func.py:93 +[02-15 21:33:45] INFO Evaluation: Train Iter(39000) Env Step(1248000) Mean Episode Return(923.500) func.py:93 +[02-15 21:34:59] INFO Training: Train Iter(39312) Env Step(1258240) Loss(0.230) func.py:93 +[02-15 21:36:56] INFO Training: Train Iter(39816) Env Step(1274368) Loss(0.119) func.py:93 +[02-15 21:37:42] INFO Evaluation: Train Iter(40000) Env Step(1280000) Mean Episode Return(923.500) func.py:93 +[02-15 21:38:56] INFO Training: Train Iter(40320) Env Step(1290496) Loss(0.031) func.py:93 +[02-15 21:40:49] INFO Training: Train Iter(40824) Env Step(1306624) Loss(0.028) func.py:93 +[02-15 21:41:32] INFO Evaluation: Train Iter(41000) Env Step(1312000) Mean Episode Return(923.500) func.py:93 +[02-15 21:42:47] INFO Training: Train Iter(41328) Env Step(1322752) Loss(0.046) func.py:93 +[02-15 21:44:39] INFO Training: Train Iter(41832) Env Step(1338880) Loss(0.036) func.py:93 +[02-15 21:45:20] INFO Evaluation: Train Iter(42000) Env Step(1344000) Mean Episode Return(923.500) func.py:93 +[02-15 21:46:38] INFO Training: Train Iter(42336) Env Step(1355008) Loss(0.097) func.py:93 +[02-15 21:48:32] INFO Training: Train Iter(42840) Env Step(1371136) Loss(0.000) func.py:93 +[02-15 21:49:09] INFO Evaluation: Train Iter(43000) Env Step(1376000) Mean Episode Return(387.000) func.py:93 +[02-15 21:50:28] INFO Training: Train Iter(43344) Env Step(1387264) Loss(-0.000) func.py:93 +[02-15 21:52:21] INFO Training: Train Iter(43848) Env Step(1403392) Loss(0.000) func.py:93 +[02-15 21:52:57] INFO Evaluation: Train Iter(44000) Env Step(1408000) Mean Episode Return(387.000) func.py:93 +[02-15 21:54:18] INFO Training: Train Iter(44352) Env Step(1419520) Loss(0.000) func.py:93 +[02-15 21:56:11] INFO Training: Train Iter(44856) Env Step(1435648) Loss(0.000) func.py:93 +[02-15 21:56:45] INFO Evaluation: Train Iter(45000) Env Step(1440000) Mean Episode Return(387.000) func.py:93 +[02-15 21:58:07] INFO Training: Train Iter(45360) Env Step(1451776) Loss(0.065) func.py:93 +[02-15 22:00:00] INFO Training: Train Iter(45864) Env Step(1467904) Loss(0.018) func.py:93 +[02-15 22:00:34] INFO Evaluation: Train Iter(46000) Env Step(1472000) Mean Episode Return(98.750) func.py:93 +[02-15 22:01:58] INFO Training: Train Iter(46368) Env Step(1484032) Loss(0.000) func.py:93 +[02-15 22:03:52] INFO Training: Train Iter(46872) Env Step(1500160) Loss(0.000) func.py:93 +[02-15 22:04:21] INFO Evaluation: Train Iter(47000) Env Step(1504000) Mean Episode Return(380.250) func.py:93 +[02-15 22:05:48] INFO Training: Train Iter(47376) Env Step(1516288) Loss(0.082) func.py:93 +[02-15 22:07:41] INFO Training: Train Iter(47880) Env Step(1532416) Loss(0.000) func.py:93 +[02-15 22:08:09] INFO Evaluation: Train Iter(48000) Env Step(1536000) Mean Episode Return(373.250) func.py:93 +[02-15 22:09:40] INFO Training: Train Iter(48384) Env Step(1548544) Loss(0.015) func.py:93 +[02-15 22:11:43] INFO Training: Train Iter(48888) Env Step(1564672) Loss(0.012) func.py:93 +[02-15 22:12:13] INFO Evaluation: Train Iter(49000) Env Step(1568000) Mean Episode Return(130.750) func.py:93 +[02-15 22:13:49] INFO Training: Train Iter(49392) Env Step(1580800) Loss(0.003) func.py:93 +[02-15 22:15:46] INFO Training: Train Iter(49896) Env Step(1596928) Loss(0.002) func.py:93 +[02-15 22:16:14] INFO Evaluation: Train Iter(50000) Env Step(1600000) Mean Episode Return(130.750) func.py:93 +[02-15 22:17:50] INFO Training: Train Iter(50400) Env Step(1613056) Loss(0.026) func.py:93 +[02-15 22:19:47] INFO Training: Train Iter(50904) Env Step(1629184) Loss(0.017) func.py:93 +[02-15 22:20:13] INFO Evaluation: Train Iter(51000) Env Step(1632000) Mean Episode Return(130.750) func.py:93 +[02-15 22:21:48] INFO Training: Train Iter(51408) Env Step(1645312) Loss(0.007) func.py:93 +[02-15 22:23:43] INFO Training: Train Iter(51912) Env Step(1661440) Loss(0.010) func.py:93 +[02-15 22:24:07] INFO Evaluation: Train Iter(52000) Env Step(1664000) Mean Episode Return(58.750) func.py:93 +[02-15 22:25:45] INFO Training: Train Iter(52416) Env Step(1677568) Loss(0.016) func.py:93 +[02-15 22:27:42] INFO Training: Train Iter(52920) Env Step(1693696) Loss(0.054) func.py:93 +[02-15 22:28:03] INFO Evaluation: Train Iter(53000) Env Step(1696000) Mean Episode Return(923.500) func.py:93 +[02-15 22:29:43] INFO Training: Train Iter(53424) Env Step(1709824) Loss(0.044) func.py:93 +[02-15 22:31:39] INFO Training: Train Iter(53928) Env Step(1725952) Loss(0.076) func.py:93 +[02-15 22:31:59] INFO Evaluation: Train Iter(54000) Env Step(1728000) Mean Episode Return(923.500) func.py:93 +[02-15 22:33:40] INFO Training: Train Iter(54432) Env Step(1742080) Loss(0.083) func.py:93 +[02-15 22:35:35] INFO Training: Train Iter(54936) Env Step(1758208) Loss(0.297) func.py:93 +[02-15 22:35:53] INFO Evaluation: Train Iter(55000) Env Step(1760000) Mean Episode Return(923.500) func.py:93 +[02-15 22:37:35] INFO Training: Train Iter(55440) Env Step(1774336) Loss(0.007) func.py:93 +[02-15 22:39:30] INFO Training: Train Iter(55944) Env Step(1790464) Loss(0.001) func.py:93 +[02-15 22:39:46] INFO Evaluation: Train Iter(56000) Env Step(1792000) Mean Episode Return(58.750) func.py:93 +[02-15 22:41:31] INFO Training: Train Iter(56448) Env Step(1806592) Loss(0.011) func.py:93 +[02-15 22:43:26] INFO Training: Train Iter(56952) Env Step(1822720) Loss(0.010) func.py:93 +[02-15 22:43:40] INFO Evaluation: Train Iter(57000) Env Step(1824000) Mean Episode Return(58.750) func.py:93 +[02-15 22:45:27] INFO Training: Train Iter(57456) Env Step(1838848) Loss(0.008) func.py:93 +[02-15 22:47:21] INFO Training: Train Iter(57960) Env Step(1854976) Loss(0.013) func.py:93 +[02-15 22:47:34] INFO Evaluation: Train Iter(58000) Env Step(1856000) Mean Episode Return(58.750) func.py:93 +[02-15 22:49:22] INFO Training: Train Iter(58464) Env Step(1871104) Loss(0.143) func.py:93 +[02-15 22:51:17] INFO Training: Train Iter(58968) Env Step(1887232) Loss(0.140) func.py:93 +[02-15 22:51:28] INFO Evaluation: Train Iter(59000) Env Step(1888000) Mean Episode Return(58.750) func.py:93 +[02-15 22:53:18] INFO Training: Train Iter(59472) Env Step(1903360) Loss(0.006) func.py:93 +[02-15 22:55:13] INFO Training: Train Iter(59976) Env Step(1919488) Loss(0.004) func.py:93 +[02-15 22:55:22] INFO Evaluation: Train Iter(60000) Env Step(1920000) Mean Episode Return(923.500) func.py:93 +[02-15 22:57:13] INFO Training: Train Iter(60480) Env Step(1935616) Loss(0.317) func.py:93 +[02-15 22:59:08] INFO Training: Train Iter(60984) Env Step(1951744) Loss(0.003) func.py:93 +[02-15 22:59:15] INFO Evaluation: Train Iter(61000) Env Step(1952000) Mean Episode Return(923.500) func.py:93 +[02-15 23:01:09] INFO Training: Train Iter(61488) Env Step(1967872) Loss(0.006) func.py:93 +[02-15 23:03:04] INFO Training: Train Iter(61992) Env Step(1984000) Loss(0.368) func.py:93 +[02-15 23:03:09] INFO Evaluation: Train Iter(62000) Env Step(1984000) Mean Episode Return(923.500) func.py:93 +[02-15 23:05:04] INFO Training: Train Iter(62496) Env Step(2000128) Loss(0.002) func.py:93 +[02-15 23:07:03] INFO Evaluation: Train Iter(63000) Env Step(2016000) Mean Episode Return(923.500) func.py:93 +[02-15 23:07:04] INFO Training: Train Iter(63000) Env Step(2016256) Loss(0.020) func.py:93 +[02-15 23:08:59] INFO Training: Train Iter(63504) Env Step(2032384) Loss(0.373) func.py:93 +[02-15 23:10:56] INFO Evaluation: Train Iter(64000) Env Step(2048000) Mean Episode Return(923.500) func.py:93 +[02-15 23:11:00] INFO Training: Train Iter(64008) Env Step(2048512) Loss(0.002) func.py:93 +[02-15 23:12:53] INFO Training: Train Iter(64512) Env Step(2064640) Loss(0.010) func.py:93 +[02-15 23:14:45] INFO Evaluation: Train Iter(65000) Env Step(2080000) Mean Episode Return(923.500) func.py:93 +[02-15 23:14:51] INFO Training: Train Iter(65016) Env Step(2080768) Loss(0.160) func.py:93 +[02-15 23:16:44] INFO Training: Train Iter(65520) Env Step(2096896) Loss(0.001) func.py:93 +[02-15 23:18:35] INFO Evaluation: Train Iter(66000) Env Step(2112000) Mean Episode Return(923.500) func.py:93 +[02-15 23:18:42] INFO Training: Train Iter(66024) Env Step(2113024) Loss(0.106) func.py:93 +[02-15 23:20:35] INFO Training: Train Iter(66528) Env Step(2129152) Loss(0.245) func.py:93 +[02-15 23:22:23] INFO Evaluation: Train Iter(67000) Env Step(2144000) Mean Episode Return(923.500) func.py:93 +[02-15 23:22:32] INFO Training: Train Iter(67032) Env Step(2145280) Loss(0.023) func.py:93 +[02-15 23:24:26] INFO Training: Train Iter(67536) Env Step(2161408) Loss(0.074) func.py:93 +[02-15 23:26:13] INFO Evaluation: Train Iter(68000) Env Step(2176000) Mean Episode Return(923.500) func.py:93 +[02-15 23:26:24] INFO Training: Train Iter(68040) Env Step(2177536) Loss(0.138) func.py:93 +[02-15 23:28:17] INFO Training: Train Iter(68544) Env Step(2193664) Loss(0.001) func.py:93 +[02-15 23:30:03] INFO Evaluation: Train Iter(69000) Env Step(2208000) Mean Episode Return(923.500) func.py:93 +[02-15 23:30:15] INFO Training: Train Iter(69048) Env Step(2209792) Loss(0.168) func.py:93 +[02-15 23:32:08] INFO Training: Train Iter(69552) Env Step(2225920) Loss(0.003) func.py:93 +[02-15 23:33:52] INFO Evaluation: Train Iter(70000) Env Step(2240000) Mean Episode Return(923.500) func.py:93 +[02-15 23:34:07] INFO Training: Train Iter(70056) Env Step(2242048) Loss(0.003) func.py:93 +[02-15 23:35:59] INFO Training: Train Iter(70560) Env Step(2258176) Loss(0.210) func.py:93 +[02-15 23:37:41] INFO Evaluation: Train Iter(71000) Env Step(2272000) Mean Episode Return(923.500) func.py:93 +[02-15 23:37:57] INFO Training: Train Iter(71064) Env Step(2274304) Loss(0.089) func.py:93 \ No newline at end of file From 70a2a13d10326c6c72d9b49dd90dc01c75577e70 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 23:47:55 +0800 Subject: [PATCH 21/29] Delete q2.log --- chapter3_obs/Q2/q2.log | 215 ----------------------------------------- 1 file changed, 215 deletions(-) delete mode 100644 chapter3_obs/Q2/q2.log diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log deleted file mode 100644 index b5cc6d0..0000000 --- a/chapter3_obs/Q2/q2.log +++ /dev/null @@ -1,215 +0,0 @@ -[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 -[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 -[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 -[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 -[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 -[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 -[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 -[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 -[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 -[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 -[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 -[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 -[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 -[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 -[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 -[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 -[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 -[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 -[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 -[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 -[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 -[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 -[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 -[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 -[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 -[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 -[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 -[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 -[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 -[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 -[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 -[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 -[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 -[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 -[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 -[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 -[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 -[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 -[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 -[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 -[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 -[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 -[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 -[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 -[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 -[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 -[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 -[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 -[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 -[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 -[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 -[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 -[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 -[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 -[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 -[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 -[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 -[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 -[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 -[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 -[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 -[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 -[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 -[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 -[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 -[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 -[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 -[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 -[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 -[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 -[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 -[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 -[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 -[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 -[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 -[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 -[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 -[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 -[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 -[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 -[02-15 20:42:05] INFO Training: Train Iter(26208) Env Step(838912) Loss(0.302) func.py:93 -[02-15 20:44:05] INFO Training: Train Iter(26712) Env Step(855040) Loss(0.115) func.py:93 -[02-15 20:45:17] INFO Evaluation: Train Iter(27000) Env Step(864000) Mean Episode Return(923.500) func.py:93 -[02-15 20:46:17] INFO Training: Train Iter(27216) Env Step(871168) Loss(0.178) func.py:93 -[02-15 20:48:20] INFO Training: Train Iter(27720) Env Step(887296) Loss(0.102) func.py:93 -[02-15 20:49:29] INFO Evaluation: Train Iter(28000) Env Step(896000) Mean Episode Return(381.750) func.py:93 -[02-15 20:50:24] INFO Training: Train Iter(28224) Env Step(903424) Loss(0.302) func.py:93 -[02-15 20:52:25] INFO Training: Train Iter(28728) Env Step(919552) Loss(0.193) func.py:93 -[02-15 20:53:31] INFO Evaluation: Train Iter(29000) Env Step(928000) Mean Episode Return(645.500) func.py:93 -[02-15 20:54:27] INFO Training: Train Iter(29232) Env Step(935680) Loss(0.090) func.py:93 -[02-15 20:56:24] INFO Training: Train Iter(29736) Env Step(951808) Loss(0.199) func.py:93 -[02-15 20:57:30] INFO Evaluation: Train Iter(30000) Env Step(960000) Mean Episode Return(923.500) func.py:93 -[02-15 20:58:28] INFO Training: Train Iter(30240) Env Step(967936) Loss(0.302) func.py:93 -[02-15 21:00:26] INFO Training: Train Iter(30744) Env Step(984064) Loss(0.252) func.py:93 -[02-15 21:01:29] INFO Evaluation: Train Iter(31000) Env Step(992000) Mean Episode Return(372.750) func.py:93 -[02-15 21:02:31] INFO Training: Train Iter(31248) Env Step(1000192) Loss(0.170) func.py:93 -[02-15 21:04:30] INFO Training: Train Iter(31752) Env Step(1016320) Loss(0.097) func.py:93 -[02-15 21:05:32] INFO Evaluation: Train Iter(32000) Env Step(1024000) Mean Episode Return(383.500) func.py:93 -[02-15 21:06:35] INFO Training: Train Iter(32256) Env Step(1032448) Loss(0.122) func.py:93 -[02-15 21:08:34] INFO Training: Train Iter(32760) Env Step(1048576) Loss(0.552) func.py:93 -[02-15 21:09:35] INFO Evaluation: Train Iter(33000) Env Step(1056000) Mean Episode Return(923.500) func.py:93 -[02-15 21:10:41] INFO Training: Train Iter(33264) Env Step(1064704) Loss(0.670) func.py:93 -[02-15 21:12:39] INFO Training: Train Iter(33768) Env Step(1080832) Loss(0.005) func.py:93 -[02-15 21:13:37] INFO Evaluation: Train Iter(34000) Env Step(1088000) Mean Episode Return(923.500) func.py:93 -[02-15 21:14:43] INFO Training: Train Iter(34272) Env Step(1096960) Loss(0.005) func.py:93 -[02-15 21:16:41] INFO Training: Train Iter(34776) Env Step(1113088) Loss(0.531) func.py:93 -[02-15 21:17:42] INFO Evaluation: Train Iter(35000) Env Step(1120000) Mean Episode Return(923.500) func.py:93 -[02-15 21:18:51] INFO Training: Train Iter(35280) Env Step(1129216) Loss(0.001) func.py:93 -[02-15 21:20:50] INFO Training: Train Iter(35784) Env Step(1145344) Loss(0.002) func.py:93 -[02-15 21:21:42] INFO Evaluation: Train Iter(36000) Env Step(1152000) Mean Episode Return(923.500) func.py:93 -[02-15 21:22:50] INFO Training: Train Iter(36288) Env Step(1161472) Loss(0.172) func.py:93 -[02-15 21:24:46] INFO Training: Train Iter(36792) Env Step(1177600) Loss(0.230) func.py:93 -[02-15 21:25:40] INFO Evaluation: Train Iter(37000) Env Step(1184000) Mean Episode Return(58.750) func.py:93 -[02-15 21:26:52] INFO Training: Train Iter(37296) Env Step(1193728) Loss(0.080) func.py:93 -[02-15 21:28:51] INFO Training: Train Iter(37800) Env Step(1209856) Loss(0.228) func.py:93 -[02-15 21:29:43] INFO Evaluation: Train Iter(38000) Env Step(1216000) Mean Episode Return(923.500) func.py:93 -[02-15 21:30:58] INFO Training: Train Iter(38304) Env Step(1225984) Loss(0.180) func.py:93 -[02-15 21:32:56] INFO Training: Train Iter(38808) Env Step(1242112) Loss(0.155) func.py:93 -[02-15 21:33:45] INFO Evaluation: Train Iter(39000) Env Step(1248000) Mean Episode Return(923.500) func.py:93 -[02-15 21:34:59] INFO Training: Train Iter(39312) Env Step(1258240) Loss(0.230) func.py:93 -[02-15 21:36:56] INFO Training: Train Iter(39816) Env Step(1274368) Loss(0.119) func.py:93 -[02-15 21:37:42] INFO Evaluation: Train Iter(40000) Env Step(1280000) Mean Episode Return(923.500) func.py:93 -[02-15 21:38:56] INFO Training: Train Iter(40320) Env Step(1290496) Loss(0.031) func.py:93 -[02-15 21:40:49] INFO Training: Train Iter(40824) Env Step(1306624) Loss(0.028) func.py:93 -[02-15 21:41:32] INFO Evaluation: Train Iter(41000) Env Step(1312000) Mean Episode Return(923.500) func.py:93 -[02-15 21:42:47] INFO Training: Train Iter(41328) Env Step(1322752) Loss(0.046) func.py:93 -[02-15 21:44:39] INFO Training: Train Iter(41832) Env Step(1338880) Loss(0.036) func.py:93 -[02-15 21:45:20] INFO Evaluation: Train Iter(42000) Env Step(1344000) Mean Episode Return(923.500) func.py:93 -[02-15 21:46:38] INFO Training: Train Iter(42336) Env Step(1355008) Loss(0.097) func.py:93 -[02-15 21:48:32] INFO Training: Train Iter(42840) Env Step(1371136) Loss(0.000) func.py:93 -[02-15 21:49:09] INFO Evaluation: Train Iter(43000) Env Step(1376000) Mean Episode Return(387.000) func.py:93 -[02-15 21:50:28] INFO Training: Train Iter(43344) Env Step(1387264) Loss(-0.000) func.py:93 -[02-15 21:52:21] INFO Training: Train Iter(43848) Env Step(1403392) Loss(0.000) func.py:93 -[02-15 21:52:57] INFO Evaluation: Train Iter(44000) Env Step(1408000) Mean Episode Return(387.000) func.py:93 -[02-15 21:54:18] INFO Training: Train Iter(44352) Env Step(1419520) Loss(0.000) func.py:93 -[02-15 21:56:11] INFO Training: Train Iter(44856) Env Step(1435648) Loss(0.000) func.py:93 -[02-15 21:56:45] INFO Evaluation: Train Iter(45000) Env Step(1440000) Mean Episode Return(387.000) func.py:93 -[02-15 21:58:07] INFO Training: Train Iter(45360) Env Step(1451776) Loss(0.065) func.py:93 -[02-15 22:00:00] INFO Training: Train Iter(45864) Env Step(1467904) Loss(0.018) func.py:93 -[02-15 22:00:34] INFO Evaluation: Train Iter(46000) Env Step(1472000) Mean Episode Return(98.750) func.py:93 -[02-15 22:01:58] INFO Training: Train Iter(46368) Env Step(1484032) Loss(0.000) func.py:93 -[02-15 22:03:52] INFO Training: Train Iter(46872) Env Step(1500160) Loss(0.000) func.py:93 -[02-15 22:04:21] INFO Evaluation: Train Iter(47000) Env Step(1504000) Mean Episode Return(380.250) func.py:93 -[02-15 22:05:48] INFO Training: Train Iter(47376) Env Step(1516288) Loss(0.082) func.py:93 -[02-15 22:07:41] INFO Training: Train Iter(47880) Env Step(1532416) Loss(0.000) func.py:93 -[02-15 22:08:09] INFO Evaluation: Train Iter(48000) Env Step(1536000) Mean Episode Return(373.250) func.py:93 -[02-15 22:09:40] INFO Training: Train Iter(48384) Env Step(1548544) Loss(0.015) func.py:93 -[02-15 22:11:43] INFO Training: Train Iter(48888) Env Step(1564672) Loss(0.012) func.py:93 -[02-15 22:12:13] INFO Evaluation: Train Iter(49000) Env Step(1568000) Mean Episode Return(130.750) func.py:93 -[02-15 22:13:49] INFO Training: Train Iter(49392) Env Step(1580800) Loss(0.003) func.py:93 -[02-15 22:15:46] INFO Training: Train Iter(49896) Env Step(1596928) Loss(0.002) func.py:93 -[02-15 22:16:14] INFO Evaluation: Train Iter(50000) Env Step(1600000) Mean Episode Return(130.750) func.py:93 -[02-15 22:17:50] INFO Training: Train Iter(50400) Env Step(1613056) Loss(0.026) func.py:93 -[02-15 22:19:47] INFO Training: Train Iter(50904) Env Step(1629184) Loss(0.017) func.py:93 -[02-15 22:20:13] INFO Evaluation: Train Iter(51000) Env Step(1632000) Mean Episode Return(130.750) func.py:93 -[02-15 22:21:48] INFO Training: Train Iter(51408) Env Step(1645312) Loss(0.007) func.py:93 -[02-15 22:23:43] INFO Training: Train Iter(51912) Env Step(1661440) Loss(0.010) func.py:93 -[02-15 22:24:07] INFO Evaluation: Train Iter(52000) Env Step(1664000) Mean Episode Return(58.750) func.py:93 -[02-15 22:25:45] INFO Training: Train Iter(52416) Env Step(1677568) Loss(0.016) func.py:93 -[02-15 22:27:42] INFO Training: Train Iter(52920) Env Step(1693696) Loss(0.054) func.py:93 -[02-15 22:28:03] INFO Evaluation: Train Iter(53000) Env Step(1696000) Mean Episode Return(923.500) func.py:93 -[02-15 22:29:43] INFO Training: Train Iter(53424) Env Step(1709824) Loss(0.044) func.py:93 -[02-15 22:31:39] INFO Training: Train Iter(53928) Env Step(1725952) Loss(0.076) func.py:93 -[02-15 22:31:59] INFO Evaluation: Train Iter(54000) Env Step(1728000) Mean Episode Return(923.500) func.py:93 -[02-15 22:33:40] INFO Training: Train Iter(54432) Env Step(1742080) Loss(0.083) func.py:93 -[02-15 22:35:35] INFO Training: Train Iter(54936) Env Step(1758208) Loss(0.297) func.py:93 -[02-15 22:35:53] INFO Evaluation: Train Iter(55000) Env Step(1760000) Mean Episode Return(923.500) func.py:93 -[02-15 22:37:35] INFO Training: Train Iter(55440) Env Step(1774336) Loss(0.007) func.py:93 -[02-15 22:39:30] INFO Training: Train Iter(55944) Env Step(1790464) Loss(0.001) func.py:93 -[02-15 22:39:46] INFO Evaluation: Train Iter(56000) Env Step(1792000) Mean Episode Return(58.750) func.py:93 -[02-15 22:41:31] INFO Training: Train Iter(56448) Env Step(1806592) Loss(0.011) func.py:93 -[02-15 22:43:26] INFO Training: Train Iter(56952) Env Step(1822720) Loss(0.010) func.py:93 -[02-15 22:43:40] INFO Evaluation: Train Iter(57000) Env Step(1824000) Mean Episode Return(58.750) func.py:93 -[02-15 22:45:27] INFO Training: Train Iter(57456) Env Step(1838848) Loss(0.008) func.py:93 -[02-15 22:47:21] INFO Training: Train Iter(57960) Env Step(1854976) Loss(0.013) func.py:93 -[02-15 22:47:34] INFO Evaluation: Train Iter(58000) Env Step(1856000) Mean Episode Return(58.750) func.py:93 -[02-15 22:49:22] INFO Training: Train Iter(58464) Env Step(1871104) Loss(0.143) func.py:93 -[02-15 22:51:17] INFO Training: Train Iter(58968) Env Step(1887232) Loss(0.140) func.py:93 -[02-15 22:51:28] INFO Evaluation: Train Iter(59000) Env Step(1888000) Mean Episode Return(58.750) func.py:93 -[02-15 22:53:18] INFO Training: Train Iter(59472) Env Step(1903360) Loss(0.006) func.py:93 -[02-15 22:55:13] INFO Training: Train Iter(59976) Env Step(1919488) Loss(0.004) func.py:93 -[02-15 22:55:22] INFO Evaluation: Train Iter(60000) Env Step(1920000) Mean Episode Return(923.500) func.py:93 -[02-15 22:57:13] INFO Training: Train Iter(60480) Env Step(1935616) Loss(0.317) func.py:93 -[02-15 22:59:08] INFO Training: Train Iter(60984) Env Step(1951744) Loss(0.003) func.py:93 -[02-15 22:59:15] INFO Evaluation: Train Iter(61000) Env Step(1952000) Mean Episode Return(923.500) func.py:93 -[02-15 23:01:09] INFO Training: Train Iter(61488) Env Step(1967872) Loss(0.006) func.py:93 -[02-15 23:03:04] INFO Training: Train Iter(61992) Env Step(1984000) Loss(0.368) func.py:93 -[02-15 23:03:09] INFO Evaluation: Train Iter(62000) Env Step(1984000) Mean Episode Return(923.500) func.py:93 -[02-15 23:05:04] INFO Training: Train Iter(62496) Env Step(2000128) Loss(0.002) func.py:93 -[02-15 23:07:03] INFO Evaluation: Train Iter(63000) Env Step(2016000) Mean Episode Return(923.500) func.py:93 -[02-15 23:07:04] INFO Training: Train Iter(63000) Env Step(2016256) Loss(0.020) func.py:93 -[02-15 23:08:59] INFO Training: Train Iter(63504) Env Step(2032384) Loss(0.373) func.py:93 -[02-15 23:10:56] INFO Evaluation: Train Iter(64000) Env Step(2048000) Mean Episode Return(923.500) func.py:93 -[02-15 23:11:00] INFO Training: Train Iter(64008) Env Step(2048512) Loss(0.002) func.py:93 -[02-15 23:12:53] INFO Training: Train Iter(64512) Env Step(2064640) Loss(0.010) func.py:93 -[02-15 23:14:45] INFO Evaluation: Train Iter(65000) Env Step(2080000) Mean Episode Return(923.500) func.py:93 -[02-15 23:14:51] INFO Training: Train Iter(65016) Env Step(2080768) Loss(0.160) func.py:93 -[02-15 23:16:44] INFO Training: Train Iter(65520) Env Step(2096896) Loss(0.001) func.py:93 -[02-15 23:18:35] INFO Evaluation: Train Iter(66000) Env Step(2112000) Mean Episode Return(923.500) func.py:93 -[02-15 23:18:42] INFO Training: Train Iter(66024) Env Step(2113024) Loss(0.106) func.py:93 -[02-15 23:20:35] INFO Training: Train Iter(66528) Env Step(2129152) Loss(0.245) func.py:93 -[02-15 23:22:23] INFO Evaluation: Train Iter(67000) Env Step(2144000) Mean Episode Return(923.500) func.py:93 -[02-15 23:22:32] INFO Training: Train Iter(67032) Env Step(2145280) Loss(0.023) func.py:93 -[02-15 23:24:26] INFO Training: Train Iter(67536) Env Step(2161408) Loss(0.074) func.py:93 -[02-15 23:26:13] INFO Evaluation: Train Iter(68000) Env Step(2176000) Mean Episode Return(923.500) func.py:93 -[02-15 23:26:24] INFO Training: Train Iter(68040) Env Step(2177536) Loss(0.138) func.py:93 -[02-15 23:28:17] INFO Training: Train Iter(68544) Env Step(2193664) Loss(0.001) func.py:93 -[02-15 23:30:03] INFO Evaluation: Train Iter(69000) Env Step(2208000) Mean Episode Return(923.500) func.py:93 -[02-15 23:30:15] INFO Training: Train Iter(69048) Env Step(2209792) Loss(0.168) func.py:93 -[02-15 23:32:08] INFO Training: Train Iter(69552) Env Step(2225920) Loss(0.003) func.py:93 -[02-15 23:33:52] INFO Evaluation: Train Iter(70000) Env Step(2240000) Mean Episode Return(923.500) func.py:93 -[02-15 23:34:07] INFO Training: Train Iter(70056) Env Step(2242048) Loss(0.003) func.py:93 -[02-15 23:35:59] INFO Training: Train Iter(70560) Env Step(2258176) Loss(0.210) func.py:93 -[02-15 23:37:41] INFO Evaluation: Train Iter(71000) Env Step(2272000) Mean Episode Return(923.500) func.py:93 -[02-15 23:37:57] INFO Training: Train Iter(71064) Env Step(2274304) Loss(0.089) func.py:93 \ No newline at end of file From 4f60a522a12721101500402db1ae93ba06f4810c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Wed, 15 Feb 2023 23:48:18 +0800 Subject: [PATCH 22/29] Add files via upload --- chapter3_obs/Q2/q2.log | 215 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 chapter3_obs/Q2/q2.log diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log new file mode 100644 index 0000000..b5cc6d0 --- /dev/null +++ b/chapter3_obs/Q2/q2.log @@ -0,0 +1,215 @@ +[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 +[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 +[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 +[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 +[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 +[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 +[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 +[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 +[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 +[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 +[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 +[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 +[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 +[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 +[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 +[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 +[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 +[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 +[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 +[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 +[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 +[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 +[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 +[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 +[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 +[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 +[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 +[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 +[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 +[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 +[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 +[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 +[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 +[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 +[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 +[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 +[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 +[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 +[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 +[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 +[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 +[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 +[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 +[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 +[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 +[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 +[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 +[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 +[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 +[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 +[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 +[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 +[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 +[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 +[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 +[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 +[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 +[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 +[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 +[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 +[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 +[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 +[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 +[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 +[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 +[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 +[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 +[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 +[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 +[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 +[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 +[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 +[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 +[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 +[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 +[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 +[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 +[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 +[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 +[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 +[02-15 20:42:05] INFO Training: Train Iter(26208) Env Step(838912) Loss(0.302) func.py:93 +[02-15 20:44:05] INFO Training: Train Iter(26712) Env Step(855040) Loss(0.115) func.py:93 +[02-15 20:45:17] INFO Evaluation: Train Iter(27000) Env Step(864000) Mean Episode Return(923.500) func.py:93 +[02-15 20:46:17] INFO Training: Train Iter(27216) Env Step(871168) Loss(0.178) func.py:93 +[02-15 20:48:20] INFO Training: Train Iter(27720) Env Step(887296) Loss(0.102) func.py:93 +[02-15 20:49:29] INFO Evaluation: Train Iter(28000) Env Step(896000) Mean Episode Return(381.750) func.py:93 +[02-15 20:50:24] INFO Training: Train Iter(28224) Env Step(903424) Loss(0.302) func.py:93 +[02-15 20:52:25] INFO Training: Train Iter(28728) Env Step(919552) Loss(0.193) func.py:93 +[02-15 20:53:31] INFO Evaluation: Train Iter(29000) Env Step(928000) Mean Episode Return(645.500) func.py:93 +[02-15 20:54:27] INFO Training: Train Iter(29232) Env Step(935680) Loss(0.090) func.py:93 +[02-15 20:56:24] INFO Training: Train Iter(29736) Env Step(951808) Loss(0.199) func.py:93 +[02-15 20:57:30] INFO Evaluation: Train Iter(30000) Env Step(960000) Mean Episode Return(923.500) func.py:93 +[02-15 20:58:28] INFO Training: Train Iter(30240) Env Step(967936) Loss(0.302) func.py:93 +[02-15 21:00:26] INFO Training: Train Iter(30744) Env Step(984064) Loss(0.252) func.py:93 +[02-15 21:01:29] INFO Evaluation: Train Iter(31000) Env Step(992000) Mean Episode Return(372.750) func.py:93 +[02-15 21:02:31] INFO Training: Train Iter(31248) Env Step(1000192) Loss(0.170) func.py:93 +[02-15 21:04:30] INFO Training: Train Iter(31752) Env Step(1016320) Loss(0.097) func.py:93 +[02-15 21:05:32] INFO Evaluation: Train Iter(32000) Env Step(1024000) Mean Episode Return(383.500) func.py:93 +[02-15 21:06:35] INFO Training: Train Iter(32256) Env Step(1032448) Loss(0.122) func.py:93 +[02-15 21:08:34] INFO Training: Train Iter(32760) Env Step(1048576) Loss(0.552) func.py:93 +[02-15 21:09:35] INFO Evaluation: Train Iter(33000) Env Step(1056000) Mean Episode Return(923.500) func.py:93 +[02-15 21:10:41] INFO Training: Train Iter(33264) Env Step(1064704) Loss(0.670) func.py:93 +[02-15 21:12:39] INFO Training: Train Iter(33768) Env Step(1080832) Loss(0.005) func.py:93 +[02-15 21:13:37] INFO Evaluation: Train Iter(34000) Env Step(1088000) Mean Episode Return(923.500) func.py:93 +[02-15 21:14:43] INFO Training: Train Iter(34272) Env Step(1096960) Loss(0.005) func.py:93 +[02-15 21:16:41] INFO Training: Train Iter(34776) Env Step(1113088) Loss(0.531) func.py:93 +[02-15 21:17:42] INFO Evaluation: Train Iter(35000) Env Step(1120000) Mean Episode Return(923.500) func.py:93 +[02-15 21:18:51] INFO Training: Train Iter(35280) Env Step(1129216) Loss(0.001) func.py:93 +[02-15 21:20:50] INFO Training: Train Iter(35784) Env Step(1145344) Loss(0.002) func.py:93 +[02-15 21:21:42] INFO Evaluation: Train Iter(36000) Env Step(1152000) Mean Episode Return(923.500) func.py:93 +[02-15 21:22:50] INFO Training: Train Iter(36288) Env Step(1161472) Loss(0.172) func.py:93 +[02-15 21:24:46] INFO Training: Train Iter(36792) Env Step(1177600) Loss(0.230) func.py:93 +[02-15 21:25:40] INFO Evaluation: Train Iter(37000) Env Step(1184000) Mean Episode Return(58.750) func.py:93 +[02-15 21:26:52] INFO Training: Train Iter(37296) Env Step(1193728) Loss(0.080) func.py:93 +[02-15 21:28:51] INFO Training: Train Iter(37800) Env Step(1209856) Loss(0.228) func.py:93 +[02-15 21:29:43] INFO Evaluation: Train Iter(38000) Env Step(1216000) Mean Episode Return(923.500) func.py:93 +[02-15 21:30:58] INFO Training: Train Iter(38304) Env Step(1225984) Loss(0.180) func.py:93 +[02-15 21:32:56] INFO Training: Train Iter(38808) Env Step(1242112) Loss(0.155) func.py:93 +[02-15 21:33:45] INFO Evaluation: Train Iter(39000) Env Step(1248000) Mean Episode Return(923.500) func.py:93 +[02-15 21:34:59] INFO Training: Train Iter(39312) Env Step(1258240) Loss(0.230) func.py:93 +[02-15 21:36:56] INFO Training: Train Iter(39816) Env Step(1274368) Loss(0.119) func.py:93 +[02-15 21:37:42] INFO Evaluation: Train Iter(40000) Env Step(1280000) Mean Episode Return(923.500) func.py:93 +[02-15 21:38:56] INFO Training: Train Iter(40320) Env Step(1290496) Loss(0.031) func.py:93 +[02-15 21:40:49] INFO Training: Train Iter(40824) Env Step(1306624) Loss(0.028) func.py:93 +[02-15 21:41:32] INFO Evaluation: Train Iter(41000) Env Step(1312000) Mean Episode Return(923.500) func.py:93 +[02-15 21:42:47] INFO Training: Train Iter(41328) Env Step(1322752) Loss(0.046) func.py:93 +[02-15 21:44:39] INFO Training: Train Iter(41832) Env Step(1338880) Loss(0.036) func.py:93 +[02-15 21:45:20] INFO Evaluation: Train Iter(42000) Env Step(1344000) Mean Episode Return(923.500) func.py:93 +[02-15 21:46:38] INFO Training: Train Iter(42336) Env Step(1355008) Loss(0.097) func.py:93 +[02-15 21:48:32] INFO Training: Train Iter(42840) Env Step(1371136) Loss(0.000) func.py:93 +[02-15 21:49:09] INFO Evaluation: Train Iter(43000) Env Step(1376000) Mean Episode Return(387.000) func.py:93 +[02-15 21:50:28] INFO Training: Train Iter(43344) Env Step(1387264) Loss(-0.000) func.py:93 +[02-15 21:52:21] INFO Training: Train Iter(43848) Env Step(1403392) Loss(0.000) func.py:93 +[02-15 21:52:57] INFO Evaluation: Train Iter(44000) Env Step(1408000) Mean Episode Return(387.000) func.py:93 +[02-15 21:54:18] INFO Training: Train Iter(44352) Env Step(1419520) Loss(0.000) func.py:93 +[02-15 21:56:11] INFO Training: Train Iter(44856) Env Step(1435648) Loss(0.000) func.py:93 +[02-15 21:56:45] INFO Evaluation: Train Iter(45000) Env Step(1440000) Mean Episode Return(387.000) func.py:93 +[02-15 21:58:07] INFO Training: Train Iter(45360) Env Step(1451776) Loss(0.065) func.py:93 +[02-15 22:00:00] INFO Training: Train Iter(45864) Env Step(1467904) Loss(0.018) func.py:93 +[02-15 22:00:34] INFO Evaluation: Train Iter(46000) Env Step(1472000) Mean Episode Return(98.750) func.py:93 +[02-15 22:01:58] INFO Training: Train Iter(46368) Env Step(1484032) Loss(0.000) func.py:93 +[02-15 22:03:52] INFO Training: Train Iter(46872) Env Step(1500160) Loss(0.000) func.py:93 +[02-15 22:04:21] INFO Evaluation: Train Iter(47000) Env Step(1504000) Mean Episode Return(380.250) func.py:93 +[02-15 22:05:48] INFO Training: Train Iter(47376) Env Step(1516288) Loss(0.082) func.py:93 +[02-15 22:07:41] INFO Training: Train Iter(47880) Env Step(1532416) Loss(0.000) func.py:93 +[02-15 22:08:09] INFO Evaluation: Train Iter(48000) Env Step(1536000) Mean Episode Return(373.250) func.py:93 +[02-15 22:09:40] INFO Training: Train Iter(48384) Env Step(1548544) Loss(0.015) func.py:93 +[02-15 22:11:43] INFO Training: Train Iter(48888) Env Step(1564672) Loss(0.012) func.py:93 +[02-15 22:12:13] INFO Evaluation: Train Iter(49000) Env Step(1568000) Mean Episode Return(130.750) func.py:93 +[02-15 22:13:49] INFO Training: Train Iter(49392) Env Step(1580800) Loss(0.003) func.py:93 +[02-15 22:15:46] INFO Training: Train Iter(49896) Env Step(1596928) Loss(0.002) func.py:93 +[02-15 22:16:14] INFO Evaluation: Train Iter(50000) Env Step(1600000) Mean Episode Return(130.750) func.py:93 +[02-15 22:17:50] INFO Training: Train Iter(50400) Env Step(1613056) Loss(0.026) func.py:93 +[02-15 22:19:47] INFO Training: Train Iter(50904) Env Step(1629184) Loss(0.017) func.py:93 +[02-15 22:20:13] INFO Evaluation: Train Iter(51000) Env Step(1632000) Mean Episode Return(130.750) func.py:93 +[02-15 22:21:48] INFO Training: Train Iter(51408) Env Step(1645312) Loss(0.007) func.py:93 +[02-15 22:23:43] INFO Training: Train Iter(51912) Env Step(1661440) Loss(0.010) func.py:93 +[02-15 22:24:07] INFO Evaluation: Train Iter(52000) Env Step(1664000) Mean Episode Return(58.750) func.py:93 +[02-15 22:25:45] INFO Training: Train Iter(52416) Env Step(1677568) Loss(0.016) func.py:93 +[02-15 22:27:42] INFO Training: Train Iter(52920) Env Step(1693696) Loss(0.054) func.py:93 +[02-15 22:28:03] INFO Evaluation: Train Iter(53000) Env Step(1696000) Mean Episode Return(923.500) func.py:93 +[02-15 22:29:43] INFO Training: Train Iter(53424) Env Step(1709824) Loss(0.044) func.py:93 +[02-15 22:31:39] INFO Training: Train Iter(53928) Env Step(1725952) Loss(0.076) func.py:93 +[02-15 22:31:59] INFO Evaluation: Train Iter(54000) Env Step(1728000) Mean Episode Return(923.500) func.py:93 +[02-15 22:33:40] INFO Training: Train Iter(54432) Env Step(1742080) Loss(0.083) func.py:93 +[02-15 22:35:35] INFO Training: Train Iter(54936) Env Step(1758208) Loss(0.297) func.py:93 +[02-15 22:35:53] INFO Evaluation: Train Iter(55000) Env Step(1760000) Mean Episode Return(923.500) func.py:93 +[02-15 22:37:35] INFO Training: Train Iter(55440) Env Step(1774336) Loss(0.007) func.py:93 +[02-15 22:39:30] INFO Training: Train Iter(55944) Env Step(1790464) Loss(0.001) func.py:93 +[02-15 22:39:46] INFO Evaluation: Train Iter(56000) Env Step(1792000) Mean Episode Return(58.750) func.py:93 +[02-15 22:41:31] INFO Training: Train Iter(56448) Env Step(1806592) Loss(0.011) func.py:93 +[02-15 22:43:26] INFO Training: Train Iter(56952) Env Step(1822720) Loss(0.010) func.py:93 +[02-15 22:43:40] INFO Evaluation: Train Iter(57000) Env Step(1824000) Mean Episode Return(58.750) func.py:93 +[02-15 22:45:27] INFO Training: Train Iter(57456) Env Step(1838848) Loss(0.008) func.py:93 +[02-15 22:47:21] INFO Training: Train Iter(57960) Env Step(1854976) Loss(0.013) func.py:93 +[02-15 22:47:34] INFO Evaluation: Train Iter(58000) Env Step(1856000) Mean Episode Return(58.750) func.py:93 +[02-15 22:49:22] INFO Training: Train Iter(58464) Env Step(1871104) Loss(0.143) func.py:93 +[02-15 22:51:17] INFO Training: Train Iter(58968) Env Step(1887232) Loss(0.140) func.py:93 +[02-15 22:51:28] INFO Evaluation: Train Iter(59000) Env Step(1888000) Mean Episode Return(58.750) func.py:93 +[02-15 22:53:18] INFO Training: Train Iter(59472) Env Step(1903360) Loss(0.006) func.py:93 +[02-15 22:55:13] INFO Training: Train Iter(59976) Env Step(1919488) Loss(0.004) func.py:93 +[02-15 22:55:22] INFO Evaluation: Train Iter(60000) Env Step(1920000) Mean Episode Return(923.500) func.py:93 +[02-15 22:57:13] INFO Training: Train Iter(60480) Env Step(1935616) Loss(0.317) func.py:93 +[02-15 22:59:08] INFO Training: Train Iter(60984) Env Step(1951744) Loss(0.003) func.py:93 +[02-15 22:59:15] INFO Evaluation: Train Iter(61000) Env Step(1952000) Mean Episode Return(923.500) func.py:93 +[02-15 23:01:09] INFO Training: Train Iter(61488) Env Step(1967872) Loss(0.006) func.py:93 +[02-15 23:03:04] INFO Training: Train Iter(61992) Env Step(1984000) Loss(0.368) func.py:93 +[02-15 23:03:09] INFO Evaluation: Train Iter(62000) Env Step(1984000) Mean Episode Return(923.500) func.py:93 +[02-15 23:05:04] INFO Training: Train Iter(62496) Env Step(2000128) Loss(0.002) func.py:93 +[02-15 23:07:03] INFO Evaluation: Train Iter(63000) Env Step(2016000) Mean Episode Return(923.500) func.py:93 +[02-15 23:07:04] INFO Training: Train Iter(63000) Env Step(2016256) Loss(0.020) func.py:93 +[02-15 23:08:59] INFO Training: Train Iter(63504) Env Step(2032384) Loss(0.373) func.py:93 +[02-15 23:10:56] INFO Evaluation: Train Iter(64000) Env Step(2048000) Mean Episode Return(923.500) func.py:93 +[02-15 23:11:00] INFO Training: Train Iter(64008) Env Step(2048512) Loss(0.002) func.py:93 +[02-15 23:12:53] INFO Training: Train Iter(64512) Env Step(2064640) Loss(0.010) func.py:93 +[02-15 23:14:45] INFO Evaluation: Train Iter(65000) Env Step(2080000) Mean Episode Return(923.500) func.py:93 +[02-15 23:14:51] INFO Training: Train Iter(65016) Env Step(2080768) Loss(0.160) func.py:93 +[02-15 23:16:44] INFO Training: Train Iter(65520) Env Step(2096896) Loss(0.001) func.py:93 +[02-15 23:18:35] INFO Evaluation: Train Iter(66000) Env Step(2112000) Mean Episode Return(923.500) func.py:93 +[02-15 23:18:42] INFO Training: Train Iter(66024) Env Step(2113024) Loss(0.106) func.py:93 +[02-15 23:20:35] INFO Training: Train Iter(66528) Env Step(2129152) Loss(0.245) func.py:93 +[02-15 23:22:23] INFO Evaluation: Train Iter(67000) Env Step(2144000) Mean Episode Return(923.500) func.py:93 +[02-15 23:22:32] INFO Training: Train Iter(67032) Env Step(2145280) Loss(0.023) func.py:93 +[02-15 23:24:26] INFO Training: Train Iter(67536) Env Step(2161408) Loss(0.074) func.py:93 +[02-15 23:26:13] INFO Evaluation: Train Iter(68000) Env Step(2176000) Mean Episode Return(923.500) func.py:93 +[02-15 23:26:24] INFO Training: Train Iter(68040) Env Step(2177536) Loss(0.138) func.py:93 +[02-15 23:28:17] INFO Training: Train Iter(68544) Env Step(2193664) Loss(0.001) func.py:93 +[02-15 23:30:03] INFO Evaluation: Train Iter(69000) Env Step(2208000) Mean Episode Return(923.500) func.py:93 +[02-15 23:30:15] INFO Training: Train Iter(69048) Env Step(2209792) Loss(0.168) func.py:93 +[02-15 23:32:08] INFO Training: Train Iter(69552) Env Step(2225920) Loss(0.003) func.py:93 +[02-15 23:33:52] INFO Evaluation: Train Iter(70000) Env Step(2240000) Mean Episode Return(923.500) func.py:93 +[02-15 23:34:07] INFO Training: Train Iter(70056) Env Step(2242048) Loss(0.003) func.py:93 +[02-15 23:35:59] INFO Training: Train Iter(70560) Env Step(2258176) Loss(0.210) func.py:93 +[02-15 23:37:41] INFO Evaluation: Train Iter(71000) Env Step(2272000) Mean Episode Return(923.500) func.py:93 +[02-15 23:37:57] INFO Training: Train Iter(71064) Env Step(2274304) Loss(0.089) func.py:93 \ No newline at end of file From e885adc84de2cee434c590c49920ad532b03d131 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:29:52 +0800 Subject: [PATCH 23/29] Create README.md --- Q1/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Q1/README.md diff --git a/Q1/README.md b/Q1/README.md new file mode 100644 index 0000000..2839564 --- /dev/null +++ b/Q1/README.md @@ -0,0 +1,8 @@ +## RND主要创新点 +1、采用随机生成的固定网络作为目标网络,另一网络不断最小化与其的误差,从而达到评估观察的新颖性
+2、介绍了一种灵活地结合内在和外在奖励的方法 + +## RND结果分析 +1、little_RND_net和small_RND_net版本,一个little指标都接近于0,一个small指标很高,模型的目标就是最小化MSE,但是small版本的MSE很高,感觉这两个版本都没有训练成功。
+2、standard_RND_net这个版本是最好的版本。
+3、large_RND_net和very_large_RND_net版本,很明显,reward_min值开始提高,min值就是代表网络开始过拟合,开始往训练集过度靠拢,所以这两个版本出现了过拟合的情况。
From a33a267031e185570aeea72a4d5ec91bf610df9f Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:30:43 +0800 Subject: [PATCH 24/29] Add files via upload --- Q1/q1.jpg | Bin 0 -> 52055 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Q1/q1.jpg diff --git a/Q1/q1.jpg b/Q1/q1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cdbce60e2ec1ae90938fd8ffae5f78f268009af GIT binary patch literal 52055 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 V?ZZo}S9zALLnkuWPtjTS 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 literal 0 HcmV?d00001 From 106b858f950bc1c5628e9c90abb15b99926a0b5c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:32:25 +0800 Subject: [PATCH 25/29] Create q2.py --- Q2/q2.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Q2/q2.py diff --git a/Q2/q2.py b/Q2/q2.py new file mode 100644 index 0000000..e85e114 --- /dev/null +++ b/Q2/q2.py @@ -0,0 +1,30 @@ +# Please install latest DI-engine's main branch first +from ding.bonus import PPOF + + +def acrobot(): + # Please install acrobot env first, `pip3 install gym` + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/acrobot_zh.html) for more details + agent = PPOF(env='acrobot', exp_name='./acrobot_demo') + agent.train(step=int(1e5)) + + +def metadrive(): + # Please install metadrive env first, `pip install metadrive-simulator` + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/metadrive_zh.html) for more details + agent = PPOF(env='metadrive', exp_name='./metadrive_demo') + agent.train(step=int(1e6), context='spawn') + + +def minigrid_fourroom(): + # Please install minigrid env first, `pip install gym-minigrid` + # Note: minigrid env doesn't support Windows platform + # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/minigrid_zh.html) for more details + agent = PPOF(env='minigrid_fourroom', exp_name='./minigrid_fourroom_demo') + agent.train(step=int(3e6)) + + +if __name__ == "__main__": + # acrobot() + # metadrive() + minigrid_fourroom() From 6bbbba6f197ee7d15a146457e31595eaab28a02c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:33:07 +0800 Subject: [PATCH 26/29] Add files via upload --- Q2/result.txt | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 Q2/result.txt diff --git a/Q2/result.txt b/Q2/result.txt new file mode 100644 index 0000000..50ea991 --- /dev/null +++ b/Q2/result.txt @@ -0,0 +1,289 @@ +[03-15 20:39:58] INFO Env Space Information: base_env_manager.py:236 +[03-15 20:39:58] INFO Observation Space: Box(0.0, 255.0, (2835,), float32) base_env_manager.py:237 +[03-15 20:39:58] INFO Action Space: Discrete(7) base_env_manager.py:238 +[03-15 20:39:58] INFO Reward Space: Box(0.0, 1.0, (1,), float32) base_env_manager.py:239 +[03-15 20:39:59] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:40:14] INFO Training: Train Iter(500) Env Step(19200) Loss(0.100) trainer.py:83 +[03-15 20:40:25] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:40:28] INFO Training: Train Iter(1000) Env Step(35200) Loss(0.119) trainer.py:83 +[03-15 20:40:41] INFO Training: Train Iter(1500) Env Step(51200) Loss(-0.028) trainer.py:83 +[03-15 20:40:52] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:40:53] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1003 +[03-15 20:40:55] INFO Training: Train Iter(2000) Env Step(67200) Loss(-0.028) trainer.py:83 +[03-15 20:40:56] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:456 +[03-15 20:41:08] INFO Training: Train Iter(2500) Env Step(83200) Loss(-0.026) trainer.py:83 +[03-15 20:41:19] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:41:22] INFO Training: Train Iter(3000) Env Step(99200) Loss(0.168) trainer.py:83 +[03-15 20:41:35] INFO Training: Train Iter(3500) Env Step(115200) Loss(-0.028) trainer.py:83 +[03-15 20:41:46] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:41:48] INFO Training: Train Iter(4000) Env Step(131200) Loss(0.738) trainer.py:83 +[03-15 20:42:02] INFO Training: Train Iter(4500) Env Step(147200) Loss(-0.026) trainer.py:83 +[03-15 20:42:13] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:42:15] INFO Training: Train Iter(5000) Env Step(163200) Loss(0.612) trainer.py:83 +[03-15 20:42:28] INFO Training: Train Iter(5500) Env Step(179200) Loss(0.461) trainer.py:83 +[03-15 20:42:39] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:42:42] INFO Training: Train Iter(6000) Env Step(195200) Loss(-0.022) trainer.py:83 +[03-15 20:42:55] INFO Training: Train Iter(6500) Env Step(211200) Loss(-0.028) trainer.py:83 +[03-15 20:43:06] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:43:09] INFO Training: Train Iter(7000) Env Step(227200) Loss(0.067) trainer.py:83 +[03-15 20:43:22] INFO Training: Train Iter(7500) Env Step(243200) Loss(0.414) trainer.py:83 +[03-15 20:43:33] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:43:36] INFO Training: Train Iter(8000) Env Step(259200) Loss(-0.025) trainer.py:83 +[03-15 20:43:49] INFO Training: Train Iter(8500) Env Step(275200) Loss(0.563) trainer.py:83 +[03-15 20:44:00] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:44:02] INFO Training: Train Iter(9000) Env Step(291200) Loss(-0.028) trainer.py:83 +[03-15 20:44:15] INFO Training: Train Iter(9500) Env Step(307200) Loss(1.446) trainer.py:83 +[03-15 20:44:27] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:44:29] INFO Training: Train Iter(10000) Env Step(323200) Loss(-0.017) trainer.py:83 +[03-15 20:44:43] INFO Training: Train Iter(10500) Env Step(339200) Loss(0.046) trainer.py:83 +[03-15 20:44:54] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:44:57] INFO Training: Train Iter(11000) Env Step(355200) Loss(-0.026) trainer.py:83 +[03-15 20:45:10] INFO Training: Train Iter(11500) Env Step(371200) Loss(-0.027) trainer.py:83 +[03-15 20:45:21] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:45:24] INFO Training: Train Iter(12000) Env Step(387200) Loss(-0.024) trainer.py:83 +[03-15 20:45:37] INFO Training: Train Iter(12500) Env Step(403200) Loss(0.588) trainer.py:83 +[03-15 20:45:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:45:52] INFO Training: Train Iter(13000) Env Step(419200) Loss(-0.029) trainer.py:83 +[03-15 20:46:06] INFO Training: Train Iter(13500) Env Step(435200) Loss(-0.029) trainer.py:83 +[03-15 20:46:17] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:46:20] INFO Training: Train Iter(14000) Env Step(451200) Loss(-0.026) trainer.py:83 +[03-15 20:46:34] INFO Training: Train Iter(14500) Env Step(467200) Loss(-0.026) trainer.py:83 +[03-15 20:46:45] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:46:48] INFO Training: Train Iter(15000) Env Step(483200) Loss(-0.025) trainer.py:83 +[03-15 20:47:01] INFO Training: Train Iter(15500) Env Step(499200) Loss(0.709) trainer.py:83 +[03-15 20:47:13] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:47:16] INFO Training: Train Iter(16000) Env Step(515200) Loss(0.106) trainer.py:83 +[03-15 20:47:29] INFO Training: Train Iter(16500) Env Step(531200) Loss(-0.029) trainer.py:83 +[03-15 20:47:40] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:47:43] INFO Training: Train Iter(17000) Env Step(547200) Loss(0.122) trainer.py:83 +[03-15 20:47:56] INFO Training: Train Iter(17500) Env Step(563200) Loss(0.337) trainer.py:83 +[03-15 20:48:08] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:48:11] INFO Training: Train Iter(18000) Env Step(579200) Loss(0.227) trainer.py:83 +[03-15 20:48:24] INFO Training: Train Iter(18500) Env Step(595200) Loss(0.243) trainer.py:83 +[03-15 20:48:35] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:48:38] INFO Training: Train Iter(19000) Env Step(611200) Loss(0.254) trainer.py:83 +[03-15 20:48:51] INFO Training: Train Iter(19500) Env Step(627200) Loss(0.400) trainer.py:83 +[03-15 20:49:03] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:49:05] INFO Training: Train Iter(20000) Env Step(643200) Loss(-0.027) trainer.py:83 +[03-15 20:49:19] INFO Training: Train Iter(20500) Env Step(659200) Loss(0.151) trainer.py:83 +[03-15 20:49:30] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:49:33] INFO Training: Train Iter(21000) Env Step(675200) Loss(-0.032) trainer.py:83 +[03-15 20:49:47] INFO Training: Train Iter(21500) Env Step(691200) Loss(0.114) trainer.py:83 +[03-15 20:49:58] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:50:01] INFO Training: Train Iter(22000) Env Step(707200) Loss(0.014) trainer.py:83 +[03-15 20:50:15] INFO Training: Train Iter(22500) Env Step(723200) Loss(0.201) trainer.py:83 +[03-15 20:50:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:50:29] INFO Training: Train Iter(23000) Env Step(739200) Loss(-0.025) trainer.py:83 +[03-15 20:50:43] INFO Training: Train Iter(23500) Env Step(755200) Loss(-0.025) trainer.py:83 +[03-15 20:50:54] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:50:56] INFO Training: Train Iter(24000) Env Step(771200) Loss(-0.034) trainer.py:83 +[03-15 20:51:09] INFO Training: Train Iter(24500) Env Step(787200) Loss(-0.019) trainer.py:83 +[03-15 20:51:20] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:51:23] INFO Training: Train Iter(25000) Env Step(803200) Loss(-0.036) trainer.py:83 +[03-15 20:51:36] INFO Training: Train Iter(25500) Env Step(819200) Loss(-0.035) trainer.py:83 +[03-15 20:51:47] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:51:50] INFO Training: Train Iter(26000) Env Step(835200) Loss(-0.031) trainer.py:83 +[03-15 20:52:03] INFO Training: Train Iter(26500) Env Step(851200) Loss(0.148) trainer.py:83 +[03-15 20:52:14] INFO Evaluation: Train Iter(27000) Env Step(864000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:52:16] INFO Training: Train Iter(27000) Env Step(867200) Loss(-0.030) trainer.py:83 +[03-15 20:52:29] INFO Training: Train Iter(27500) Env Step(883200) Loss(-0.031) trainer.py:83 +[03-15 20:52:41] INFO Evaluation: Train Iter(28000) Env Step(896000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:52:43] INFO Training: Train Iter(28000) Env Step(899200) Loss(0.683) trainer.py:83 +[03-15 20:52:56] INFO Training: Train Iter(28500) Env Step(915200) Loss(0.086) trainer.py:83 +[03-15 20:53:08] INFO Evaluation: Train Iter(29000) Env Step(928000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:53:10] INFO Training: Train Iter(29000) Env Step(931200) Loss(0.314) trainer.py:83 +[03-15 20:53:23] INFO Training: Train Iter(29500) Env Step(947200) Loss(0.187) trainer.py:83 +[03-15 20:53:35] INFO Evaluation: Train Iter(30000) Env Step(960000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:53:37] INFO Training: Train Iter(30000) Env Step(963200) Loss(0.061) trainer.py:83 +[03-15 20:53:50] INFO Training: Train Iter(30500) Env Step(979200) Loss(0.264) trainer.py:83 +[03-15 20:54:02] INFO Evaluation: Train Iter(31000) Env Step(992000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:54:04] INFO Training: Train Iter(31000) Env Step(995200) Loss(-0.027) trainer.py:83 +[03-15 20:54:18] INFO Training: Train Iter(31500) Env Step(1011200) Loss(0.783) trainer.py:83 +[03-15 20:54:30] INFO Evaluation: Train Iter(32000) Env Step(1024000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:54:32] INFO Training: Train Iter(32000) Env Step(1027200) Loss(0.707) trainer.py:83 +[03-15 20:54:46] INFO Training: Train Iter(32500) Env Step(1043200) Loss(0.650) trainer.py:83 +[03-15 20:54:57] INFO Evaluation: Train Iter(33000) Env Step(1056000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:55:00] INFO Training: Train Iter(33000) Env Step(1059200) Loss(-0.029) trainer.py:83 +[03-15 20:55:13] INFO Training: Train Iter(33500) Env Step(1075200) Loss(0.615) trainer.py:83 +[03-15 20:55:24] INFO Evaluation: Train Iter(34000) Env Step(1088000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:55:27] INFO Training: Train Iter(34000) Env Step(1091200) Loss(-0.028) trainer.py:83 +[03-15 20:55:40] INFO Training: Train Iter(34500) Env Step(1107200) Loss(-0.029) trainer.py:83 +[03-15 20:55:51] INFO Evaluation: Train Iter(35000) Env Step(1120000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:55:54] INFO Training: Train Iter(35000) Env Step(1123200) Loss(-0.031) trainer.py:83 +[03-15 20:56:07] INFO Training: Train Iter(35500) Env Step(1139200) Loss(0.996) trainer.py:83 +[03-15 20:56:18] INFO Evaluation: Train Iter(36000) Env Step(1152000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:56:21] INFO Training: Train Iter(36000) Env Step(1155200) Loss(-0.025) trainer.py:83 +[03-15 20:56:34] INFO Training: Train Iter(36500) Env Step(1171200) Loss(-0.032) trainer.py:83 +[03-15 20:56:45] INFO Evaluation: Train Iter(37000) Env Step(1184000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:56:48] INFO Training: Train Iter(37000) Env Step(1187200) Loss(1.350) trainer.py:83 +[03-15 20:57:01] INFO Training: Train Iter(37500) Env Step(1203200) Loss(-0.028) trainer.py:83 +[03-15 20:57:12] INFO Evaluation: Train Iter(38000) Env Step(1216000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:57:15] INFO Training: Train Iter(38000) Env Step(1219200) Loss(0.369) trainer.py:83 +[03-15 20:57:28] INFO Training: Train Iter(38500) Env Step(1235200) Loss(-0.031) trainer.py:83 +[03-15 20:57:40] INFO Evaluation: Train Iter(39000) Env Step(1248000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:57:42] INFO Training: Train Iter(39000) Env Step(1251200) Loss(0.144) trainer.py:83 +[03-15 20:57:56] INFO Training: Train Iter(39500) Env Step(1267200) Loss(-0.028) trainer.py:83 +[03-15 20:58:07] INFO Evaluation: Train Iter(40000) Env Step(1280000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:58:10] INFO Training: Train Iter(40000) Env Step(1283200) Loss(-0.030) trainer.py:83 +[03-15 20:58:23] INFO Training: Train Iter(40500) Env Step(1299200) Loss(-0.021) trainer.py:83 +[03-15 20:58:34] INFO Evaluation: Train Iter(41000) Env Step(1312000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:58:37] INFO Training: Train Iter(41000) Env Step(1315200) Loss(0.751) trainer.py:83 +[03-15 20:58:50] INFO Training: Train Iter(41500) Env Step(1331200) Loss(0.555) trainer.py:83 +[03-15 20:59:01] INFO Evaluation: Train Iter(42000) Env Step(1344000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:59:04] INFO Training: Train Iter(42000) Env Step(1347200) Loss(0.180) trainer.py:83 +[03-15 20:59:17] INFO Training: Train Iter(42500) Env Step(1363200) Loss(0.568) trainer.py:83 +[03-15 20:59:28] INFO Evaluation: Train Iter(43000) Env Step(1376000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:59:30] INFO Training: Train Iter(43000) Env Step(1379200) Loss(-0.027) trainer.py:83 +[03-15 20:59:43] INFO Training: Train Iter(43500) Env Step(1395200) Loss(0.712) trainer.py:83 +[03-15 20:59:54] INFO Evaluation: Train Iter(44000) Env Step(1408000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 20:59:57] INFO Training: Train Iter(44000) Env Step(1411200) Loss(-0.031) trainer.py:83 +[03-15 21:00:10] INFO Training: Train Iter(44500) Env Step(1427200) Loss(1.448) trainer.py:83 +[03-15 21:00:21] INFO Evaluation: Train Iter(45000) Env Step(1440000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:00:24] INFO Training: Train Iter(45000) Env Step(1443200) Loss(0.185) trainer.py:83 +[03-15 21:00:37] INFO Training: Train Iter(45500) Env Step(1459200) Loss(0.205) trainer.py:83 +[03-15 21:00:48] INFO Evaluation: Train Iter(46000) Env Step(1472000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:00:50] INFO Training: Train Iter(46000) Env Step(1475200) Loss(-0.032) trainer.py:83 +[03-15 21:01:04] INFO Training: Train Iter(46500) Env Step(1491200) Loss(0.123) trainer.py:83 +[03-15 21:01:15] INFO Evaluation: Train Iter(47000) Env Step(1504000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:01:18] INFO Training: Train Iter(47000) Env Step(1507200) Loss(-0.030) trainer.py:83 +[03-15 21:01:31] INFO Training: Train Iter(47500) Env Step(1523200) Loss(-0.028) trainer.py:83 +[03-15 21:01:42] INFO Evaluation: Train Iter(48000) Env Step(1536000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:01:45] INFO Training: Train Iter(48000) Env Step(1539200) Loss(-0.026) trainer.py:83 +[03-15 21:01:58] INFO Training: Train Iter(48500) Env Step(1555200) Loss(-0.024) trainer.py:83 +[03-15 21:02:09] INFO Evaluation: Train Iter(49000) Env Step(1568000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:02:11] INFO Training: Train Iter(49000) Env Step(1571200) Loss(0.130) trainer.py:83 +[03-15 21:02:25] INFO Training: Train Iter(49500) Env Step(1587200) Loss(-0.032) trainer.py:83 +[03-15 21:02:36] INFO Evaluation: Train Iter(50000) Env Step(1600000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:02:38] INFO Training: Train Iter(50000) Env Step(1603200) Loss(0.656) trainer.py:83 +[03-15 21:02:51] INFO Training: Train Iter(50500) Env Step(1619200) Loss(0.736) trainer.py:83 +[03-15 21:03:02] INFO Evaluation: Train Iter(51000) Env Step(1632000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:03:05] INFO Training: Train Iter(51000) Env Step(1635200) Loss(1.129) trainer.py:83 +[03-15 21:03:18] INFO Training: Train Iter(51500) Env Step(1651200) Loss(1.871) trainer.py:83 +[03-15 21:03:29] INFO Evaluation: Train Iter(52000) Env Step(1664000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:03:32] INFO Training: Train Iter(52000) Env Step(1667200) Loss(-0.030) trainer.py:83 +[03-15 21:03:45] INFO Training: Train Iter(52500) Env Step(1683200) Loss(0.370) trainer.py:83 +[03-15 21:03:56] INFO Evaluation: Train Iter(53000) Env Step(1696000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:03:58] INFO Training: Train Iter(53000) Env Step(1699200) Loss(0.862) trainer.py:83 +[03-15 21:04:12] INFO Training: Train Iter(53500) Env Step(1715200) Loss(-0.034) trainer.py:83 +[03-15 21:04:23] INFO Evaluation: Train Iter(54000) Env Step(1728000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:04:26] INFO Training: Train Iter(54000) Env Step(1731200) Loss(0.718) trainer.py:83 +[03-15 21:04:39] INFO Training: Train Iter(54500) Env Step(1747200) Loss(-0.032) trainer.py:83 +[03-15 21:04:51] INFO Evaluation: Train Iter(55000) Env Step(1760000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:04:53] INFO Training: Train Iter(55000) Env Step(1763200) Loss(-0.027) trainer.py:83 +[03-15 21:05:07] INFO Training: Train Iter(55500) Env Step(1779200) Loss(-0.023) trainer.py:83 +[03-15 21:05:18] INFO Evaluation: Train Iter(56000) Env Step(1792000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:05:21] INFO Training: Train Iter(56000) Env Step(1795200) Loss(1.193) trainer.py:83 +[03-15 21:05:34] INFO Training: Train Iter(56500) Env Step(1811200) Loss(-0.028) trainer.py:83 +[03-15 21:05:45] INFO Evaluation: Train Iter(57000) Env Step(1824000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:05:48] INFO Training: Train Iter(57000) Env Step(1827200) Loss(0.471) trainer.py:83 +[03-15 21:06:01] INFO Training: Train Iter(57500) Env Step(1843200) Loss(-0.022) trainer.py:83 +[03-15 21:06:12] INFO Evaluation: Train Iter(58000) Env Step(1856000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:06:15] INFO Training: Train Iter(58000) Env Step(1859200) Loss(-0.031) trainer.py:83 +[03-15 21:06:28] INFO Training: Train Iter(58500) Env Step(1875200) Loss(0.620) trainer.py:83 +[03-15 21:06:39] INFO Evaluation: Train Iter(59000) Env Step(1888000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:06:42] INFO Training: Train Iter(59000) Env Step(1891200) Loss(-0.031) trainer.py:83 +[03-15 21:06:55] INFO Training: Train Iter(59500) Env Step(1907200) Loss(-0.031) trainer.py:83 +[03-15 21:07:07] INFO Evaluation: Train Iter(60000) Env Step(1920000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:07:09] INFO Training: Train Iter(60000) Env Step(1923200) Loss(0.060) trainer.py:83 +[03-15 21:07:22] INFO Training: Train Iter(60500) Env Step(1939200) Loss(0.255) trainer.py:83 +[03-15 21:07:33] INFO Evaluation: Train Iter(61000) Env Step(1952000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:07:36] INFO Training: Train Iter(61000) Env Step(1955200) Loss(0.331) trainer.py:83 +[03-15 21:07:49] INFO Training: Train Iter(61500) Env Step(1971200) Loss(-0.035) trainer.py:83 +[03-15 21:08:00] INFO Evaluation: Train Iter(62000) Env Step(1984000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:08:03] INFO Training: Train Iter(62000) Env Step(1987200) Loss(0.998) trainer.py:83 +[03-15 21:08:16] INFO Training: Train Iter(62500) Env Step(2003200) Loss(-0.028) trainer.py:83 +[03-15 21:08:27] INFO Evaluation: Train Iter(63000) Env Step(2016000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:08:29] INFO Training: Train Iter(63000) Env Step(2019200) Loss(1.038) trainer.py:83 +[03-15 21:08:42] INFO Training: Train Iter(63500) Env Step(2035200) Loss(0.337) trainer.py:83 +[03-15 21:08:53] INFO Evaluation: Train Iter(64000) Env Step(2048000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:08:56] INFO Training: Train Iter(64000) Env Step(2051200) Loss(-0.026) trainer.py:83 +[03-15 21:09:09] INFO Training: Train Iter(64500) Env Step(2067200) Loss(0.674) trainer.py:83 +[03-15 21:09:20] INFO Evaluation: Train Iter(65000) Env Step(2080000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:09:22] INFO Training: Train Iter(65000) Env Step(2083200) Loss(-0.016) trainer.py:83 +[03-15 21:09:35] INFO Training: Train Iter(65500) Env Step(2099200) Loss(0.513) trainer.py:83 +[03-15 21:09:47] INFO Evaluation: Train Iter(66000) Env Step(2112000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:09:49] INFO Training: Train Iter(66000) Env Step(2115200) Loss(-0.028) trainer.py:83 +[03-15 21:10:02] INFO Training: Train Iter(66500) Env Step(2131200) Loss(1.023) trainer.py:83 +[03-15 21:10:13] INFO Evaluation: Train Iter(67000) Env Step(2144000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:10:16] INFO Training: Train Iter(67000) Env Step(2147200) Loss(0.244) trainer.py:83 +[03-15 21:10:29] INFO Training: Train Iter(67500) Env Step(2163200) Loss(0.385) trainer.py:83 +[03-15 21:10:40] INFO Evaluation: Train Iter(68000) Env Step(2176000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:10:42] INFO Training: Train Iter(68000) Env Step(2179200) Loss(0.066) trainer.py:83 +[03-15 21:10:56] INFO Training: Train Iter(68500) Env Step(2195200) Loss(-0.025) trainer.py:83 +[03-15 21:11:07] INFO Evaluation: Train Iter(69000) Env Step(2208000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:11:09] INFO Training: Train Iter(69000) Env Step(2211200) Loss(-0.028) trainer.py:83 +[03-15 21:11:23] INFO Training: Train Iter(69500) Env Step(2227200) Loss(0.721) trainer.py:83 +[03-15 21:11:34] INFO Evaluation: Train Iter(70000) Env Step(2240000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:11:37] INFO Training: Train Iter(70000) Env Step(2243200) Loss(-0.027) trainer.py:83 +[03-15 21:11:50] INFO Training: Train Iter(70500) Env Step(2259200) Loss(-0.021) trainer.py:83 +[03-15 21:12:01] INFO Evaluation: Train Iter(71000) Env Step(2272000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:12:04] INFO Training: Train Iter(71000) Env Step(2275200) Loss(0.229) trainer.py:83 +[03-15 21:12:17] INFO Training: Train Iter(71500) Env Step(2291200) Loss(0.603) trainer.py:83 +[03-15 21:12:28] INFO Evaluation: Train Iter(72000) Env Step(2304000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:12:30] INFO Training: Train Iter(72000) Env Step(2307200) Loss(-0.028) trainer.py:83 +[03-15 21:12:43] INFO Training: Train Iter(72500) Env Step(2323200) Loss(-0.029) trainer.py:83 +[03-15 21:12:55] INFO Evaluation: Train Iter(73000) Env Step(2336000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:12:57] INFO Training: Train Iter(73000) Env Step(2339200) Loss(-0.028) trainer.py:83 +[03-15 21:13:10] INFO Training: Train Iter(73500) Env Step(2355200) Loss(0.242) trainer.py:83 +[03-15 21:13:21] INFO Evaluation: Train Iter(74000) Env Step(2368000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:13:24] INFO Training: Train Iter(74000) Env Step(2371200) Loss(0.393) trainer.py:83 +[03-15 21:13:37] INFO Training: Train Iter(74500) Env Step(2387200) Loss(-0.027) trainer.py:83 +[03-15 21:13:48] INFO Evaluation: Train Iter(75000) Env Step(2400000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:13:50] INFO Training: Train Iter(75000) Env Step(2403200) Loss(0.508) trainer.py:83 +[03-15 21:14:03] INFO Training: Train Iter(75500) Env Step(2419200) Loss(-0.015) trainer.py:83 +[03-15 21:14:14] INFO Evaluation: Train Iter(76000) Env Step(2432000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:14:17] INFO Training: Train Iter(76000) Env Step(2435200) Loss(-0.029) trainer.py:83 +[03-15 21:14:30] INFO Training: Train Iter(76500) Env Step(2451200) Loss(0.061) trainer.py:83 +[03-15 21:14:41] INFO Evaluation: Train Iter(77000) Env Step(2464000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:14:44] INFO Training: Train Iter(77000) Env Step(2467200) Loss(1.216) trainer.py:83 +[03-15 21:14:57] INFO Training: Train Iter(77500) Env Step(2483200) Loss(0.223) trainer.py:83 +[03-15 21:15:09] INFO Evaluation: Train Iter(78000) Env Step(2496000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:15:11] INFO Training: Train Iter(78000) Env Step(2499200) Loss(-0.031) trainer.py:83 +[03-15 21:15:25] INFO Training: Train Iter(78500) Env Step(2515200) Loss(1.010) trainer.py:83 +[03-15 21:15:36] INFO Evaluation: Train Iter(79000) Env Step(2528000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:15:39] INFO Training: Train Iter(79000) Env Step(2531200) Loss(-0.024) trainer.py:83 +[03-15 21:15:52] INFO Training: Train Iter(79500) Env Step(2547200) Loss(-0.014) trainer.py:83 +[03-15 21:16:04] INFO Evaluation: Train Iter(80000) Env Step(2560000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:16:07] INFO Training: Train Iter(80000) Env Step(2563200) Loss(-0.029) trainer.py:83 +[03-15 21:16:20] INFO Training: Train Iter(80500) Env Step(2579200) Loss(0.163) trainer.py:83 +[03-15 21:16:32] INFO Evaluation: Train Iter(81000) Env Step(2592000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:16:35] INFO Training: Train Iter(81000) Env Step(2595200) Loss(0.135) trainer.py:83 +[03-15 21:16:48] INFO Training: Train Iter(81500) Env Step(2611200) Loss(-0.035) trainer.py:83 +[03-15 21:17:00] INFO Evaluation: Train Iter(82000) Env Step(2624000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:17:03] INFO Training: Train Iter(82000) Env Step(2627200) Loss(-0.034) trainer.py:83 +[03-15 21:17:16] INFO Training: Train Iter(82500) Env Step(2643200) Loss(-0.030) trainer.py:83 +[03-15 21:17:28] INFO Evaluation: Train Iter(83000) Env Step(2656000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:17:30] INFO Training: Train Iter(83000) Env Step(2659200) Loss(-0.024) trainer.py:83 +[03-15 21:17:44] INFO Training: Train Iter(83500) Env Step(2675200) Loss(0.129) trainer.py:83 +[03-15 21:17:55] INFO Evaluation: Train Iter(84000) Env Step(2688000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:17:58] INFO Training: Train Iter(84000) Env Step(2691200) Loss(-0.035) trainer.py:83 +[03-15 21:18:11] INFO Training: Train Iter(84500) Env Step(2707200) Loss(-0.027) trainer.py:83 +[03-15 21:18:23] INFO Evaluation: Train Iter(85000) Env Step(2720000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:18:25] INFO Training: Train Iter(85000) Env Step(2723200) Loss(-0.018) trainer.py:83 +[03-15 21:18:38] INFO Training: Train Iter(85500) Env Step(2739200) Loss(-0.022) trainer.py:83 +[03-15 21:18:50] INFO Evaluation: Train Iter(86000) Env Step(2752000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:18:53] INFO Training: Train Iter(86000) Env Step(2755200) Loss(0.185) trainer.py:83 +[03-15 21:19:06] INFO Training: Train Iter(86500) Env Step(2771200) Loss(-0.024) trainer.py:83 +[03-15 21:19:18] INFO Evaluation: Train Iter(87000) Env Step(2784000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:19:20] INFO Training: Train Iter(87000) Env Step(2787200) Loss(-0.022) trainer.py:83 +[03-15 21:19:34] INFO Training: Train Iter(87500) Env Step(2803200) Loss(-0.019) trainer.py:83 +[03-15 21:19:45] INFO Evaluation: Train Iter(88000) Env Step(2816000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:19:47] INFO Training: Train Iter(88000) Env Step(2819200) Loss(0.240) trainer.py:83 +[03-15 21:20:01] INFO Training: Train Iter(88500) Env Step(2835200) Loss(0.653) trainer.py:83 +[03-15 21:20:12] INFO Evaluation: Train Iter(89000) Env Step(2848000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:20:15] INFO Training: Train Iter(89000) Env Step(2851200) Loss(-0.028) trainer.py:83 +[03-15 21:20:28] INFO Training: Train Iter(89500) Env Step(2867200) Loss(0.955) trainer.py:83 +[03-15 21:20:39] INFO Evaluation: Train Iter(90000) Env Step(2880000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:20:42] INFO Training: Train Iter(90000) Env Step(2883200) Loss(-0.030) trainer.py:83 +[03-15 21:20:55] INFO Training: Train Iter(90500) Env Step(2899200) Loss(0.662) trainer.py:83 +[03-15 21:21:06] INFO Evaluation: Train Iter(91000) Env Step(2912000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:21:08] INFO Training: Train Iter(91000) Env Step(2915200) Loss(-0.024) trainer.py:83 +[03-15 21:21:21] INFO Training: Train Iter(91500) Env Step(2931200) Loss(-0.021) trainer.py:83 +[03-15 21:21:33] INFO Evaluation: Train Iter(92000) Env Step(2944000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:21:35] INFO Training: Train Iter(92000) Env Step(2947200) Loss(-0.024) trainer.py:83 +[03-15 21:21:49] INFO Training: Train Iter(92500) Env Step(2963200) Loss(-0.030) trainer.py:83 +[03-15 21:22:00] INFO Evaluation: Train Iter(93000) Env Step(2976000) Mean Episode Return(0.000) evaluator.py:370 +[03-15 21:22:02] INFO Training: Train Iter(93000) Env Step(2979200) Loss(1.239) trainer.py:83 +[03-15 21:22:16] INFO Training: Train Iter(93500) Env Step(2995200) Loss(-0.024) trainer.py:83 +[03-15 21:22:21] INFO Exceeded maximum number of env_step(3001600), program is terminated termination_checker.py:22 +wandb: Waiting for W&B process to finish... (success). From 02bb2076c37ebe1bab5897e2540a3f0cfdb91572 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:33:29 +0800 Subject: [PATCH 27/29] Rename result.txt to result.log --- Q2/{result.txt => result.log} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Q2/{result.txt => result.log} (100%) diff --git a/Q2/result.txt b/Q2/result.log similarity index 100% rename from Q2/result.txt rename to Q2/result.log From d769c6226ebcc81c71079ffc6760367b8800d906 Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:35:48 +0800 Subject: [PATCH 28/29] Delete chapter3_obs/Q2 directory --- chapter3_obs/Q2/q2.log | 215 ----------------------------------------- chapter3_obs/Q2/q2.py | 61 ------------ 2 files changed, 276 deletions(-) delete mode 100644 chapter3_obs/Q2/q2.log delete mode 100644 chapter3_obs/Q2/q2.py diff --git a/chapter3_obs/Q2/q2.log b/chapter3_obs/Q2/q2.log deleted file mode 100644 index b5cc6d0..0000000 --- a/chapter3_obs/Q2/q2.log +++ /dev/null @@ -1,215 +0,0 @@ -[02-15 18:59:28] INFO Evaluation: Train Iter(0) Env Step(0) Mean Episode Return(923.500) func.py:93 -[02-15 19:00:15] DEBUG Starting new HTTPS connection (1): o151352.ingest.sentry.io:443 connectionpool.py:1007 -[02-15 19:00:16] DEBUG https://o151352.ingest.sentry.io:443 "POST /api/5288891/envelope/ HTTP/1.1" 200 2 connectionpool.py:465 -[02-15 19:01:24] INFO Training: Train Iter(504) Env Step(16384) Loss(0.201) func.py:93 -[02-15 19:03:22] INFO Evaluation: Train Iter(1000) Env Step(32000) Mean Episode Return(923.500) func.py:93 -[02-15 19:03:27] INFO Training: Train Iter(1008) Env Step(32512) Loss(0.001) func.py:93 -[02-15 19:05:35] INFO Training: Train Iter(1512) Env Step(48640) Loss(0.119) func.py:93 -[02-15 19:07:35] INFO Evaluation: Train Iter(2000) Env Step(64000) Mean Episode Return(923.500) func.py:93 -[02-15 19:07:42] INFO Training: Train Iter(2016) Env Step(64768) Loss(0.206) func.py:93 -[02-15 19:09:41] INFO Training: Train Iter(2520) Env Step(80896) Loss(0.098) func.py:93 -[02-15 19:11:38] INFO Evaluation: Train Iter(3000) Env Step(96000) Mean Episode Return(923.500) func.py:93 -[02-15 19:11:46] INFO Training: Train Iter(3024) Env Step(97024) Loss(0.096) func.py:93 -[02-15 19:13:50] INFO Training: Train Iter(3528) Env Step(113152) Loss(0.313) func.py:93 -[02-15 19:15:48] INFO Evaluation: Train Iter(4000) Env Step(128000) Mean Episode Return(923.500) func.py:93 -[02-15 19:15:58] INFO Training: Train Iter(4032) Env Step(129280) Loss(0.077) func.py:93 -[02-15 19:17:57] INFO Training: Train Iter(4536) Env Step(145408) Loss(0.141) func.py:93 -[02-15 19:19:48] INFO Evaluation: Train Iter(5000) Env Step(160000) Mean Episode Return(287.750) func.py:93 -[02-15 19:19:59] INFO Training: Train Iter(5040) Env Step(161536) Loss(0.195) func.py:93 -[02-15 19:21:55] INFO Training: Train Iter(5544) Env Step(177664) Loss(0.067) func.py:93 -[02-15 19:23:42] INFO Evaluation: Train Iter(6000) Env Step(192000) Mean Episode Return(923.500) func.py:93 -[02-15 19:23:55] INFO Training: Train Iter(6048) Env Step(193792) Loss(0.170) func.py:93 -[02-15 19:25:50] INFO Training: Train Iter(6552) Env Step(209920) Loss(0.115) func.py:93 -[02-15 19:27:30] INFO Evaluation: Train Iter(7000) Env Step(224000) Mean Episode Return(137.000) func.py:93 -[02-15 19:27:45] INFO Training: Train Iter(7056) Env Step(226048) Loss(0.100) func.py:93 -[02-15 19:29:40] INFO Training: Train Iter(7560) Env Step(242176) Loss(0.134) func.py:93 -[02-15 19:31:23] INFO Evaluation: Train Iter(8000) Env Step(256000) Mean Episode Return(889.500) func.py:93 -[02-15 19:31:40] INFO Training: Train Iter(8064) Env Step(258304) Loss(0.079) func.py:93 -[02-15 19:33:34] INFO Training: Train Iter(8568) Env Step(274432) Loss(0.141) func.py:93 -[02-15 19:35:15] INFO Evaluation: Train Iter(9000) Env Step(288000) Mean Episode Return(923.500) func.py:93 -[02-15 19:35:34] INFO Training: Train Iter(9072) Env Step(290560) Loss(0.104) func.py:93 -[02-15 19:37:28] INFO Training: Train Iter(9576) Env Step(306688) Loss(0.143) func.py:93 -[02-15 19:39:07] INFO Evaluation: Train Iter(10000) Env Step(320000) Mean Episode Return(854.250) func.py:93 -[02-15 19:39:27] INFO Training: Train Iter(10080) Env Step(322816) Loss(0.260) func.py:93 -[02-15 19:41:21] INFO Training: Train Iter(10584) Env Step(338944) Loss(0.147) func.py:93 -[02-15 19:43:00] INFO Evaluation: Train Iter(11000) Env Step(352000) Mean Episode Return(340.750) func.py:93 -[02-15 19:43:22] INFO Training: Train Iter(11088) Env Step(355072) Loss(0.145) func.py:93 -[02-15 19:45:18] INFO Training: Train Iter(11592) Env Step(371200) Loss(0.143) func.py:93 -[02-15 19:46:52] INFO Evaluation: Train Iter(12000) Env Step(384000) Mean Episode Return(378.500) func.py:93 -[02-15 19:47:17] INFO Training: Train Iter(12096) Env Step(387328) Loss(0.255) func.py:93 -[02-15 19:49:13] INFO Training: Train Iter(12600) Env Step(403456) Loss(0.123) func.py:93 -[02-15 19:50:49] INFO Evaluation: Train Iter(13000) Env Step(416000) Mean Episode Return(814.250) func.py:93 -[02-15 19:51:14] INFO Training: Train Iter(13104) Env Step(419584) Loss(0.304) func.py:93 -[02-15 19:53:12] INFO Training: Train Iter(13608) Env Step(435712) Loss(0.146) func.py:93 -[02-15 19:54:44] INFO Evaluation: Train Iter(14000) Env Step(448000) Mean Episode Return(385.000) func.py:93 -[02-15 19:55:11] INFO Training: Train Iter(14112) Env Step(451840) Loss(0.118) func.py:93 -[02-15 19:57:06] INFO Training: Train Iter(14616) Env Step(467968) Loss(0.133) func.py:93 -[02-15 19:58:36] INFO Evaluation: Train Iter(15000) Env Step(480000) Mean Episode Return(866.500) func.py:93 -[02-15 19:59:05] INFO Training: Train Iter(15120) Env Step(484096) Loss(0.112) func.py:93 -[02-15 20:00:59] INFO Training: Train Iter(15624) Env Step(500224) Loss(0.078) func.py:93 -[02-15 20:02:27] INFO Evaluation: Train Iter(16000) Env Step(512000) Mean Episode Return(130.750) func.py:93 -[02-15 20:02:58] INFO Training: Train Iter(16128) Env Step(516352) Loss(0.137) func.py:93 -[02-15 20:04:54] INFO Training: Train Iter(16632) Env Step(532480) Loss(0.216) func.py:93 -[02-15 20:06:20] INFO Evaluation: Train Iter(17000) Env Step(544000) Mean Episode Return(666.000) func.py:93 -[02-15 20:06:53] INFO Training: Train Iter(17136) Env Step(548608) Loss(0.129) func.py:93 -[02-15 20:08:46] INFO Training: Train Iter(17640) Env Step(564736) Loss(0.112) func.py:93 -[02-15 20:10:12] INFO Evaluation: Train Iter(18000) Env Step(576000) Mean Episode Return(603.000) func.py:93 -[02-15 20:10:46] INFO Training: Train Iter(18144) Env Step(580864) Loss(0.069) func.py:93 -[02-15 20:12:40] INFO Training: Train Iter(18648) Env Step(596992) Loss(0.063) func.py:93 -[02-15 20:14:03] INFO Evaluation: Train Iter(19000) Env Step(608000) Mean Episode Return(810.000) func.py:93 -[02-15 20:14:40] INFO Training: Train Iter(19152) Env Step(613120) Loss(0.179) func.py:93 -[02-15 20:16:33] INFO Training: Train Iter(19656) Env Step(629248) Loss(0.109) func.py:93 -[02-15 20:17:53] INFO Evaluation: Train Iter(20000) Env Step(640000) Mean Episode Return(493.500) func.py:93 -[02-15 20:18:31] INFO Training: Train Iter(20160) Env Step(645376) Loss(0.166) func.py:93 -[02-15 20:20:25] INFO Training: Train Iter(20664) Env Step(661504) Loss(0.124) func.py:93 -[02-15 20:21:43] INFO Evaluation: Train Iter(21000) Env Step(672000) Mean Episode Return(232.000) func.py:93 -[02-15 20:22:23] INFO Training: Train Iter(21168) Env Step(677632) Loss(0.002) func.py:93 -[02-15 20:24:17] INFO Training: Train Iter(21672) Env Step(693760) Loss(0.019) func.py:93 -[02-15 20:25:35] INFO Evaluation: Train Iter(22000) Env Step(704000) Mean Episode Return(132.500) func.py:93 -[02-15 20:26:17] INFO Training: Train Iter(22176) Env Step(709888) Loss(0.176) func.py:93 -[02-15 20:28:10] INFO Training: Train Iter(22680) Env Step(726016) Loss(0.113) func.py:93 -[02-15 20:29:26] INFO Evaluation: Train Iter(23000) Env Step(736000) Mean Episode Return(906.500) func.py:93 -[02-15 20:30:10] INFO Training: Train Iter(23184) Env Step(742144) Loss(0.454) func.py:93 -[02-15 20:32:03] INFO Training: Train Iter(23688) Env Step(758272) Loss(0.168) func.py:93 -[02-15 20:33:14] INFO Evaluation: Train Iter(24000) Env Step(768000) Mean Episode Return(377.000) func.py:93 -[02-15 20:34:00] INFO Training: Train Iter(24192) Env Step(774400) Loss(0.188) func.py:93 -[02-15 20:35:59] INFO Training: Train Iter(24696) Env Step(790528) Loss(0.030) func.py:93 -[02-15 20:37:15] INFO Evaluation: Train Iter(25000) Env Step(800000) Mean Episode Return(895.250) func.py:93 -[02-15 20:38:03] INFO Training: Train Iter(25200) Env Step(806656) Loss(0.101) func.py:93 -[02-15 20:40:02] INFO Training: Train Iter(25704) Env Step(822784) Loss(0.216) func.py:93 -[02-15 20:41:15] INFO Evaluation: Train Iter(26000) Env Step(832000) Mean Episode Return(923.500) func.py:93 -[02-15 20:42:05] INFO Training: Train Iter(26208) Env Step(838912) Loss(0.302) func.py:93 -[02-15 20:44:05] INFO Training: Train Iter(26712) Env Step(855040) Loss(0.115) func.py:93 -[02-15 20:45:17] INFO Evaluation: Train Iter(27000) Env Step(864000) Mean Episode Return(923.500) func.py:93 -[02-15 20:46:17] INFO Training: Train Iter(27216) Env Step(871168) Loss(0.178) func.py:93 -[02-15 20:48:20] INFO Training: Train Iter(27720) Env Step(887296) Loss(0.102) func.py:93 -[02-15 20:49:29] INFO Evaluation: Train Iter(28000) Env Step(896000) Mean Episode Return(381.750) func.py:93 -[02-15 20:50:24] INFO Training: Train Iter(28224) Env Step(903424) Loss(0.302) func.py:93 -[02-15 20:52:25] INFO Training: Train Iter(28728) Env Step(919552) Loss(0.193) func.py:93 -[02-15 20:53:31] INFO Evaluation: Train Iter(29000) Env Step(928000) Mean Episode Return(645.500) func.py:93 -[02-15 20:54:27] INFO Training: Train Iter(29232) Env Step(935680) Loss(0.090) func.py:93 -[02-15 20:56:24] INFO Training: Train Iter(29736) Env Step(951808) Loss(0.199) func.py:93 -[02-15 20:57:30] INFO Evaluation: Train Iter(30000) Env Step(960000) Mean Episode Return(923.500) func.py:93 -[02-15 20:58:28] INFO Training: Train Iter(30240) Env Step(967936) Loss(0.302) func.py:93 -[02-15 21:00:26] INFO Training: Train Iter(30744) Env Step(984064) Loss(0.252) func.py:93 -[02-15 21:01:29] INFO Evaluation: Train Iter(31000) Env Step(992000) Mean Episode Return(372.750) func.py:93 -[02-15 21:02:31] INFO Training: Train Iter(31248) Env Step(1000192) Loss(0.170) func.py:93 -[02-15 21:04:30] INFO Training: Train Iter(31752) Env Step(1016320) Loss(0.097) func.py:93 -[02-15 21:05:32] INFO Evaluation: Train Iter(32000) Env Step(1024000) Mean Episode Return(383.500) func.py:93 -[02-15 21:06:35] INFO Training: Train Iter(32256) Env Step(1032448) Loss(0.122) func.py:93 -[02-15 21:08:34] INFO Training: Train Iter(32760) Env Step(1048576) Loss(0.552) func.py:93 -[02-15 21:09:35] INFO Evaluation: Train Iter(33000) Env Step(1056000) Mean Episode Return(923.500) func.py:93 -[02-15 21:10:41] INFO Training: Train Iter(33264) Env Step(1064704) Loss(0.670) func.py:93 -[02-15 21:12:39] INFO Training: Train Iter(33768) Env Step(1080832) Loss(0.005) func.py:93 -[02-15 21:13:37] INFO Evaluation: Train Iter(34000) Env Step(1088000) Mean Episode Return(923.500) func.py:93 -[02-15 21:14:43] INFO Training: Train Iter(34272) Env Step(1096960) Loss(0.005) func.py:93 -[02-15 21:16:41] INFO Training: Train Iter(34776) Env Step(1113088) Loss(0.531) func.py:93 -[02-15 21:17:42] INFO Evaluation: Train Iter(35000) Env Step(1120000) Mean Episode Return(923.500) func.py:93 -[02-15 21:18:51] INFO Training: Train Iter(35280) Env Step(1129216) Loss(0.001) func.py:93 -[02-15 21:20:50] INFO Training: Train Iter(35784) Env Step(1145344) Loss(0.002) func.py:93 -[02-15 21:21:42] INFO Evaluation: Train Iter(36000) Env Step(1152000) Mean Episode Return(923.500) func.py:93 -[02-15 21:22:50] INFO Training: Train Iter(36288) Env Step(1161472) Loss(0.172) func.py:93 -[02-15 21:24:46] INFO Training: Train Iter(36792) Env Step(1177600) Loss(0.230) func.py:93 -[02-15 21:25:40] INFO Evaluation: Train Iter(37000) Env Step(1184000) Mean Episode Return(58.750) func.py:93 -[02-15 21:26:52] INFO Training: Train Iter(37296) Env Step(1193728) Loss(0.080) func.py:93 -[02-15 21:28:51] INFO Training: Train Iter(37800) Env Step(1209856) Loss(0.228) func.py:93 -[02-15 21:29:43] INFO Evaluation: Train Iter(38000) Env Step(1216000) Mean Episode Return(923.500) func.py:93 -[02-15 21:30:58] INFO Training: Train Iter(38304) Env Step(1225984) Loss(0.180) func.py:93 -[02-15 21:32:56] INFO Training: Train Iter(38808) Env Step(1242112) Loss(0.155) func.py:93 -[02-15 21:33:45] INFO Evaluation: Train Iter(39000) Env Step(1248000) Mean Episode Return(923.500) func.py:93 -[02-15 21:34:59] INFO Training: Train Iter(39312) Env Step(1258240) Loss(0.230) func.py:93 -[02-15 21:36:56] INFO Training: Train Iter(39816) Env Step(1274368) Loss(0.119) func.py:93 -[02-15 21:37:42] INFO Evaluation: Train Iter(40000) Env Step(1280000) Mean Episode Return(923.500) func.py:93 -[02-15 21:38:56] INFO Training: Train Iter(40320) Env Step(1290496) Loss(0.031) func.py:93 -[02-15 21:40:49] INFO Training: Train Iter(40824) Env Step(1306624) Loss(0.028) func.py:93 -[02-15 21:41:32] INFO Evaluation: Train Iter(41000) Env Step(1312000) Mean Episode Return(923.500) func.py:93 -[02-15 21:42:47] INFO Training: Train Iter(41328) Env Step(1322752) Loss(0.046) func.py:93 -[02-15 21:44:39] INFO Training: Train Iter(41832) Env Step(1338880) Loss(0.036) func.py:93 -[02-15 21:45:20] INFO Evaluation: Train Iter(42000) Env Step(1344000) Mean Episode Return(923.500) func.py:93 -[02-15 21:46:38] INFO Training: Train Iter(42336) Env Step(1355008) Loss(0.097) func.py:93 -[02-15 21:48:32] INFO Training: Train Iter(42840) Env Step(1371136) Loss(0.000) func.py:93 -[02-15 21:49:09] INFO Evaluation: Train Iter(43000) Env Step(1376000) Mean Episode Return(387.000) func.py:93 -[02-15 21:50:28] INFO Training: Train Iter(43344) Env Step(1387264) Loss(-0.000) func.py:93 -[02-15 21:52:21] INFO Training: Train Iter(43848) Env Step(1403392) Loss(0.000) func.py:93 -[02-15 21:52:57] INFO Evaluation: Train Iter(44000) Env Step(1408000) Mean Episode Return(387.000) func.py:93 -[02-15 21:54:18] INFO Training: Train Iter(44352) Env Step(1419520) Loss(0.000) func.py:93 -[02-15 21:56:11] INFO Training: Train Iter(44856) Env Step(1435648) Loss(0.000) func.py:93 -[02-15 21:56:45] INFO Evaluation: Train Iter(45000) Env Step(1440000) Mean Episode Return(387.000) func.py:93 -[02-15 21:58:07] INFO Training: Train Iter(45360) Env Step(1451776) Loss(0.065) func.py:93 -[02-15 22:00:00] INFO Training: Train Iter(45864) Env Step(1467904) Loss(0.018) func.py:93 -[02-15 22:00:34] INFO Evaluation: Train Iter(46000) Env Step(1472000) Mean Episode Return(98.750) func.py:93 -[02-15 22:01:58] INFO Training: Train Iter(46368) Env Step(1484032) Loss(0.000) func.py:93 -[02-15 22:03:52] INFO Training: Train Iter(46872) Env Step(1500160) Loss(0.000) func.py:93 -[02-15 22:04:21] INFO Evaluation: Train Iter(47000) Env Step(1504000) Mean Episode Return(380.250) func.py:93 -[02-15 22:05:48] INFO Training: Train Iter(47376) Env Step(1516288) Loss(0.082) func.py:93 -[02-15 22:07:41] INFO Training: Train Iter(47880) Env Step(1532416) Loss(0.000) func.py:93 -[02-15 22:08:09] INFO Evaluation: Train Iter(48000) Env Step(1536000) Mean Episode Return(373.250) func.py:93 -[02-15 22:09:40] INFO Training: Train Iter(48384) Env Step(1548544) Loss(0.015) func.py:93 -[02-15 22:11:43] INFO Training: Train Iter(48888) Env Step(1564672) Loss(0.012) func.py:93 -[02-15 22:12:13] INFO Evaluation: Train Iter(49000) Env Step(1568000) Mean Episode Return(130.750) func.py:93 -[02-15 22:13:49] INFO Training: Train Iter(49392) Env Step(1580800) Loss(0.003) func.py:93 -[02-15 22:15:46] INFO Training: Train Iter(49896) Env Step(1596928) Loss(0.002) func.py:93 -[02-15 22:16:14] INFO Evaluation: Train Iter(50000) Env Step(1600000) Mean Episode Return(130.750) func.py:93 -[02-15 22:17:50] INFO Training: Train Iter(50400) Env Step(1613056) Loss(0.026) func.py:93 -[02-15 22:19:47] INFO Training: Train Iter(50904) Env Step(1629184) Loss(0.017) func.py:93 -[02-15 22:20:13] INFO Evaluation: Train Iter(51000) Env Step(1632000) Mean Episode Return(130.750) func.py:93 -[02-15 22:21:48] INFO Training: Train Iter(51408) Env Step(1645312) Loss(0.007) func.py:93 -[02-15 22:23:43] INFO Training: Train Iter(51912) Env Step(1661440) Loss(0.010) func.py:93 -[02-15 22:24:07] INFO Evaluation: Train Iter(52000) Env Step(1664000) Mean Episode Return(58.750) func.py:93 -[02-15 22:25:45] INFO Training: Train Iter(52416) Env Step(1677568) Loss(0.016) func.py:93 -[02-15 22:27:42] INFO Training: Train Iter(52920) Env Step(1693696) Loss(0.054) func.py:93 -[02-15 22:28:03] INFO Evaluation: Train Iter(53000) Env Step(1696000) Mean Episode Return(923.500) func.py:93 -[02-15 22:29:43] INFO Training: Train Iter(53424) Env Step(1709824) Loss(0.044) func.py:93 -[02-15 22:31:39] INFO Training: Train Iter(53928) Env Step(1725952) Loss(0.076) func.py:93 -[02-15 22:31:59] INFO Evaluation: Train Iter(54000) Env Step(1728000) Mean Episode Return(923.500) func.py:93 -[02-15 22:33:40] INFO Training: Train Iter(54432) Env Step(1742080) Loss(0.083) func.py:93 -[02-15 22:35:35] INFO Training: Train Iter(54936) Env Step(1758208) Loss(0.297) func.py:93 -[02-15 22:35:53] INFO Evaluation: Train Iter(55000) Env Step(1760000) Mean Episode Return(923.500) func.py:93 -[02-15 22:37:35] INFO Training: Train Iter(55440) Env Step(1774336) Loss(0.007) func.py:93 -[02-15 22:39:30] INFO Training: Train Iter(55944) Env Step(1790464) Loss(0.001) func.py:93 -[02-15 22:39:46] INFO Evaluation: Train Iter(56000) Env Step(1792000) Mean Episode Return(58.750) func.py:93 -[02-15 22:41:31] INFO Training: Train Iter(56448) Env Step(1806592) Loss(0.011) func.py:93 -[02-15 22:43:26] INFO Training: Train Iter(56952) Env Step(1822720) Loss(0.010) func.py:93 -[02-15 22:43:40] INFO Evaluation: Train Iter(57000) Env Step(1824000) Mean Episode Return(58.750) func.py:93 -[02-15 22:45:27] INFO Training: Train Iter(57456) Env Step(1838848) Loss(0.008) func.py:93 -[02-15 22:47:21] INFO Training: Train Iter(57960) Env Step(1854976) Loss(0.013) func.py:93 -[02-15 22:47:34] INFO Evaluation: Train Iter(58000) Env Step(1856000) Mean Episode Return(58.750) func.py:93 -[02-15 22:49:22] INFO Training: Train Iter(58464) Env Step(1871104) Loss(0.143) func.py:93 -[02-15 22:51:17] INFO Training: Train Iter(58968) Env Step(1887232) Loss(0.140) func.py:93 -[02-15 22:51:28] INFO Evaluation: Train Iter(59000) Env Step(1888000) Mean Episode Return(58.750) func.py:93 -[02-15 22:53:18] INFO Training: Train Iter(59472) Env Step(1903360) Loss(0.006) func.py:93 -[02-15 22:55:13] INFO Training: Train Iter(59976) Env Step(1919488) Loss(0.004) func.py:93 -[02-15 22:55:22] INFO Evaluation: Train Iter(60000) Env Step(1920000) Mean Episode Return(923.500) func.py:93 -[02-15 22:57:13] INFO Training: Train Iter(60480) Env Step(1935616) Loss(0.317) func.py:93 -[02-15 22:59:08] INFO Training: Train Iter(60984) Env Step(1951744) Loss(0.003) func.py:93 -[02-15 22:59:15] INFO Evaluation: Train Iter(61000) Env Step(1952000) Mean Episode Return(923.500) func.py:93 -[02-15 23:01:09] INFO Training: Train Iter(61488) Env Step(1967872) Loss(0.006) func.py:93 -[02-15 23:03:04] INFO Training: Train Iter(61992) Env Step(1984000) Loss(0.368) func.py:93 -[02-15 23:03:09] INFO Evaluation: Train Iter(62000) Env Step(1984000) Mean Episode Return(923.500) func.py:93 -[02-15 23:05:04] INFO Training: Train Iter(62496) Env Step(2000128) Loss(0.002) func.py:93 -[02-15 23:07:03] INFO Evaluation: Train Iter(63000) Env Step(2016000) Mean Episode Return(923.500) func.py:93 -[02-15 23:07:04] INFO Training: Train Iter(63000) Env Step(2016256) Loss(0.020) func.py:93 -[02-15 23:08:59] INFO Training: Train Iter(63504) Env Step(2032384) Loss(0.373) func.py:93 -[02-15 23:10:56] INFO Evaluation: Train Iter(64000) Env Step(2048000) Mean Episode Return(923.500) func.py:93 -[02-15 23:11:00] INFO Training: Train Iter(64008) Env Step(2048512) Loss(0.002) func.py:93 -[02-15 23:12:53] INFO Training: Train Iter(64512) Env Step(2064640) Loss(0.010) func.py:93 -[02-15 23:14:45] INFO Evaluation: Train Iter(65000) Env Step(2080000) Mean Episode Return(923.500) func.py:93 -[02-15 23:14:51] INFO Training: Train Iter(65016) Env Step(2080768) Loss(0.160) func.py:93 -[02-15 23:16:44] INFO Training: Train Iter(65520) Env Step(2096896) Loss(0.001) func.py:93 -[02-15 23:18:35] INFO Evaluation: Train Iter(66000) Env Step(2112000) Mean Episode Return(923.500) func.py:93 -[02-15 23:18:42] INFO Training: Train Iter(66024) Env Step(2113024) Loss(0.106) func.py:93 -[02-15 23:20:35] INFO Training: Train Iter(66528) Env Step(2129152) Loss(0.245) func.py:93 -[02-15 23:22:23] INFO Evaluation: Train Iter(67000) Env Step(2144000) Mean Episode Return(923.500) func.py:93 -[02-15 23:22:32] INFO Training: Train Iter(67032) Env Step(2145280) Loss(0.023) func.py:93 -[02-15 23:24:26] INFO Training: Train Iter(67536) Env Step(2161408) Loss(0.074) func.py:93 -[02-15 23:26:13] INFO Evaluation: Train Iter(68000) Env Step(2176000) Mean Episode Return(923.500) func.py:93 -[02-15 23:26:24] INFO Training: Train Iter(68040) Env Step(2177536) Loss(0.138) func.py:93 -[02-15 23:28:17] INFO Training: Train Iter(68544) Env Step(2193664) Loss(0.001) func.py:93 -[02-15 23:30:03] INFO Evaluation: Train Iter(69000) Env Step(2208000) Mean Episode Return(923.500) func.py:93 -[02-15 23:30:15] INFO Training: Train Iter(69048) Env Step(2209792) Loss(0.168) func.py:93 -[02-15 23:32:08] INFO Training: Train Iter(69552) Env Step(2225920) Loss(0.003) func.py:93 -[02-15 23:33:52] INFO Evaluation: Train Iter(70000) Env Step(2240000) Mean Episode Return(923.500) func.py:93 -[02-15 23:34:07] INFO Training: Train Iter(70056) Env Step(2242048) Loss(0.003) func.py:93 -[02-15 23:35:59] INFO Training: Train Iter(70560) Env Step(2258176) Loss(0.210) func.py:93 -[02-15 23:37:41] INFO Evaluation: Train Iter(71000) Env Step(2272000) Mean Episode Return(923.500) func.py:93 -[02-15 23:37:57] INFO Training: Train Iter(71064) Env Step(2274304) Loss(0.089) func.py:93 \ No newline at end of file diff --git a/chapter3_obs/Q2/q2.py b/chapter3_obs/Q2/q2.py deleted file mode 100644 index 7a4f026..0000000 --- a/chapter3_obs/Q2/q2.py +++ /dev/null @@ -1,61 +0,0 @@ -# Please install latest DI-engine's main branch first -from ding.bonus import PPOF - - -def bipedalwalker(): - # Please install bipedalwalker env first, `pip3 install box2d` - # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/bipedalwalker_zh.html) for more details - agent = PPOF(env='bipedalwalker', exp_name='./bipedalwalker_demo') - agent.train(step=int(1e6)) - # Classic RL interaction loop and save replay video - agent.deploy(enable_save_replay=True) - - -def evogym_carrier(): - # Please install evogym env first, refer to its doc (https://github.com/EvolutionGym/evogym#installation) - # Or you can use our provided docker (opendilab/ding:nightly-evogym) - # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/Evogym_zh.html) for more details - agent = PPOF(env='evogym_carrier', exp_name='./evogym_carrier_demo') - agent.train(step=int(1e6)) - - -def mario(): - # Please install mario env first, `pip install gym-super-mario-bros` - # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/gym_super_mario_bros_zh.html) for more details - agent = PPOF(env='mario', exp_name='./mario_demo') - agent.train(step=int(3e6)) - - -def di_sheep(): - # Please prepare di_sheep env and modelfirst, you can copy the env and model file to to current directory, - # which are placed in https://github.com/opendilab/DI-sheep/blob/master/service - from sheep_env import SheepEnv - from sheep_model import SheepModel - env = SheepEnv(level=9) - obs_space = env.observation_space - model = SheepModel( - item_obs_size=obs_space['item_obs'].shape[1], - item_num=obs_space['item_obs'].shape[0], - item_encoder_type='TF', - bucket_obs_size=obs_space['bucket_obs'].shape[0], - global_obs_size=obs_space['global_obs'].shape[0], - ttorch_return=True, - ) - agent = PPOF(env='di_sheep', exp_name='./di_sheep_demo', model=model) - agent.train(step=int(1e6)) - - -def procgen_bigfish(): - # Please install procgen env first, `pip install procgen` - # You can refer to the env doc (https://di-engine-docs.readthedocs.io/zh_CN/latest/13_envs/procgen_zh.html) for more details - agent = PPOF(env='procgen_bigfish', exp_name='./procgen_bigfish_demo') - agent.train(step=int(1e7)) - - -if __name__ == "__main__": - # You can select and run your favorite demo - # bipedalwalker() - # evogym_carrier() - mario() - # di_sheep() - # procgen_bigfish() \ No newline at end of file From b9a77ec4c66ddd3da3733c49477499ac93f5e46c Mon Sep 17 00:00:00 2001 From: YunDi Li <73511912+muzilyd@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:35:57 +0800 Subject: [PATCH 29/29] Delete chapter3_obs/Q1 directory --- chapter3_obs/Q1/analyse.md | 7 -- chapter3_obs/Q1/loss_plt1.png | Bin 51257 -> 0 bytes chapter3_obs/Q1/loss_plt2.png | Bin 35885 -> 0 bytes chapter3_obs/Q1/loss_plt3.png | Bin 33370 -> 0 bytes chapter3_obs/Q1/q1.log | 33 ----- chapter3_obs/Q1/q1.py | 225 ---------------------------------- 6 files changed, 265 deletions(-) delete mode 100644 chapter3_obs/Q1/analyse.md delete mode 100644 chapter3_obs/Q1/loss_plt1.png delete mode 100644 chapter3_obs/Q1/loss_plt2.png delete mode 100644 chapter3_obs/Q1/loss_plt3.png delete mode 100644 chapter3_obs/Q1/q1.log delete mode 100644 chapter3_obs/Q1/q1.py diff --git a/chapter3_obs/Q1/analyse.md b/chapter3_obs/Q1/analyse.md deleted file mode 100644 index ea90ca4..0000000 --- a/chapter3_obs/Q1/analyse.md +++ /dev/null @@ -1,7 +0,0 @@ -## 收敛可行性 - -根据loss_plt1,loss_plt12,loss_plt3可知,方案2和方案3是收敛可行的。 - -## 最优方案 - -由收敛loss曲线的收敛快慢和平滑性可以得出,方案3是最优方案。三角函数是光滑的周期函数,对于模型的拟合更加有优势。 \ No newline at end of file diff --git a/chapter3_obs/Q1/loss_plt1.png b/chapter3_obs/Q1/loss_plt1.png deleted file mode 100644 index a86e6eb73a41335c12df23466deff4cad3cf0fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51257 zcmeFZc|4Tw`#x+dB1J{-GL{s|TK2I-MU<_`9xBGZ4>9&75*dWC6GHavJE=5w+4m*G z$etx@@w=vGrqB2Jyr1Xwdj5ExzrO!?)!g@e-Pdwn$9bH`d0zL6d#Vbw)aR*5NJwb! zD9WjmkdT*>kdSp!k%37GW(vN8FFQxr!8 zJX_LV9X)i??nhKC@)@i;*9|%w{o2ED4diMUE(~llwji>)>MGRS-QADLP_g-tkm3K_ zQ&*=ZBm4*Vvp5+ATI$$;+)|1Af%<=cAWYf+&d2|n!~gDv|J@D0LG=G4Fql<*#(veZ z@9oIQNRcr*&{0&?k1*jgYLCXNokc`M62$B}Cpng+h2k*wd#dahEEa3u*`!M+OF~Kk z{`h)OD}G^5Rk~jIXsxOR^1K(J+UYvqlkqhXSwh5r#Oc_pk8e(N+WdOa0@0rg7$dxe z%|})T;Qr$~jx4ywez!=vc!Ua>zk1Ua|6g!{jhEC9^X?M#B+-NT`~Z&)xLgqX>tg6o zB#jO_uM#Q$v;rP`??&opyjT;?L};0Uj!MaAN}Tsjr$4a=kLpMoi+&h1(-M12^^8N- z9)h|wcZ1l2cZNPwLwo!)M~R)J_;89%{Dji0jlYlS2*}!7d!BV9|GRA;AESdj=V(Fv zeJt-Rn|OIWO%<_|B);z`sE{9D%}D)yY=DOD|JP~qbzEF!6BYa3)!>Ec5Rudy9r5<~ zI{EObg|hWZ0+T#p8mPHs?H`ISvKVG(XOz`fX{z>&jZA#hSaTq*oo^Ibl;#_g7t@{V z>J=rI5Rj&=Zcf70_g-K*toGiOmWK5XFoJ(dga)$zSw9~bZaJNFs?I_x%FA_o&CdrD z7DxvyhP8@Iw1vI0W`Ic2?OXJJR`b0et~CkX2&nBvxV1`Q_dWc3-hm|^ia$uh4#gLw zrQ#>`Q9f8@5rdd!h){IGf49>97Ml5ODBdugcz+D;{$J7mH}@+Gq1(YrQ~thG<+Zp! z<_HaAdmfY8`Q?1?Ze)Q`d_sa<&2sr^H7SRw_rAaOw`G2Q|Jbn8Bw#yMd2M{H zuF}ZgSgU!l$#AL%-_?6#WV7-JcOlbu*UfH)nz}M($)|~)Tf?XBgt18PwF`AcVYCY# zB3A3R?|OK=C#7`SUn66EzutZ1=$s?I3A$Up)5nons!0+K)1OXDcz+IM8XOvm9V=U2 zUOsE+nkx5MY}~1rR&4B^;fi{mVVz!aa|?QVk3|q&H*rLmu-w6hxG^mjHq?(MCx}=L zgb38TcFUjrHRpYhh4_BqIpj(G%g*u>%~p@;!@q4(^WnFP@ARq5o$(kp&&^z;Uw2RJ z?+rGv%uHQ|q=)$2gF^yVUegi=8b#I=2VE)8HGxd<6xOn5oDn=@*Yb+vmHb38ETr#T ziub`Tn#J9^f^{{T{8XGVBk6qfiK#Tg7|DHOkD}Fe#=d-cH|e!M?zWge`D?{xwD#ta zD@8k>#p*9eUL5-IA|CUUk@Ur*!!MWc=5hI`Z!Ai4X{<`a&2E2dd2+YYrJ#BtM>AK; zX0&`c*?lFupa2y&zEZo<+3qQMVP2s#eD|WXx3&;EN^=tuDMZ}wSB^Y650T8CMxjt@ zo(meMsN2|TAAbyNIc_U9=}~g^*Ea>3yD$1{B+Ia|^0ICf7b_+3=yj$@R=JJar0!&v zhCstl#}XHTnx*30!g@VM(uiYWC#5&b0q*dQgdQ}_l+GjB6C@=KvnL&QaeR+e)qW-DPIp6X_g>gM-B6jEi($qDaGmsR%1 z-0(lj?D4&^CslQ=Xe%#De`%yl$lJAt#z4xi|;2bZliz^WSlUDYwNHCkk06*j)LwN-MZ@)p^XtT5OI z>ftM+>Ol`RH5tl~VuEO!`&LZLM0^dt^;(>AMtbejX<+sCZi<49#n)i1XXa)@#U@-= zs^(hDA21#MoRevo4(3sX&PHWxWZg||8mofC94lHPxej;GGEYw+`%+#YkXLep9-zPc zLs)Ef+(xLd9hb11kSa;o%&5)ShpmXleX_x}$F19Xde&LDS@sMXxEQFYgtDAYqP+-L z?r?Cb4nX0TS@!<1GiLU@Ld7j=;Yf-64X);hIM}tF8tNQ~x+kn$~S^}E30o2c*ziL47CRAQFZ(f*)cqrgA z^m`w_XunpXsncsAd3SmCJska#94;bl2R0=^9ufuSk?%x&(7BKBoka2C0@b1 zDFn@ovv4eK7XQwc=I>cN3r6@~Q)^(6BBwF>7OMK_T>!!1J>vxI<2eIp)+e~b^S>AH?)ezHo;0b-Vob)6;_}GA|y|o6qTZ`aB<$(`HB`=tp#fc4GgE5FYGuaRf*B#8+ z@_a6GYRHB!#Am3_rj!A1p-c4N)A-!=Aake%2{yhy2znPfHG%IRn;qx|BE93|3+Hlb zOXSAuwk!B6B)+Hoj1ySMn8Ou1id4q`j)(>H&wVfF&6_^`oAL6p)(fH|1Xi$x+g82W zpC8!vK}P>a55P)i6~2_0eG4tm9yRA7tlLGfZfZtxaTrlX(xPn4-wW*Ef|8nZsfJnZ zqvU^^H+qN$+*+gJ@6;%OsY$LE^fMMj|J$_08&@>wjb?+_|Jz%vkh&C~GHuiI@j(74 z46LWLCyWA}pKl{tmOxlF5;7DRqJGc)q>fAA^>%+>e-FGqQ+c_T9yBmZbh!Op?MG__jF+s3XXPOQ5T9JUmned6tXZAUO7WWV zrL5l{Uq!OYT;IuZTT}#8hNH`wV0@fpMJJF}R#pvr{e>)unTW}~fr`9ut8yLJ$k+3} zT|G}2LODQtUHSKhJ7I@AVP#f>z~j{v7Yj})xNTphMe2|0Tqty@@yosVhqcN&P=68= zH>|Y(x?C~oHJ=fa?6#0SytVx7*l7<|-7-r}Qfi@7Foy1A&5zGND&Yqy`<@X;KuXKY z4IP>o{3%Z!%&U1@Drw)53~j%*0nzWX6DI7ZJo+FD>`wWpt$wL_xAgXykjKt<$etx& z2K8zjbFVxppRKF=V;BK5Af3HLWCq$eUKA$170bKpFzLDdYx3|{il6mFt!}wM^|!Q~ zoE$sv{n5EZII^B0f|eF|GI4h4n?m>q<#jU!U^PkttxsG9>NeFKUFr|^7K=BE+xV5d zatF8X!N(R2WXTCPSK=s8+i`}LU))ynE!2p`!9rFcQ|0xV`$K^3z4LH7Q|&KG@R4iB zJ~_!IXE5txowa#H(5R;uI&S}=n!e^VXUwoWFSwFpuNenkob2nn#H5j_>|i+IiV2-d zcDF5+E6n)1^kXkM}>+Fjjx1R#?G9M<@pYRtzV z30*#c={i(wzMlp1;)JH~Ndjt}`5vsZZ0$Lwr-Bu?mG1n72ToaE5QownpGa?uMr}D< z?_y_@cAWW0oMwQx7~!iCV>Twp?A#!eliimIuY8Exp(lhbk;jlW3*tn~!czg}WnKa2 z{gByooBzf$4vuOnDv^JMm8sZvfcx@9@Rk7Jm{84ojjb>#-Z()5NdOKXK7h03n-3Hu zPm`~YQ2l!k`lc!aa2*gMc5VQNHoclX_kfk_w*X9aAfmc8&f{ieNsMHRp!uRShx+V@ zm-2o)o?@lac1+2nt9MNFMY!K>*D%>cHnGu{@*oq z6x|0o+nz{s0T1^cVEBBCR_QpV&ATW`oUm@7=^(vWoh?#Lk=f9d=?^r2Q3?$H>KPhW zq@!JclqHhpZD$4^JlXicMn(N7JbbXh&G_@?{LeMrva+(epX+TnuXcT_D2(=>tFLo%EPw8-X&X5A z$BS5bDBNDo7y#1BX^28T+?*hz=?L7j{l)yI+V`B0snp)L^y~?T?R>+!y(kUUh_mUp zLnVG~_O`XQ;!wC|wSM21lErnsg-cCh{>|}}KMKt;o^Wi_w$$YQ?L)@!ez2OV}^@D`4kyoXiAX=xv} zBZ6vq`IgP|f0o|U`YQXKi@3PSvJOYlAnx=uWxtZ<3V2Jq@tfl5f|`}R-jst<+wtlu z_#DpnVr#mGRZRfyruXucQs8YSSpK!R6%xLfw6L)7@ubYd>-%4yvtpkHl6l;6_PgrpOU|0nIP!=tq0n9hl-ULC&-t1c8GcSfQ%ZwExNLm9RDx z{l(kL38H*OVo&rzyq$N;`~<$=XQE{t1|V}^K@^yK+7N`6~xy`8A^^J3JCG4$Ta&Z-M zEF$RpE1V;N_)UbO4u|qv*xJ^AOAEnvr3mygwMn6GNI2qn!pB$emU{9JZrQ(?@3FS1 zzj|e|?3fT*kZQF@Nx*X(gfBn@7=9Puy!T3`o^{Viitgc)}OMO!d@WUzjVDkV^kPK;zfK0w0h3 zzWwR6T6^rZkMn_(6y0m^}@zkE$>^EHJ1Uku-C6&EG&vsh6usE|)eR zMFWq#0oiv8jUjset|P%h;`MnOT>i*s4XXBuUt`VdflyfD;Uw%Hq=g3ypANFMd}w*; zAc#5z(WospBH6hN#9f6d7xhvVAv6X0iqjA=^4nDQnW{ANI&xSFBI{`V#^owDf+;ls zrvdY{Ho=7t{|c@PQfL!oP33noyw%fD0Y4{xyooINmJr}X>ax!Kg!ee$ymnp|(3C(d zl(%TkkAH~{z+&qgTyZLWQ?bL`%8cbi+`k9*#jVG@V|RqbGqIKS-yR;rzvT%ouF}`j7~xCQu3n}k7@ zqm_j*Jzd)#5=)?An}CL;PbwJbDPk*WC14gJj_!nMf0lfOD3MRabGsZ$ib%*dIl$7Eon3od)MfO~&V2lIAF-`;3 z+gdk;i;*-H46)$v5PiWAk0hChUWpS04zxXj$bmib?{ik zYFYtpUorKt0`#pSp%$PcwzfdD_9g+a-MD4#$21zryp!7gAEgof|p8eSQYmwhu1 zR7Cv&ccKeU;|Cu52g`a{Vc)kRtpU=t`R}I)1OFE1LvQ(GNzSACDw!!ZHXidK7S2F` zG+d+$^Hk|5f-&DF^z%J8SoYlN+&7;R^Znw10fZ5keFiM=#YuSsCLO&IAcVM_6+s)= zxDsrbYV!fuD_MR4haPcfnJY?*{G7h-R%auw7hgCiX7HVJ2S9RpagQ-X@sHE$3^XInUc61SmQMdaWeU zYHk`=ahCJk#8v;)<{R(WAwCijQrd=i#n)}^ zAs)#X180?#`d_m)`|;Pkr-xWo4ikLNPG2Q<&lV@#8@_wg*d8a8rIvEtv_1BElFab4iLr-HFzJU-g@o@+;g&|i*5DA^b(op#lgco<#$bZE583M4oibyBsyripm0mY?Ao{Vu%}j@AoL&e+F$PP@5lL#Tem)zbY0&EiI1OOPkQgPn_cf+HgjL|Szpp_ z*01%7>7A0M?Wh}asGn zffyOelPrlpBZ8K?+a2`v-QRQa=~eVXi&Lxei!#b`YI&z9p~nd`8w5Q2A3{=5w^Nex zOBq@9HION>S*M)iP5nYn?!kV;;XX(uRBeq|)kxp6V}9M}@ID?Bh#hbdTkalMu`$nH zP_xftu_i9TG2iJtsOp$eeE#0v9!SyLn5g~!fu`eDVhk>luM)BxJrC$x*%6Bbxz8Q> zFCZJqZrnV6?;MU3Htc<%)2{_H@Vps#@+pX3@JZLw7Es39+BlR@v6AWKHhJMOR0ttq z$8L#=sUfJT+AXC(e*}SU(*>2_QUlJ519uAd*^P%aG&C;uf0lGv8LM%zGhwB<2!~u2 zALw@NWR8F$t-E>%mhjCP*X z^~!K;v_1*p7UyZdg!~L2`S^?hv2a$E5Oc`0(e<_$^-E_pI)sxVMz=%?Chyx#tR}m) zax0(w>xiD=vL3|?&;J3^5XYt3{E-p8;r4J*luHc1!2liSTY{A6dNqa}SX>2_;_Im) z{exRfcRGsH-w{KV9h@@43UVHrnwt6`rBLaRex=y{>rKQJnjqX1Cuw3`yWJ|LDvR5f ztpw5c7w?S_$VN91a_o7PZl`$d&G*ojn05$C-WounV!RKxz3oNhh4l+Gns)w9C7sHrnkxFib$(+IK)RyA0@>wLAtp(c0a8zixYiXRQcsFMN3X zx_$uvp~H?B`4;Pg<*`m%t>zHZh8}JL`~lJC>BCl8{L$2M1I|T_mC^Af&e270oQ}`lxJl@OX3E%g;3gnqY=geFPSN9_uM= z3_I>v{sD4Y3Z7?$Q8_Q^`e>3m3&G235NkWlO+dzU+}lOBn?j+c_79f73 zgPs$XEF5t{=#aWu857~;F%xI`xXi@3j*fc6ECQh4qXYQwclEg&eFwzsEffWv7lun& zSfkfjJ@*vXhnOPK*0!lzR9v_4`dJ!|(G~KDkdF1Bp3;Y_)G(DV**L9qv_RUn-q%l9 z+XC5UaJlp!JbqDwSp6Z@tbO6*cCCo5PZBRiN&Rybj=yz8UW6wOgoqI-mMYF=u{>KB zbkQmw*o-r#MZyA&>u%wa62>Br$q8_H6}V~@TFG*yx+@_<$D8#_ZL{D)dKwo5oIeCh z|7h2GtYFl8m*5890T=Asc&jpT0FuQNJ~%eQ83~cpW`{%k#Ip!BB||u^W3XQjp2!cc zeX=nTh(#8;F~B@Imt+)I!{d!J9ueQIctzGe@fAl8NVAHMv$KT^tUB6Gz3o;veV8dG zq?qMsTuv?jA3X&`miD-kXiYxUu(p#H$>q#{m|77X+Zu{MG6WFC#rGh<6TQki43s)| zK7$U2CpJ>XIn-5Ea=P-jN;tOf3K5yHA2l81Y?NeF2&@2FU}Fs;@qwx@4wO&xLbGIE zWREpNc&M51w&>%7lSm%v6la%czR815493Q0s%Vj1TfK5Enn?tmNi#~k5iriBJ3||X zx3S_)>)oMA8xNYto2{D#^#c(4CSa=n0-}lU`iw#MaEbMBafVV1i|dpxE69eX_vRSd zy*P@#VufVV*Gpp5YIT@!ywJ6E+nurjw5;VS<2BO#5H@Iu)$6lowF|F!Dvy*HoL zl^~{ezkavFjs@O+?eP1_!>cwUr8NANugm&FcQ<{8Y|VA$TM z)X~+QAKL|Lw*Hl4t~+0!b8vcXbcpS5uO0&L+i>L8i=6-``tYbY45t8`7sgP}M6a&G zvTFK)I^~1_aRFbQ^8VSUN-4W05K-&_!=-j&7<2lgG$9}H$oDM;I>z8>oC#6}=s=!ZB`I}) zn7nD;`MJ^MvXWL+g*f=R`<&Iwbt-{-oxBWNnJ^`ujn#Qrij5^j$R9-6yW>qFJW}=n z7FxgF%9GK#6QRJOTVkrBqS7($GAV66baf8N;{9`NyvC(X&JH^Mh~DcmyrbwuvyujU zX=^8W@6$~;dGk+v_(+(942oN{g12vDK@rJFnHBJzZZi=It(R=wBq>=vzNZ{)W&zLh zEjiZipAATs-i0oGic5%OV+TMxHl9Bp#j8uc?PT|lA(OOPqdu==tkxWoWa^U~ynrZe zv&;eNTIylnh2an5N~wZg--koyxSqQcp0hoY#sJxm-{0(2Yx{{V_SoE<@8u|4au+KH zJVA%z&C-y^757siK2b3or?2VD7awyc03aztP^(XE%}TWrXP)bie(f^YStF0NDv*-+ z^<&WcD~*x(?o1@p`SY9kv35~E=F`bqN~%QMU<@rGKFwKR?=utkzHG7V13%+z?tv3PAZHcn{wud^Xc#H zTJ&AdpVtubC1575%rnks0_E~mXntjl2mq$kmF`Rtr(G!+C{Q5P%^oHz2p%kv_46Rw+eLavCQnsv4| zmq%SjN-YGN66%>YLW_$5_$3@~UEE8L!}O7_H$z-zry1~mlkE{TSYZ}n^DjWEN<`g( z{A{FTO?*0HF>)_%w-Sh0MxQ-yWjUUH{xS~pfP6h?yqNk$DpS0^F@MW4(U)Gw8Sirz zw{J=UbwJaTu$UC^-c`!Z76-Yi(tIXS>#G~B)iTLUxY2k8#$(#!jCXlq=rs?oN-Ml` zX=bB~p4tIrM>&0rYKh|awZact)Vu@%BW~EQX@HLy7#Rt)fn4Th_c_~(T6WGIko`f@ zZV(9all4@jJuoYJy(F#`Mk_|}*f%KBPC<+uTQ~*{-EEAGF=_H4Ca;2l&A#(KJm{pA z0;ODn5l!dJ66t5WrtOup-yrL9Ff;8%o$y3KIByC>XF0UR${b04b~}g=n^2q$YPDwQ znNF~)-`$@)JV=&yzhq-Q@gC$b`RO-y)-WAO*CtUj4sa{zUlBdM6UGx=U_~yKPsg9s~N^^3!jZAnYVI$PLYhqFpg_3Q^8d{{rq241OF-|+c z^=lcb+zHX!djY!qDIL8E2h43m?+?C$+Ahf{Cg-znJg{9) z{Y2ekf;2v4BPEnsUdO#quz#&z+lWtTwyccfXxyF9B{P}*VIUt~gr+amMC#P_$*-$N zYgV2v&47e+-F?CECL455GT`X~zx(@9HEih|BBB=kl{AJ)x(& z@whzriI-rd7=DJn#mO#Q)0dVs<4-|ZQlE2n0Ze%r*cfz|{Lyd0r+5ni{m zBvhlJD+PHU+90by7*k|DX-f#H92tY|+Vd{Tw++<c-ix6rCz_PiX;Bi~EO*J}~T?N`uFjct2k zK2?j2yK$}IV6j0|OswsEH>l6T6vNsUB)w4rMqa%tVo3;WTz-DOqwMwYj3@-C1rWUO z`CE57P9;FBo5V3&=Ne_t`F7{atE8MQN$WvXxO}^S(>N ze$q^q_u>9z1BjvpZN|Q&-eLvZ2%z`1O`bsKn_%Oc=9*hSRlu|a^uUmmn(i=$AAB#Q z;5vL5VjV7!aDl^V`Yt)Si!`y}fbm2^w4WX{f0p^xD^mv|`*p4B;T%GBAO&y{DLzeO zwBwh2_%{Le;OU-L=Wvtb68KMg)e%D=g_nr*kDAK@lpGMVK{ zKyRu~H`s2*VLrfF9h)y;&|xu63U7jL7VV{z&9JPHjz!32UX7seKv3L|kQyr&%E4=)$&-(sTaIRLIsQHuo%yc-aXWY}r2 zEnC3zy>U+~zi+s}&$?U)-4aBPM`?ybk$Pc0gt$E@P&UsW1MEam;P`pr=E1X_$w`tf zds_-~8Ta91usExHXu(|>Hno+TmdGUcRIIp!=UpW{pJAiMmBA>4p6Bqq>V4p0q$b|x z-F)g&{jY8Wpi%YhMFS9*80c0jcWgepMAF~K$Z(H!$sBsjlU+&K+3oT!@Vt<_iL1C> zU;jWO(3f<7^r|J&GtQVfJjTKz>;@=yeD72H_6HxK!qa!+Opvp^6k>g5v7knEr(vtC zkQu}l>Xsfoceq++Y{9<91p+w1VPYxn<={ZP@gzH&1Y2Q3dl5?Ws=oYfvk5tTtXp}k zvcWKH)MoM5gvUllZ>GwAlYm#zqee1aZoBtBq*)*j7_Du%3wmi7_F^g!Kzu=7S^@|w za9LaSp*mqg?!rxlZKbj3eH%5~daspqcyB;xdyyTtm!%BLdptmA``p`*ZRj-y4;&~+-%H0?kTA|GOS;w% zvBHW2Hsja@ln5BQ*PK8WL6X2B*>?lJ=OluThpyD;`3-Zg_lhJE%dZ%Ls#3h)V}>L@ z*}TEnGTJMv8xY;~cg8(%Gk!~Cbxs**hQ=lOeh@ZX`S3)|3mUwz>*I{;th26yzX*IO zr8QsVJ3E_aT>gjFf~;;~g8E0i&igRF?cdCW^L4wg#q7*SWs<|??GiQjJM~R z8*KN^L_c42Y-Kt2jh)Rx5bayt-we^v>P}yoB2;zV6DIRbdz)4@npQ<`K=COL$R!Sx zGeS*Gw^f0CXb0 zviBeKomX)O6Af+}=MS4B0gNxMHB^D1Nz;8h1EzWX1_061AwK3<@khGy-gW?gXhG_2 z_n$8Wi>1QlsGNFkCf*Z5eToEFd6bD2*Nr8z4K>{U+&8d7X8br0;W|1KO}Q`-&s~w1R-jwlWxF?g_XN?hsGeP- zyBthCub0Rv?7QA0hn|;Ui-#5*XM`;JNF6Io&^t}Of76PCiPyOe6Hy;hYFvq57Sj~egU3-1Yc}N{yhV{Tl2xCe zf-#KSZ-^4yAgC*-Oi#gyIG{KecLoIH>25tgkp$d3F8voILn26@&wy@z4|E zT}2P|tZ;>@bI2)wd~fe5lg&0c2|>p~W?psy5(Uy`xWFEq+UXSn2@Ixc<_=mAW;q)h zgNljq*3>+|b_ZeiI6`>_DDIqQflNB}s*IM~)NFK0b~NkkO@ZPPUVAkYcW4KMDa2>y zI$L4+i`n#&Wl|(TOJWB^MmONnOCYZt#K*_C2{epV*YgR$wMiY0&a^zU?Z{v5G%$&P z7T7m1gZ(p3F6&R&KdfX$osg~+8SmAJI<6$AS1&)hgR&c3QFLHnASg`wIUOP};eGgP zqmg+U8rtrlpgi`bpMitpcr#6RoCaP@lg*=e!VGBuM6_r4q5|?K$cBPIcx3JHVD-?e zOM2VmU?XKvnttpH!+N5;?D>Sc9^+$39>0T|vUAV^yUaZHjeHdkLM?z_l5!;8Vqbs3 zaXcVVUYYRTZ8HK#cit@FV(6UQ+!_p05|_y}beqo*3}^zGpqS!YxB{lp2Fw1OH4J+H zDfS1E1?YsEbfV~9aiR7X1`AVWUUo1+#B395$G{0RT-J5o66s$^!tP>1 zfqs$m^6mH)0;MITpys4ooO11XbBB!YbTz1Qi=QsOnOxgfTfD2~RPIbqSAnf;3bpm` z!feNyyfjpVJK*N-UQ_7z0Wtrqvu;pi{Gl!=f?3W>9GG1z zZiNg!0H<)BRrsdAbZ{Vu6(*OT;)1oFDqO|iOcx;4wtxt$8VMNI?x6H-BbIXus#}Lo zcgQ%)CdWXZW;y2O*mJ$6>ahkz{-B6tQ!C}f`VHjY<5%iz1LW&(6dJw<2mlH$v<+n5 zZUt6pn-SqFMX{1D1rKx|B4(on&E%tMKuW`fpKLmyym8JUvZfbQmlW7pE+?owVunG8 z6=_s6oOIh$I(;i3O{nHEecA=op)U=Wz>=SXoV52Wk5L2y2`A?p$|}VU>0Z~{sBhFJ ziOAgAXyrDkDbI!}s=yjYx&rW~N#aWdk}NTbvb=~VyDuJXo0z{6fRDW;Unc_#!xaQ0jL5jOLmgSWh!2vDPC zq${r_g6=Ul{y;5=4p@;Zc#fCY?t>H`2*4<8!oaYB6|_4b7)vypo1BylJ%vJMjx^1Q z6L3un_%wZYEyfp5<5yH>u~^TN^Wj`(uk$_(aQQqXP+b-r)%DQ}*EkO<{LUdo;E6W6 z@?~P4`UV$a3`gdn`~(xB2e6K`pEI%6(~T2=;}VR6S>TXYaq!FOT0-!DjjowLJeV{{ zqykqg`jnR}Z37S>m^M65gLzOS5?Y?QZ9zD@G;;^|FSU0FnS5L&sLL@VyZ~yNjH%r| zcb1TMYsQtP)ra(ex^}27+z*#!Ks@!d#KoYh#vQi!aR!CTKJ|TIt;1V+-w5Q!WDQY` z4rLX7!l1tP%c3wno{g^ag2bHJRBh7r2EPYK zLbv)M+NN<(Q9t8W?pIO6gv9$b+_|^1kDhG`Vr4Tr@I-J1Xl>RwF&bTKv zJCB8S3c?>og5$h-Xe-Iq9C2+|17b9LTU*T~+OKM@WSbWn^6V+H`iaZy7HYyoI zfI(M~%CuP?{p2I%!YyVOQ2UT_roV(LD8GwrnGk1v0SkC5o%j0-kTP&OiiWDqW|FU4 zGG#;g?O7cO)jmOqz{ky0UwY*K$`T1@4%fcF^025LoJRH8f)MI9<#|A8WHpG3!cbwI zp4=6tac2rJ4}KESsfYnL@s+)!djIAJ#321_$raW)acMy6G1}|e@nrQ>HVyY`e2c4dFJDxs!?|+ zq!Lif8d~)CUVbDjgwF4U7eF)$O=@)s~OYpJ2 zX^=AbcnSATt;fz-9lD9(N_}nW(lR3p0)^Ymkwp|5CWXxLzb0QdS^jogK)gV3!0&|D z!Y7|vENUtxxG%!SW;tbl){16uSpw4>vHkGr%{L>rjqy|Zo}E+>&FHKZlexgo26ASA zLUXre+}cN6D65OZz!J6Ac^_72 zxZ8g0bQ?D%X7HN<6&B|ypkhvZ3l%*&qp3O5lPaRQvedi*o1zX?S~oD7it}Ya+34I%`8B@&Yqk~fVuV19dPJ3Sp)B#e}9YsSlxIojgX!?1h653pkWNxeu+c74CM4U+c)vOG~M^nVihUEp{%C8Qi~1 z0S>7Ri4%f7b*f8bd1vg3c|L#=NgcDeWyPyA)jgqAYUT}0I+tfa9^+6GMr(|jy`80LXYJiuxO0@ z0c#%{vXvh5a*>2B6zGEz)u)?6=xFE>bVi2fo>r7ZB!~W4$f9}e9b?MHyS_}Z3$cfC z1c2u9eRwJqY7lfXfR~LvKM;Ms8!OsXRI1#DT;|Rl(i|+c%&qyUV1}(sNmtgDZ&qW< z`V;=Ji2@L?)wTl_XrRFSlpV+)rj~EkqnHOl9<~aGob@Uzz8U#Ni;dTCl@W3>KU>ON zr-3}MQUuMUb7Lg_dB+vN5Ml}{`(QUnZ=jCTf^Po~)${CyS(V<8Ep+jV<_)>RVr6}eV2xtmDW_fTy z4eku2ws#C?;7k>57Zg5L2!MLfo#A|UmU-l?Ol>iB3q;9Zfp#I6lU0yYV9!7iUxpu) zOj4p5^>fhs*Wf~b?p%AE#{K*BbthW;($)nJT@qN1H^cpn4b(362Bfb|wC3+`i8|#y z<04%vN@{eF*PZ`%qhD1e;3uLv=%CyDN(DnEj4Q%=@VuCIDEy(pJPf&5NWYEQMQF^DBpa)M#t}5sYjl3DA2Rw1 z>eZHz^~Am*_*UTH<<-~=E9?lSrvvk<1h69U^}&5Wfz|t`L$)ZcnDjwTYU+)0P%Gm) zVv*JI`PNBkVavYDo??DXEh1>?%enR`6#A$z!#?NTlgrF}xkI%IrV_T1yF8nGf19*D zGR*{`=>P{DOpc1BL_BNmROQmzs$Rc&5S%*hjy7VH!x@1eJ{EtAbzV!Y9s&**^SsmUjDDecoH; z?F6X}hxa@q43M^UR*A3#=y^5Uay$9qW>U>g0{|HBC*}whr1yMxj-u~AS`8F{CvKQa z(c>tKX_HTF|ET4*6aQg%mho=bje3^8R%&oArG;2&UJaPh3hHt-KhMb5vRbhGAv5$qW5gPe7H0pwIY zf5ZB1WN)`?~!(@H%#ndjx zzCq597jmx+2ci_Y!Z+&`yds8yeTj< z6zFlhIWkkuBcgVBKfcdOvElCc04<0IZEYrtEADTX5a>3Q69E1(zWYum66WMw6>Hz|?6Bt7x7$V<_CrJ57p9|-resPQ^ zo?W`X=qUPD4<-8Z18{(ZQRb^K^KT0TiBnKPmn9Djk4~{ni zVbyv}H)j3P5ToD**SY}3Fdh8t1XUcb7Jq&8`*BX< zkwU(tq<&_+v0aWaG{GR3#kA640WLSfKIvQ=C-3N9kvl)6N&2j@6RhT${ah0$E>sbFm+DDR(>hbRCL@P zn41_(4*ywX%VoFp9Ry2P+3fB)H~Db8+*k^gjC;qf8$nQL!}VS(e0{K>QCxA43`j97 zs^@VkPgaR#bHk#EUu_RUDLPp%lG?A$`{1#ZTl%RV1BUE8m~8pEP|FIy*C3 zmoq&>)AEq9rncQ75GauTf{&ZlJKSN$82-;Q9Jh)I-}h3d0a5AllO{vZ=t&_U^CU{K z*?pyyWTxX9JAM`&BZ`W&n;h&zncl3B{?W0gDi()n>{pe%l1o+5K*-1b&Q3WT?rAmW zt`B&3E~EAU`-kTu0zs+%NtYT}jb6_qmM@VuLN-5(`~$_aEG?`i4OTk`v65BDf=Gd* zmo4V-;)IGXsjVKx_9u<+GKN}#-8Ridk?U1DrvMcw4GE3k>J zV7an2+Bp`@uPUk)HYt)u39F^mWI=C2_c!M;?t>m6ADc)1r1%|S8xv8$Q6S1mPj|Rv zN~ew6lBvc7sco09dE|=gm*r$Tr_9hvc;`k7IFNW=(nLokdP8vh8AE(^=T*%B_)!B& zIYBhyyuuLNH#y~T+e9Eb#-p-^-#M*rZf@>4e!r-&^$KKSOdpT`;#8R(C_y0Ws=5}c zQJQ%Z)oQTPoEzJlCg~S#Y9Cj?1Fbrx9*PE@d^=W~W&8@`gsTpI-uJ+yzO;a?uCNHE z=GpezYaEiYYu)WpQIzo`&8T*(ajUw;m{MlF-y%+9zPt8_-k&^^Y#&84IGCzXY#!z< zYY5iTqLo|APRRr*BHED_ZE-@R_j492bbW}Nvd#D7KFH<)3071V-fp34#2%uwoo~;& zN-Hn%xM|wC=8_Rnw&_5Dk}obKKr<@Es>=n#ur$?oP>B~JafOK5Ju0L$cF9rlsxfQVHroQIf>46P}OJ?KPiPiPPR zT+SDe-uztM?z%Bhd8I4z1oO%RCP}mv*3~NB;#z6m&AY)uMmHx!TDj9|6emt5>y$gT z)w_tUARZZtnb+@ouBO+yGo6~$N8Q)@NUrP-75Z~y}d2E??s+V_fs{}wwOxN@h77XyTaEAEu}cwIsmM~k_v??n9SaDj1)&1KAFX{f4# zYMBeas=FXo9YxCX;p^7e40qW6*WE>DktOG(4OI%e&k0uJB6Ue&%{TdWb;cxJ-NpZ$ zh4Y=J`*z-t0WIBx<@boguz(L4z36gkfp+Z2Z&X4H=23IuE*Y}A%R&@r^^zjf1SW|v z)@~8;txQKNYl~cwyD3S%tv3g%;j!9DdD_Yo|A^(KlxVb`d@64jcl^qEubqw`BTHqY zFpiscS8k3cc!6^h851{sm31NvLtOquR8-(#ALIeIA36Y79y~?U9VZCZH08xZS(fz>pf zp7Cdn;F0v2ughm$SQR?Wi~}+NG-ovV#ZvT0zV2E8t<<6pD^7Ks2iQ*1%op4 z3BM(hD(1-tXhEydy`&$VHZ0y>?wMWuNZn(K6~ASlC&G|U`6GYLPkV00Q9(~RQEFX{ zN8(MAXPx-O?xR*2jxm{LB^K{@(nV2sTK#DnHhkYa4rye{wlHo%rnv1WX05fwzDxUF z*Ua!c(-N$TbNT#yy@ElnPPMS_KbeKtDrZR)SS`hN*o-43cKaKwo8!0;7w4Q5AFl6K zEZw;j4VEE3^ty>$OlcAP!>3rObj6PdD>Ivtl2lSBMOQu^l2 z^Ypbu$-Hb{7tut-N#S5=d&M7beLa&Zggp~p7WcL*>Ogb|qMib-QxCWOAH&>#NEaeEj+G zWOr4Bp8nJ8yIYyLtU5a*Im_k3u}^bVkEZi>Nm9uA00&t+Q?T6PHO6p(Op%sU&<$c<&?@ik<4}kt(tqP(cyCyo5`iI z#oP*khl8*K%DTcYVkU~yw@r>b$C9-bK@*`Ou$#m%!TVWpi|DowD z*xGEEC|wGrI0cHkyKC^`PVwUI?(Xg$oZ=LB_o5+4arXd4i@R*zZ+HJeu4M8&Gv}PS z$5rljI+i!!Jflvz&$f1o|I|-VIk30UWi4XL!~yhR;P#R!aVA|qaT(%%j>(YnEu%JB ziiF#zU`}0^rn>!pp~bM%@$E41_UZJ#)gqRO)cW|PG|Ufw&RV%q2=V{5u1U~ZZF=%2 znUmKj_s6`dW(l?%P5`gTOX&2*kV@`dt*HOB(YNK*iFW@OA{#IHGmkx3%ArZ)~=>2C0{HUjQ$^EGM0Ed)_78i(err-a}O|9B~|-H6kS|6(v))wKS-GzrKTIe z`1Er!zd9uX2yX=7MqzgN{8ijIDlm!{(azBQB~q{m7CXkCue?G&gvGhW`n)n$wE%W$59dCW6n7dUY( z26G3MYU%n&lj@8ISYK0;d4S5Y)wwTmpG0(b64N>c_X9ih?+=@_@}9R?MeY_OJN$E% z|K}vbK}TUU1nl9#D*#y?H9LW$M7-KE{{&%bIldm2q}GQSg&K8jJC4N(SF}a%b=8EC zRMQA_C(EkkwdGy;-Qyqq+t96_op0hBk|lHL8V>@(PVCOvz-oCEKJ`}^LH&fHR|q;^QG{{vcnhl93EIG#oLM3J0i z(~P-E?K~>bXVgWt`6xk2wg{lgqDli=HYz_)KD2q=u$ZnOsy%TH;1hM40L z`JOGUA~vlwzP?H8Yj#c<$7R4>%JZBeanxjLe$91Rj$#*I|E0f5hP(l&c`E1{mTTVr zVZq1a2(hYbq!`E2lmXt~Ut@7&D?OK{4RBmfw zDv6CbEluf8cb_a)fTNbvbwgv^eRa_OCojlAJw7F#28%>|qLccj{AL4a9;W*D7}34w zR0X;9c%|kfQ6kZw`}*YbZ2R8rAHPSr*Ekeim~c}HEWf*lyGmx6h&f7Qf|M$1PiKIC zyYP81oh`E~61J`nP&|}U?CTfSSMSh0`#d&@>kJ+PuQ|EIH&f!C4Y!=jhaX;|dpXst z{(lyLSp4!v+E!#%@?t6(Q*Y|NNSv9^W0QlXI?6$NxT>nPW^1N_tV2ELr;C?#Ps__g zZ!VvJ+8ceAR+fnFCc$#sOLg(RYXZo&OvIeiWsN>@W%sr#clzM_)73f$FCUPzyN7(X zk7#U?cB35fFKKJ?x&I|U_gvmDVx@f#5Ll!9 ztQmhFvZtXRXj%)?R-IK{b$NvECSL5ssb69%4Ym@z9=TOJ;<+PT*Xom`TJn)2I;xTc zzTCu2YEv1$w>uRZ_$ZEO2;MYX5(}wv@+t!GSV#f(3OshMt=# zHaO+8qO;cnt_`bKAMIoug|8hboCE#_Z1Vo9&3Z;*o`JR-q&z0SVb15LFo_Q9Ck!I0 zAbZS@w;_+YW0-9C78^2qFSu4=px(1&zLLfb7f<8HSm-t{(w3~84-J#RtChAQi zGT~x3zjip8pFp|zkmY`_CyA3U$Kq?P>=uEq$n@B?Cy6?_(NG@_Ro4CkXeYhyXq8#fA26UXuV5#rKsI>G^mk=qn=fsm!NT>V zrz2qUYn|p(nZk~h6H}Hcb5#=MWGFYE2ab?ZWT`o}j}k!D6xm*?Gm-Wm>B*%~cw zGfKogt}D?=CLg@c>v{Icv*+m{MU*pEmge-{vD5t%E@@!Fy5nf^{=&z{fI*|pG>5)j z<~UmPM8CDeA%C}ak zxBNCIuNu<+4Z3Pk?;f@BwqvjL%1d0As_QDgOk4gZy5;oTI)t>j-o?~7Rv$eO&%F0` z(;P;>hZwT(OUorr>-KB_Sp#OAi>V)>^4(OVP4JX83n{Vc!7>!H<|vAsV4gTd*|5R* zzA#9&P&iNp6+{1OfuxjF%W>%k8>mpslBz<#Mkf-6*SjRQgT;K(!H?M&EpGqVf# ztBI|2dCLE$wLbDb1oSD(v)qJgc<@ij}RKw2%sQ==Jh|`67udXuRDTbStR)dguBII{hao zT!N^`CcZmH0~yV2Ye?iVZgmct|4L_`c;e zaCxQZ8%kwY5~6J)e2vrW^n3ltPJZkpEnW`hCX;*t^!aaQw;R+M62wkH*m5-5f^b4B zy3b?U6TcSHoC`lTVe-v_V6jxWMDItHo~kev=$_h_N@jMVA$I_9fCqgSM;0*eYjkeV z7ej^KQ(w$+FmC8Jd+Izk-?w}!@Voc%wXu-ED!+FGUm5G<}TdC1s!{f4o8y#^yu~n2 zpAHo-#|Ft`{2!4GPRH|c`y;fmdc$7CT%YSxYtEn3Ni;I|m!n&&kP`HKKVLNm@fh>q z!X8xOy>!=yCYoX$mncZk2#axi;Q{hkH-Y_mGn6114%$zvY0}yx&_vh=ht4zjD+i zN|1$bVuQ`1{EILB;^zyKeEv;E;1HE75Q5pEnY%3mF8MQo=ttEz{5PnwL$wNS<#3rh z_i@eR(f;{c(Eh5mI{3b1%Gi?0-vn-SBllZbGH}%d(B$@K{&Fx^{%;0;v`ENj`;*os z#l91b$0ZpK4Upnww{)4F6WW)~p!XN~!RE5v--+=vvXWHs1SOMKd_sNec|&K_#dmYM zQ#|ocbC#OxkGqwm!W}O&ZJ2w~oLkks&wp}Ga!s7QIjFHKpSw05#8m_IaoCUU)TUsr zmWHeJ_c$vQd8Plt1E$gQy|hBWfPeN2|17=JhAA(hCFgjGfh`2 z$W!>1yawu|-J0HwiQQ+QV9r^_(%`<%6`_*8?_AFXq=AtHR6B0&->+lBZpAD&Rr>88 ztF}|#{a;rjw~$g)FZ0xB9DZItbg}ld-9AYJA2xT*{~-U(YSzY)9y7#k8Q#3JbI{V70wI&DJGK!t>62#N-f>bFMyM4m7R-^s+rdH$|6w!HwZW2xdWs13_bCxVRY%tm zmGhS&mrP-*Cv57+rYVxVA^WRk@~5=p;}vLPqGg+E1K;g^a=Q9QyFpZ6S)djnWi^6N3qA+D7ihr5w0d9Jl<#{Z6Y(Hy;zpAFwDF?xA*qflG;?h9p`8Ye>%Nz?(}%~ zw$Ex1p$;5{p(G>_Mr5Ce=F{%ePvh1{7g@%?Pr@#(b|>I{$GtWFJr@u%r4 z>*C+f``|}(iT<_sdy!t|P(|u?-e;k0OVT?jlQCZQiaw+VdNjtM|Atf;ovdy5Y}K@fOWp~$RM2FKhmFxO znCJwFOjT{iPjioi*tV1q(@Ee&sU+$_{JeVAK((zikwK2O26&XS#&S(`1Cw@g&>bD5@USeLc6Oeh$@^UYT)o_Pee|Oza=*(SKzbp2=WU~8TPwMoWB(TO;`{R0Y$v{Z%LNoZ@k$Tcrp`Cv#vE()q+{6LjsGFvNpI2Jg4YejS90yc_-((L(EO_&Dp?6U&9*jZWbZO}fPfPZzCzj*gi{?1kC#Lq(FGrj zJ{&fy#uc`RBQILq6DtHz8lzcx9Dx6|wh(>C`!67z0nKbfb144vD$*6V&@J45-PcOq zkE0@Q4Hfhaf;l8#D&je4cTeop=old&**G=eO${CKMoX&(?A)2Yr7I^ifiLm`B|M8H zO|epQrzzx*O_Wy-Pc|BwnrtK`jd}XDu~Jiazmv61EHNc5q@YJbg+Mq!qQyZcYU|tI zSImo{&`7yI#aQ3}+CS-(_JuD|`hS+mr8N$Fk?F2Q#1oP#7Due%_&_4Gib~lTFIIvn z<@nC*xX;t07lA6vDep5PNam^?USiGN@&YI>6PqG4l*!fBgaB{Bq23mjx<#;n=qCRw z<8v#)!%`qV+=M#lfx-Som(b(W`*4F_P3QY9OP0lJZOXdQ#@u7#PeKS_@XJ2)>seS@ z>q+tv&kgcKRvy0R<5~RtJKyKei6Z%Ts?k^99>p>>U~22g$j35R%Du00{4K?Mr~R&E zJV7}@q!}@|{@c^9IWw!^0Y_~X`?AMaII5O)#*IqeBv{F@ zP(d9x<_D;c)S++g*@LC~l>GVycJfj9FMYNEgExzS!5k3-0}J;hmu@H}t=rARxx=k( zB8!34Euitqclr6t`%l*YetmkC($gPzygWP(Tlu&DN>uaN0tL*w`>>Qi)DvNPQ(9?Z zwey3=qvlbWdSZs-5lW2*tW_5_h|LCKBP4*p4sdyHyENzMp7ea?p~5DxMTRS~24Ibv z&_V%t48_00lSDor4|J(dfD>6q=DYc6jOfp0o#&?`%VsrmW=Ts*_Svc-41SUG1yASE1wsfPE|z*4rhQ1F6YZY|j>yh%7W1g=u^Onxj65|2#ix>DVd`dyk&i zSq*TuW2R*HeM(^y*lxopALy-v)Aq-H1gD@+ZdHvThI%f(JN^^gK4TbfVf_g65do1Z zDQQ!dc0MdDjEbrdKU)Z;Nf)xs>d%Td}UY3uQ;+o{j{mIP$Ysl_3AQ*vF1@>Xh+%Sm4$ABXxh)_E_8B(6H;-;`(3(owe``WOId<6Y;AjJ4Q(5fxCH=8u4Xvg1`Og@ zdcQ$tvsMEkf=C%wJ6TImR*nft_Eu!O)hhpJ`l%s_FE;4&zLD*ghaTxi3U7*m%J2_Y z(#g-?M~KVF1+6yDaf<211cn-2)Ksp&ytLm}1)uDGw?4`gF@Sda54CFfuMS6m))Wyu)MVB?eHh&HoHNc(bj_sK^W z1;l$?o~)l5ICRRVeXSakvs|6rE30f$nx%O(4o1it07lPw?4#S3#I#?6AzmB(lL`&X z^PHN~Run}KhoqE$IRp;M7g_#wi>qMQW!svm8&!>u@%g$r8X)^{el4`k5c%Htjibm2 zj=Oe(gIq|mof}nD%@~%!UD~-eVy^$YtQcb4I#LP=_tc}OomnlyQs4bD%STZ1_*>KIyzV+&PICtC;i69W0HevIIasHX;J5xeg2~1{ z3gjN!H^(_^oeG!Pz~Riud1!2EHeBm%lZn5mIY!OnIGZN+_G&6Yw3=_5VHB2ItRLiz zata+IT#F7SbK1rks2}Zeizta>8JnZ4Ll{#*K&O-uYg5a|1U9xCX5-Ia1}M!x&E41Q zddJAPIGC%5(%4)dlr4Bsefg%fOA)LNZn*i7U1{L3%DSe|{cdtM7W!*+@DpV0J_=7B^;45Zq{4MLpc!crGF^%d}q0T1!}c)}5|wTZ5BI z;9qS@%uNvU=U7tQ#}_aaPoS6~VH+4t$61j?)AF%-(?Kt_BhOMnP4!cJdy0$ATjfL2 z_KSdgNK%LCV$mWV>5uo=P%r3RHN1Hjozwu@w*jr zStw&JcDn~{n~cm(I~;>JG@KU0T>oHIH*>Qx8aE|=9HgoEG1|i8yA#_wFuk&Xxv;~y zlL{uN_AqEEwG-&X;)gaeSH*(>{sKdjHJRF(qQ*$9Mb-UsU(ZVP!`KRkk{+)5t;K(- z>sK2`=$ODbplEB3q}_fnCRjgQDTMp8qy77f+R6;&0J|lA%`J1CquN>#rrQ|F6q0U1 z!PviC$!P+|g6A?6eQB2Kt0jnaI{HxyC*YQYuXzPAA7KMeWsq-3l#w2CIy1>4OsAMi z2%tp59wTwb+4M3(NB&wu+{Wa+LDS`JA<`z>#8p&uggeVR4Qtjc=dP;>S#(QP{8L=C zVj=^w|G5Z>4mbsUn-as_iY2K5mdGPWS;2eVueLbiBiMOuj6v*} zUO%kXKy%IM8%b0&k?mC)laFD)Z!@n!AIS!HU$seUaDR^O+(Zi(B0_@en0X`7@Yo25 zHVhZ*((kwZ$FIL@8U!x02Pb_x-j9NDF)))-My$k<79m+9L7%vi0}|2zgwn2>fv`Tn z`Q_yO9~NLg#qe}Wn~slycv(h-CTPDJa%GV_Bnx`g{ecF({{;K zBt7!^5;1^le#E6Vx2}sl9qv^PAo7rs!W-L*puC)=VM#%h!P`V1r-uhut2NCjI zQ#kwC8eoQ<2@jg1&N;7QKE#ePS92T-|do)M#6O?e7u-47cxnm-p8{Yxnn0Pe9igXnG-POLp!RR4Upna zW(0Pzs@h<~bDWGZex-&&0KiFaCd~2!bJVDs;kw2yI5m>Xn+A%!$kpAW`i6z^GY{%e z?k$dNj_830SvAURGtzlo4rNz*1Zj2}#xu0=`PvWaXE=}>8@z2jipKb2lH>F;*>O^i zaQkB)Xi~dD<{a@wZ0>F}7bO?Ia{Up=9^Fvc3F(Y;jN3fZ?cOE$}X zrDAf4+gFy~VyGQy>Re>b`9-NM35FX@qkocDvnNrM`>;5hRfSZg)AXJsZ%T_(XSf-S zb3j;@$m=?K5fF=ut%i5cxOllZ4@w zz3-2593g!jljmFQ!AVBse8v*5=$Hj^M%GDAT!l}YqTOK|fO#C_pm;pz%dR;oMR}e< z5qid<$lpykBQtfMEaG)ob#Qh46!RxWwx`E=m@R7B`B7ny7tk{lrY_)hiVnqK^UZRi zcY4zgVJtx041eqqw*f3)|CaTo;WpcAReJB!f6<8 zOR}$C%vOIjoDD)cypAY@+hjpL489#{_Z0;gkE2%yOczv5lqL^f^sBrUnqOucd7B@x zk_FwDzN#hfgnb>b?%E037gQpIkMrN2 zB@^`=Cu_#v=BZ+~Q`BzjC{&*&A{D783dEi*Xw$L3pmm?<0<9@k7q6Y=V!~foFDI3| zEpTW?Qh)Tez%}hgUU-_LJ2>ghW!O@p^Pv5~qv>Qpr7CCz$n&0S56c-Vv>5lP)7D!=*A=pIR1GE%< znm0ybl2q*kT1&b#ny&E~63zaWhs>VVdE+qpzJ`{XrBTOET4rdOLqwL$Mt2I-`=m}Z z{)Mt?@(kn$YRMK&%B*d^cOJh;r&M;>G+hpk@sh6J?EWsMb|L8c6;p(^Ieq%qA=-2E z7inTS3O_a}s!Q}nQNrLvVHHaX?p){xOB<^T{wiB~<2SlIAAET$h;+jVjAb-wgC?mv7L%7 zM$~MAN#D30U6xb@m(#7X%)bI~uv@)o9=@i=RO%$G7?gQ}puVk93U4DBgDGCWel`=G zjeX{arsj2Aw)d(bKx*_CG;J%iT%I323XZFyA7SI*){XVCnMbJ>Q9|t=8G@Cg5JquA z_%uUbjccl9M& z51FzNdYX_Uzti;iSuN%aC?97Itw!I&t_ax2h~i%}k2tar8^XC!)R zHdWmJ=Fkv}D~zVu#izCX4kb)=6m{Q^Lf<*oIuWOMK{;p19SSPhNDsgc9E_t18LVL- z58?bAiKT^~ zw^^u<-1p5G@sECb5@?_C!!pV=gHeY|JT zdjJ1f0G7!!E1RWfRG386O`5b%GT6`A&Rv^I2t)LW-dXFveo4+ud3gPjXp-K$rI;lQ z|A_pilpGcCBrm}~t2=_9p!LV|3i4)m-yguB5LIYe6r}W#M$e(4F2rhY8 z4HZfieKn&+Bk>38Cw|eugq1}RDH~e! zBV$>Hd(uzuan5Boi?83QgQ5xjXP!B$jw!QE#m&pja{|M
!;YrQR8A+u#Xpuyp}4 zm4&R4Qw(G-xi@*Vw+sfz5`1YhAOFzA)3LcpTAn3cM!(#yMttR1fYb%e;LO>5r(IxT zP98i^&mZ+KV$B7ng`*N`Z%SmV$Q@h$2w*5fJ4x@p2(i7YWjLYl;6ydkcULl;Q~LTV z`}NCSFhwFm7b8v;0&9#@YSi^k3W0?DWttSUv_3JrAiHD5Aec7?@i_=LEp3vvE7sGh zmqa$OpsTA_qmkDYWzI^9{#p13Dr~%J-2UN^o}SSZM-uCFA_8p7v8a!+MZ>NtrwMG# zU(wK;AR6vC1d(9XeVp(U>RPp z>{m)AqzifFl=dN2hrigc4I+$pV`DEB8QJ1)cV+PM*gzW&87Yl9J3{ZPI9rw~ikc;A zuYxiJE-nBRn3f1V$1)8)92@}UhuTF$H>(zO>lT_FS4*8xc%&Y0IuUaQs^%6AvFOdi z&9Har#wj+7Gu5YRnvllQ2}6(!LMTR=7m3swnMU!@MEIS>%%?Q zhAF6q=L;8gM2C1OM)}PmbW9WJ>d^Mbi>qI~a05F%c;wxxx{)rDIV0im)CLt{n1Z>m zQ!|*)f%|wCS)Eh~$V&k;OpY;vHeh6uA~Wv(k2)Apo`AD!qSBr3t8rs46Ib-yBrsMS z#U>$da$B=miOqnC5kb>30__Cn{4e$f1tuLQ&12R-8&{U6;Co}#Y|IYLY6h{&v5;}pZ>XmP4UyhQKgD7Bnqo}gICIyQ(Q-_lyJ(VEo0+d zReNX!6{CEAw(dun14>@whis(l1Qfo9=7cFZ1VZ6-6#|wRVrr&Y=$z&5TR=R0sTg5v z)?8UKYA+@;x!+4ez!0ec{y5HOHXB63zc5s@#L5hqBv85Vi~d82t7-62VG+C~Ic4^` zYq{0fK}N&XN@~bpEcQN2z^arLP0plkyvcdhY74I}P^wEk`UI8{$NGeV$W=$J^iw3O z7(`dSvE%veHC>H6etwZ$kK3WJ*kZ8Tl}01;F3s@^>N}oX^!5R#x;kBJ6ESZk6&FGG zzOU=vdHNtunfW{h!SDSlUm=4fzSWiUbar^GEnSV z&O^~O-r|yb>O@RN4EuUoN~%<@o7T}HSRszpL+oWa8_;fIVD zqI$+H;huHx!QblD_97im?33y5qaK7bLbOpt;+BKd z(j33{>qeS%KDw+!CKZ3H3FDWpS9&0xNJ>-LixXrDw-h(djQX?{`q6rXj zgkH;Txy3_zcpY_eu-`!2$<0Kus74%d)u+aYgFflYuz8rP9o8MjTYZN%+MdPf#Tshb zK!&r|V1cHVF5V5X;-_kB0j0w&9If*7;cOMqkH##^HW}^V)9)#s zw{~e-ZbU1#bTRd2yNh}*%QFm+m@DYx0-ZOsN(lq63j1{>N9~V`Z*7O=P{ZPJZzKE& zpaiOiC`|2;Y3`dPyBJ_(?;qJ$@@@{?^nci#<>R ziFX{`4W?9hk<+50m_ZAXcmz*7xq()mY5Az}&l=0&{NLegw^v{@w1^J^6E-{(8k4Q1 zUgInVQ)*=3*eQkrUP3KqSAjOG3m$pTLUF{XYCBw7GkF08s}Vg2U!WRQjp5Kn*UBor z+9~j#{FJKL{=WWKg2a)G&z#uIuVVeM+>+1&V(+C#(WAR^#0s=Zwng%fWF|_9BrU2w zkX;UuId=QY+#ye(ed@;R+ zU|JRJOrIc^OxSy;W|l)jrn}mi$uCVsE<6&(e@w&F3&@6i%nVOn{i!}s{-KIn$e0Ch z8W0QAnaIz%)tc6cgM+U?V-#~C0^&!s(6AmcX?r|n6)(yQt7%5LWobiT*P3P|mg_Ib z9h>|aO|LTO130%DS&;ggjB_LtNd4)k?nf@X(Q|&5ml!%qxCHC(0$<4wl1_0dIMS){ zlMXU(?K6Mk3Tbe>VdE0%X4Q-4w2vObUk_KxWFuw9i~xLCX|>9Yx03;Exwe|Y1n&|a zhL};PGJ`dG#zE#$nEGSk2weJ&8&o?8O;|YZ{qrU4IkRjFwTPG6<}MQ}FX-fiPRm~f z57vZuW6$;}7V9aX&|-=pPlgU0C2S&H6Hr3&uzjbp)srFZpB5Eb*emkgKcCPb;^ z6iw0_(WozDMIgOvds{N!tfZnI(+opla|b92uTG+R1~e%r)1AorBE_D<4=U(B-KN7T z+uzrs9GuTL+4gbQCLmGOHP@21)DCnE*mdU&;RrB=77tZHuM+W1O3+flq>2%l5r$+Y zE^P3vdus6Z?NJvI!cK~${D3S&uR7`f3@bs!PM}j9<{@OcKWgbtGA%a1TM%<4 zlqn4x=NK?PGld+B9Z=`JlYjOxr@c74d=ocI@k#4Vz z4~oEz#?Th@Mi@ri>JU7H!6g@JOiVS}$*g{l_fu~lF^Zx{X<`T34PJR{CEH{HbD@_5 zJ{v~MbW|n*I2Sl*VHsQ{I9zlMW+d9P!&Dh?`X!yTrSTG|Wnj&dvq+W&{@tF zHj9GBY_0yN5pW-!lK%6Z*NY@t{jt373(>flEp zXILeKB*&2e)gzEryNl_tghtl;B%kdej3R3JuUFGn2ZOm$dD!iF7r3+oIAJ^9M8)P1|RR^rg zT>_k6tSub_uH4rMQILwF9hsSF;};>$rG+}#YAHWwBOtk~h(~IXv)W$7a zM$O{h`3394G<*huh+i-D`%eMVvB&Mx=JByZc*Y*kN6G1g+R4F+?R5&co6U6oL4CZ` z+vBm~J0h2^$DeXckMB|0?l3`-t~cW>e^PD@F1NwEQB8AFiHbrR9;;Z+Cr&a!dBR7) zF!&3n0pS{IkZ;cO-EpJu7q?BD`cG6<{k;Y5J#vF_xn;O1WrivHGL%*wFM)f#5w_|L zIDf9AK1iL%r9~7vYEN!4Yp|86e1T+kLPxG+-|F?xcP)wbH9Si}4E2ykD@L8h@0# zQjf7pc6aYnVaC~sxn+mQ{*}qW)q1!yS^%QVNTbLR3lpx?cis2|_ejOK!I-ZOcdO4= zE)M(-hF1}#(Q&HdRxoJ^%Mr{>YuE9KeU;YdB|AI}-{xsS%VyxPaw!x6y*wPnHwprv zX9AOCt<*fBv_s|b%jRM&jhi{;Eh=w7P01N4gi68DJZT!Z!E^*oG~LW}}m<=D>Ce;nI{v-M)` z%O!-c1QtM#s|(tq*4kKVH=Q?>us4E4_N0F%;c>zpd+e)Fj3geJc1TN<&Zy_)xgXX$av z6)`B!8O*8qRarCfil>%AFRIiB;qjGtdbKS`Aa|hLg}&evG^I*_{y+QLJ+w1coyrlr zHCN2Sbd$UBHX?(;WkOmfKVlG0+Ze!{HT*^ncST*EHP*nCi#&mf3mZe z+fpKp#+weSqU7tWRsrg-F^ro2U&#^&3U#z=1$c23SG<s&)Y34rYGyB#!B!GsW@$@k+&%RWjqWJ6QT^<8vre9DdZkIFl3vDTUyGkk zluZx|CoycwSqojKim;2y;<{uB;%XH6mP3^&qSQiajV!tdZtE|r2kB%eWbyUlfa*W0 zf?t{13(&A=2d_5CvQ4bneBbvkwU`Ahy%obHW9%gFn9Fh$Z)5RD_fl|lC(n<=@D zWciRKGHLcgMf`(iji1G!QLqx%`9dJ4jw8~0 zr6S*YwtTB*JdL@{VU>2|*+&nnhF^IcJ|OKd19>M*DOV{Xu!9M{>%X2vM<~AlQu<`8 zU+ZorElP*tM>x^Gn@3Zdx-bzuWAx<;lkcSLr{&0u`h?^{6ATeQ&iS`veyv>rk9%dNrbEEYy2R0;?S;ts%|-Ey<7i<(4v8Z^0T$- zr+UONH8t#b)l)U~a;y1Ug;%i3$7IvLxL7L{(EFtn@!$Be=&T3Qj8ABACx5X37#7(g z)X*~)vWhn3exg{x4buj*Hr%a`lM|_s$B~-F!Mr%?J8f;gcm0K?A-a0I9RZC=RK7|1 zRNXdXO`YP@zVPL(`h!Z{xhOoCJuQ3l$3oOaa?)tjlWY4w+^t>6a5v+DyROdMz=(FO3sojamZ)eq1 zz2s$;yVL3fA5!7d#ysaO&~6bfP>waf;j*0l+3XPin59CA%rdcT(1$07p3lyt&C0&3 zt771XvWA=s%Ie{CW6FGt_i21n{l`9T)?Z!fWtf{=5j>+IU5tT>_=W#akg`*rG7_71 z>!GB^+H^H?ga5jYzgt!Yzi}zX`rO@h zzuCSm|5bl01pWZ|tGW;{_Ju*Ty)jzVIJ{}pFq@V*NIy+z|MQYG8Fd6|~mtoaW3&s6MNRpbO!6q0`iix zXxidhnRfoU*j^cUXC(LYPW42}_ueI^tl)`!s36h`i$XHjRICDsbLvRqpP8!G_$YA zLy%Lk4O=QF&g?cb#QVWzhDscVzD@p*J^`j41PPO;z!mJnY>67C^lE!l>CI>%v|3Oo z`PF!VF2bDYVO&$Z(E;0CGYU_ONT!uoquNkr^>iLSZ-@2RBxVhx)7)^V_9*=~zhei2 zPMeY)iz7!9LC*|4<=#MZvuXlc5CQ}E5=Y#JMi*~bCUby?-HM#+q;u5bHT5K{sGBGv z?o0r8OXMVsaK~Hf1OU#2L;)yMJE8`z^IgT2Rmfqwn3GN2Hh~e}wCI+i zIaUj6R~I3#x1go7{6bk@D!l`0`7gd+M)=%)&ns;S?c2ig5j$sEzK*$)b%PCIKz63? zJ?$e0?U9UXCH7TXWd`F)prFwqif(~9dU+w!^OeWbTZJi}Mtp-_s)a>(>E!$U?q?>L z(B|sP4~Qi_JKySwkD?{qO@T%vYp`WyiPY5>2R#O?J)2f9X)2~G8 zDeGYPk;XNeOk1#M=$b;*=E6;)_?v(kOcB`#U)qWj5@OG~5;s2-gJL$SIQ7jO0NfR$ zZ~9oIM`bk2DQnimQ8x0At+zS7*~wNLe7${A2DA6R!gaOG`1{f z3$A>{59r@fCB%^&f2n@hKzgY7Zt}^g>#pzF!DZF}jQ?C1T7g{CZnH7niiKxrg8!W{ zhQCO$#2K;ZoW%ri0A%~z`R9|JPMK=|1AzlW)rlM`oX5aH9>Jeqx!w0AV6?n!Zp-)+ z#zOlLC7SU%zYFRrimiO208>Bxxup7pbRws|V0zc8=!jJn303$x7a!*AG)i=+acY|3ZnW_w$ zo#$aeU#H@O*uXE7w)|tFrW|qx%^k-tg>_QjP>$>$hOCgZy9XMLaxjuV^A1RU@LZjx zm6;C)Wx+cE@e7GUc@en^OD5IWmTgac`kToC%o(xh6H?Wp^_rlO!~}WXl)RV#jTU}J zx$Q`IacIhIqu`tZ`x3F?9&HI0FtsAknU2e(9X^hcsG`sUBg|P?)K;LIVUp1_V1nBT3H!8`)|`!BbW3n?VxBSr8lhrH^D5GxjAeIbnAVh!bA4 zL8tuZg5a>NV*YUdcH}L~5l&i}QIPEblGjGaQ4z7>GKD@qzQOG)7_MC>Mr)|AaST`k z(!Fs5DSyfph|P@12wFfb?izln>>i1l_L!nl$jqxh4Z)eNKQ8Z5HtGyz0k;WN)twQ> zxiY%GMnu94;i)js6nf?3exsO_8Y z)5VNz5f==5<(DswNWmg?`yF*f$+vyKl8@?()?Ve#4~6X4qqoMk0llV%7CrQkV44m4 zUQaarmNE7sGy|r-_BUC9mgxi7VrKa?$zUfqNh(2&s&N;EDWJZ$cA&M+SLR_;*Q|M% z@?+{RTwT`xr?syPi>mAXMnX_RkRE9il#mdR?ocE}I){b<>6Dg`?iNHqM7l#dhLG-V zM38PI-#y;p&2zmU|9pV!V$STd&e|(~XRo!QyvtE-6IBODF_mzCDy$b86uJ%5Ns?TC z;#GS!GJU?77Dw#QOdp6Y*JDsgkpB6tGCYf~`PS2BnA|RJ&r2-LP5#!*uFi|Il^|6z9+u(S-*V)CS+7N-nllGb^9c;XB)dV3M})P*XaMG_L&xn_llmo?S% z3@7F-nF%PMV z?%A!T&~_Q=*l*q#Ih*p-I`_&%lj?n;+Uq-kvimyv*}P}hSIz!s+R8*LMklJ1n4{t^SV6{eE&>&EC&dTfs}omEIzs`S!x-fU<38o)v$PlVy zSaFJ8$A!4$up{^ZXAYL}m+IzcJb6@6usIvIjT|l+Eq)oNA%C)+mU6zm!tT8*%l7Y& z6!LFqnEDwerVJuC?ed~&W^=m4rABH>pj$&bBL>#P5_W4)xM~(UNHHAkP}87~o6~V* zluI{Di@U+TW?f{&bc)r_-6b+ms6AbXny-47c)H!MTAz6Me1+aek9^fktKt@E~59Hrk>M6 zWO zB0K@l^M`4Sc<5L#C#!~-1V=b+OUR5Gjwc!}`Uu0-kbmZLSBpqv`zD|pFnuJKULyYI zEPyxe2A5PgR9Rf7Sp6f6g4u<6+4+aU*`YO*N7DZO8jh10+^o^aPW{u=6jmR@=zkS6 zdFtNw&5|I_!8+x#6(4wWK5i|%Jd2}?(crlJsB23Hs#bK+fi0%qLXi|wt9N)Zw& zqL-`&=Ir&>Q}NX+tv6sM>Vk%1MmeX=HPVyyG)cD^Vuk&78;7iF+jHDtfvX1QEzQqP zH8fFrA+d{kLNe3-Q1?!SzJN)8nz9Vf@U5t#(rPavenRz7lX$8XXuzs)kezrJvT_Pn zt!ljv*R6OapFH*RZJ~HmDUlJDIV+IVwk17C;G-MDcN|7CD`!qERuFN7tr>+c<4Rt7 zu7m}B>*F;X_*@Zivi0eX2D=Uh6r@^#l%-838ykn=^>mEJk>q5Za15o=O_Q0UkXWTw zzJO0yE!bDtUNPHRWGdcB=SpIg^R#o3|;ApSn3s1S@!8wEH-K!h3B+ExqmRgH7vVqVDS9zT3yEyJWd z4XyNQxlW!OW_lSRa3Yd&i{ohhNdUPZ%$a0P1uEF^GNI$;OT(qr>>GL3g>m!}4}1eo zD4LzSAxS8ojUk;U9(O(R@HlOVT`7~f2+|n4+-QnI!^Rh0v56 zVpxp)$cS0bqdmUrqul4Kh}myD`eHu87+zE?khEJWKu6>$Q%I^T{q~q(}MAYip!6_2wTI>BSGI(^)ALTYRIP ziwTm!W+jLeTsX;nk$P!8lW~-}@-nk~)45TcN{au9=eyWgDtfBc1oeyE*iUt4xE*GL z?DQ<34KwE*?ms2}rG9SlXFK**+R)qXztt)tf!@<`JLt5)?_$#>pgSb$CQU3Ys*8=M zf){Oi%b01f&VGy1d{6%7h+L|tem{GHNABH2tt?2c>3-9?xOT({l3-(k;^xLDqaTHM z=-<{O`l?U`4+d3{Ry4#nYD0hre_a zwQPd4s+n+S78J4l}AbzR>f${Jj7{5cd^cTtg25W|G$N(=BGQf#mY1Jy)DjpaDB@%`nnfM= z;C#eA9gbutRamIr#A?Le?eScr$7f;UF2Sp)2(@X*lu{M8VF^w6mq!SY|F+c_lNQae zRM)*9C5{Cr>m}R|A*Y&gTmxjpg>~>p(XZ6(tKmi!g0!}kK}d2;!R+~8H*EzPBxMJ~ z7)m-NEU2VE@VB<0yjW#;yeemGVH5(mCZ~KE`;^J*Mm`sTI%!s`TXX0;gLr*nUHBL^ zE?!npL3uOXbCKK*9zRY(!^o8cR*ijAO{>^Me7!D7H;u~q6xtQ2pC{B-5rtt5FIpTE zJxAj%mC!vE2W3WF--{PAI3m%j2+?!m``pWf;R@q`wQ=cM+ViWj$3 z2@=kULbVr4Z#6JIlh60fF0}E~nZAMJ%BmTd-A2Yy7cntD_(EPkAjBtOOF{9MxAnS( zZghOOvTWaDr=hVjI+oflDk>OFuGmJpIg~5QP+6R$)LSLi!TNsmD{j&uHWm@so+$;t z-fV(sj(APnasa(P3i*DNneqW%{^~4uEv|YPVKuxzeSahFJNkY*S#i(1tBXatm$BK| zNjF8CTU(T4e>#~KMz!C9Q7erM6frb>XMMsG+GL?Mz5HI+BC-^!ORF_m3b}Ddi(iYs zv3WEn74|&NjGkz{qe&m$wzPdNRTFl$SJqTz7dCzJs{7t!=zW%@pdj@aBu%R-TQ33q zaVI4c#+%Dny)TL4x71t@iEYbUjB#?+v=gWxm+m|U4Xdod&8uO{!T!&D*Wi^tG<9(( z8s1pGIX~HZjGnK4@^?u?oLMZmH>~}cMm@~oxn(`dyI8Vbb_1*IA5yR4M}34dS&i9b zF=e!vvnvnP%bXw*3#*lBf_*<@zpM3RkJ{#iIN-4EGX_&ZnIAI^Vwr_8vkiSw?um^K z#+!$h`u9y1t(sTR7svzgGi`i zsIFnn$ZYyY@-mGKhlF_2w>b~#h~dUvqm$d4+`Q*x%esXrgvBcn*5&vF&?A7BX=F-% z8gLcV&(XH}npbYCrufn*+wfmBeEn6-{dQ${^^ecM>9h z@nuAiDr8eu+Iyl(L)H({UxJhmUwomHg)z=kJt=DFlP^u7S6)OXzaR9*O0lC|Vw_)+ z1%NMYD03f_M!NlD8_%S+XK6gvn_X{peSg5tv-ynjQzvhXChYF~M&aakhBHqpk-Mx8 zQAc@L;YM2VDD%!9A35^#A&K%ko=q=s7^T_weEf!mNLR#&)Tff{&E=&d*5@)8IX&!- zc4%2@DV3CVWkd3Rx&n9KGAtvKPYX71V7Uuo`}rr8|MsLX&%! zOzQja6>cT7^V1f{q!07AcuSg@WlygWZ6(mM*-<%OVVcoS8LlF8-jdS(nlqi)$=T)@ z!hnx*RjkS%^c0*7TPuu>;nifbZhapK>c09-@*NYTc^$`giJ3fb4uenJ;iC*qVfd%1 zo?~_!rXAQyvHXqF-1aN1j&DBBp4WYUrA^>9u}>*M#BUh79bVvumCUB`!$&>FB4F3O z&~?@5h!*v$IlUx_m6&yp;%@y&;R9i_iynH6dujcfr?znis$W4#3^%JGnu0dZiiSix@|9bnSW)dRcK1Bmw z0$A=^yc<-@D_Y56oY?x}*aSb8EV!K(flE*7qAW4O!$zqXxkN;g{d0OU`zsNv0V7m= zn^PjJ{fN2qNqRHi2DB@IEuMA^8)a-wC-!YV4yHt;KbyA41>TeKo3_#30zsME>}ET6 zn286pSJH#Dp24y$N87|Cer{%(RXz9kde$m8>1@S?QD$AyTnw{DEh}lY&W7Vq#dNna zo(*UcraZHgc`F99A*ldRW<$%Erc!(s^BsaAWfTkJ;I!y_hkVTC&5kb(S@{hfu~fy2 z)7ME_RnX33aL^&Y=6MZzF>fjx42>99$0!2``T;FpMLvfpqb*ER_w3yESL@5~)=es# zu-APMe^7A)d;6&5XSP7{%l5CN%@C{FUtH{bHQ5cRMm%d&GH*vIAfYu*BA+c9d0`xUeeL&b zHoJ}c7o(47tA?PyGY3=HS;FOl`YA+LDFqF+O<`VtJ&hNxwYp#0jxZs{ftEYrr-Fea zXNEbHe?J8m{qvsig)+f6hO!$k`qPxkt^VR9%`iSIA=fVQzv;dqMTID`M14m|B&wGpY&YFStVh_~jn9Mp z4++Bb2;HM!&BPgR?YGscAs6PI_j?ol=MHHw#Ct5*u~mLS!IboeEydaKYWbE8KNUuf zI;}r+uCfA0x5cVGFaasKihHZ7wxDEj%=-FmIj`naUEM!-LvSUNc0SoFb7`@d5Rcnp zbcaQTqH5Hf@#&;w6Jg{o>Ypq7T@VFkE@uT7n)QyyEAD%f4V<&cf9`0FsuAkd#h`)x zk@&aZ{KIkDer1q(Oe?z%7PcVv?q61gG607>D2!&~+l=E>XbY(QUHso1wevx@0!X{10ccxdI6STPZNBo{3#bXZ2WvxokS7H{EEgR9 zSS&Bv{sat;vXz9#S6faEZ-CIvf~nvw0e3!dSwiYViJ3Kqb5#q6ivPMD0xq(w^7gjJe<=VagGwAYCu#_V<29i)HAUEY z`{Oe>-!*~p1vU$3VCR1%T?}EGKGw{!%w7{&uym)*JO6+`<{x30AP``%uxBnjcK?V7 zf>LT=fW$a>U!T0aBX}}n(R6{F%{eX4T%@@)GGRBzf(uQ*o6)d3x{NONwyfgVD} z6ZKdP=m5P;LgOggcKzAwJq^SF^&YM%i%`zd)rry{j#HNHE6bf66iS$=vp@=fd=wTn z-)`~8e!)CfLq`~wBw2qn2}2B#bhaLU9Z0Varddi+xEQ`#GK$ycaz8!jV>(M_Gidt& z?8QTG$_gH2CtzZJ2wk}VsH?DcZxU7rhD4S<>E&Jm2XCF!2HL^cnxPMu_S0212ik=? zb_i`qU0fdA5%g^ST1>yVvQZtL)N(i|=S(b{%xkV7P&VNPegugUn%Aae6hH zUfu)Px4Z{{tNd*IH#et>+Pi6dZw(xW3i=(<&I}>$+F^K7Q@X@9laO6KkhgdGESh z9FA#bs-ybfp}gGdV$sCH3PF|WQt)ASO*6vK;}Sew&A2*g7pgxPd@+56l+5&bUNe~V z37z)C1u$8*M0AxsS)gXY|6UZ_RR$0B$1bCHwU+R5%x zU@I%Wq-#|wMuLvdF~r^QP@g12smRx_=j3#(L2emTml1=HE%Ahpk*O&JTsd0q_RB>X zY$sKq)jl)R1rughgQMkmAJG?oYT_r#;#u&;?{HrI7~mgC@tP5p!g>D2yu|8VLQ|_8 z%8OMgqCO_l&UE#{K98eP@#d(ET90uEYDtGpQzenM83l5)eB*o(} zFIZT$C+`8JXgV-k$>DVqk48ojevwr}0PdXDi$TSgC7Hm6;)I;7%lZ|!s6f%6_A{!) zCbG~;)16dMGl}TdhVd}E+G;w$<~ zV3#MHZ8r!79k+a?M!J{rcsxN?ik%!wQ4+HkIk*UWR*4!?j1Hwpk{Sw#PONnM- z3%9k2LmX>L0%oEO$?;*Aeq(DVGl(@lBrvHfH6LTC;%t00BJZ(>pNu1y-|?3XEult{8PGM8wOiIlkMo)r!4IVrQea)Qs`5CQR7Elz`(SZ@2hre=WpTZq64Rua#Zge za$JQfQSb8ucbxFaHou5zG%IxmHf(#;SCUgN~r5{gc!~*;7mGsYtQ%UV0*h?;OZ^!qcYH3 z9N$euDb2E!3)kx>o^-T0hv%Guhs7r#eRBVD(qlh)ZhituY;W!Jhtwg?ONLwwE6oQF zPwZDk?4tTrIy8CY!lsD&Dp)KVy>1Ykg301i5}H_T2@hxQz=9f+t?GG9ddV_p-IjKH ziAG~bl-%UhoPCQ1rP!&pEbp$Y_Zlv$Hk>L~D3=PM#>8|Zwc+d@cYbt|O-|ERram%H zcPb(cAVtT9v{Ex*dgSYpm_WYYj{bGVES_Q6@+0-ls4b&uww-2~G+udW+_oWd~AiGgX zM%R&{Yy%JIeYqBh%EH5E>@m5^q1lZae3iVUnp#=i845O5! zB8tI{r|X6C#V3=&w@sjoY)2hnQec9tFv(QH9qmsC1$YGII0T-sPlDpzIZ#M~z#Fdf zs!`d^r0?_%k12)*aEmrGKFcKfd>@=#nUWf-4p&n(+!ET&?8;M7+5A%DuFv&E^|g96 ze?2zdyN+V%Be0$WW)UA7m?*W>wlFo$02j4LZSEDiatj_f8mOFcOokV6cUOiNm{Bt8 z)Q*pLgZ7$vL5*{6RKR6sR)l*19cJ>M3G7^*lEN&jxII2BT~g*_mA`y6V4rA3nbKOC zLoz4$m7!{qo~`8=(PyFZB?xXJ{M1PvP_8T=nJFxdd|N>~;_;>_jeBq^CQbd!B9P+c zi|%eyRuv7i2NvA}M0wI1-ds{t!DLF2Kqxb`i-l7OD9COGRPiE0?@&}kr$?M8lg0!5 zkN8>mIZ3)Z_JVcKX+YppA%XP4^+@#I6JxAPv4jt;vG>@}!P_{7Q;;wA&@{T<;%XCX z4UY(!t-d&#ifuz-mPG1${K59@iJ#6dQ#-jY;~;8bIz6EJz7sQ`&Tn%-_o7WX3_V8z z#JT0~%H>^&(ka{z24sjzH?gDjt7b&v#sp=}IyA2Kg|3F`AAD)REy0Zip(4uI>5jpy zLY^xWWoIWZ02U;S!;_`6os{JBfr%{O_2>7tK>|1=boBD6ZYzlj;24-cKUGP zt;qMcyO>T!zk)H5zovHv7KXs<)Z|P-Q)n?ouaq8|oXKHC`}HuN8yVZri=_jWy>%4q za4j+DK%5_<;PvRe7U`#bL|_~WGn>Tg*D{fa002Vp+n>MxZvqo0EJlsU7rsuhj9y!X z>JG>ZTvktbuB9m6{s_!S%%M^@@A@hfAYs_=-?h7*MgYR2m;8UeZcw|v3O`6_etcZ| zaUCUr+(slLBQqYw*H>`?c}}lbdmkdtOIQ5ikA#F?^;}%!)gKBt2*B;{< zMjg_1+6#QZGZhR*dyoSv`)4uuL2-Ei81vfyQA}0aVI)=H%~nwhPUWm?F61!2;T#QZ z2XsX|28rZu4MHO-Ce5SiWI<+88YAfqfEH)qnYM;L%Y*osYh3Rwi^pzoxWG|DFT)N< zRmiLxZ@j&Utzi_a?0URa2Zozc08<7=utwfhn+HqI=m#^a=(;;-lmk;Q2*$iBBL4$u z-~x`I`Jw;juqh8RFcwq3xA5fvzyij=A}|w5KF1AZRqb++x`M{MF3^uw^}p!&5$TFy z`E;4t5Qsy)LA-VhVkVD-6_7kk8Ai)`T%FB{g*nYQsH$ymdmQuWUxJ9&zZ22r7l92O z49RcL)}8h8ZPxUk8YlWUK$l*>P#+;|v7xFMlAY6wbwM zbPHBnyf=4pQv-w0H~)AwBiw(ZIf3xjoy+emo`KCx`dl;iLjbHmeHrXNrVq^ZIpDa_ z-g0Lv-A0SJU(_UOyJQ`BbPXFFXE$pP9uP zxhC}lw9JpjbUn3qLF)Nx9GU4e?apE_%j8Eira}FUF?}891vEZ!9T_jUCp2l8RX>E) z1LS_E!#RJvR5VqjG1=`_YLukjmF_ zd7f9706lC4E#>;n#L-Sa{-wvlFkI_kQCRTgIV#9{`ptG-#3Uu`#~Yi6*+yqw%l)yEIj0SzQ;UFr2HGAE4vGb%17-l{k;$UWvn<> ztwJC(gyzx}vnq^-qs*BDpd^iTaRVAaegrTQO)QFO>j{6uMVRhc65Q=_|3iE16!5TQ zcjt7^7m0xe5gQv!Q)sgD8_a*(99ELYzIeD4w3-Afun{QkKl%$;Wk%rdn8N!^zaM}p zpb-EZ7a%=`=9iE9JSepd+vKu-$_5+F)2VaqNq)Kw-2W@{iXMYwKBB?R`m?R~&7G4# z741O3-G$?x!8DCF2evnk3IvhP<_5%dEq8>-oH`PssaxZ)KI5Cbx4D_;3QP|P@W+o? zvSUU(PO^5e1$`_2wjnowLD57?GO1J#9g*W9)2)7=&)C0Ie*W;Jbc@>l=F01*j zSa9Gnfo8<~6$$Nu*A0{~p-X2|d$pv0@Twe9J+!QaoNx1ie*;(=UP!MH4aAH~O;>F( zOWqLuC2roQRP%95r}G=-|AnXLG3=2MP`i)Z9^L=@`=#9 z;9rO1e!d01<^O_s@V*5#Wm)z*xSf3m+;#nJ>Dc16xS;*myi=L I5Y_Yff46!_1^@s6 diff --git a/chapter3_obs/Q1/loss_plt2.png b/chapter3_obs/Q1/loss_plt2.png deleted file mode 100644 index 7130ae108045a50f7e8be28d601292a9651ba0ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35885 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 P;6Ewx2V&WGA3gnFq!ctX diff --git a/chapter3_obs/Q1/loss_plt3.png b/chapter3_obs/Q1/loss_plt3.png deleted file mode 100644 index 12f82669b9251a01b16b0161a2a87e82bcd55421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33370 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 diff --git a/chapter3_obs/Q1/q1.log b/chapter3_obs/Q1/q1.log deleted file mode 100644 index 65fd30d..0000000 --- a/chapter3_obs/Q1/q1.log +++ /dev/null @@ -1,33 +0,0 @@ -epoch:[ 0] loss:0.9782 accuracy:0.5000 -epoch:[ 10] loss:36.8449 accuracy:0.4986 -epoch:[ 20] loss:32.3964 accuracy:0.5014 -epoch:[ 30] loss:44.1199 accuracy:0.5014 -epoch:[ 40] loss:47.7680 accuracy:0.5014 -epoch:[ 50] loss:47.8981 accuracy:0.5014 -epoch:[ 60] loss:47.3736 accuracy:0.5014 -epoch:[ 70] loss:44.8779 accuracy:0.5014 -epoch:[ 80] loss:32.0941 accuracy:0.5000 -epoch:[ 90] loss:38.6557 accuracy:0.5000 -epoch:[ 0] loss:0.6789 accuracy:0.5329 -epoch:[ 10] loss:0.5207 accuracy:0.9686 -epoch:[ 20] loss:0.2992 accuracy:1.0000 -epoch:[ 30] loss:0.1245 accuracy:1.0000 -epoch:[ 40] loss:0.0435 accuracy:1.0000 -epoch:[ 50] loss:0.0175 accuracy:1.0000 -epoch:[ 60] loss:0.0092 accuracy:1.0000 -epoch:[ 70] loss:0.0060 accuracy:1.0000 -epoch:[ 80] loss:0.0044 accuracy:1.0000 -epoch:[ 90] loss:0.0035 accuracy:1.0000 -epoch:[ 0] loss:0.6706 accuracy:0.5000 -epoch:[ 10] loss:0.2948 accuracy:1.0000 -epoch:[ 20] loss:0.1091 accuracy:1.0000 -epoch:[ 30] loss:0.0388 accuracy:1.0000 -epoch:[ 40] loss:0.0168 accuracy:1.0000 -epoch:[ 50] loss:0.0093 accuracy:1.0000 -epoch:[ 60] loss:0.0062 accuracy:1.0000 -epoch:[ 70] loss:0.0047 accuracy:1.0000 -epoch:[ 80] loss:0.0037 accuracy:1.0000 -epoch:[ 90] loss:0.0031 accuracy:1.0000 -test_1_acc:%.4f 0.5 -test_2_acc:%.4f 1.0 -test_3_acc:%.4f 1.0 \ No newline at end of file diff --git a/chapter3_obs/Q1/q1.py b/chapter3_obs/Q1/q1.py deleted file mode 100644 index 6164436..0000000 --- a/chapter3_obs/Q1/q1.py +++ /dev/null @@ -1,225 +0,0 @@ -import torch -import torch.nn as nn -import torch.optim as optim -import torch.utils.data -import torch.nn.functional as F - -import torch -import torch.nn as nn -import numpy as np -import matplotlib.pyplot as plt -import os -os.environ['KMP_DUPLICATE_LIB_OK']='True' - - - - -def one_hot(val: torch.LongTensor, num: int) -> torch.FloatTensor: - """ - **Overview**: - Convert a ``torch.LongTensor`` to one hot encoding with scatter API. - This implementation can be slightly faster than ``torch.nn.functional.one_hot`` . - """ - # Remember original shape of val. - old_shape = val.shape - # Reshape val into 2D tensor. - val_reshape = val.reshape(-1, 1) - # Initialize return tensor with float32 dtype and the same device as val. - ret = torch.zeros(val_reshape.shape[0], num, device=val.device) - # Fill value 1 into tensor ``ret`` , according to the index stored in ``val_reshape`` . It is an inplace operation. - ret.scatter_(1, val_reshape, 1) - # Return the reshaped result with the same prefix shape as original shape of val. - return ret.reshape(*old_shape, num) - - -# delimiter -def get_one_hot_encoding(num: int): - """ - **Overview**: - Implementation of one hot encoding with nn.Embedding API. - """ - # Use the identity matrix as weight tensor. - # Use freezed embedding as fixed one-hot transformation. - return nn.Embedding.from_pretrained(torch.eye(num), freeze=True, padding_idx=None) - - -# delimiter -def get_binary_encoding(bit_num: int): - """ - **Overview**: - Implementation of binary encoding with nn.Embedding API. - """ - # Generate a matrix with shape $$2^{B} \times B $$ where B is the bit_num. - # Each row with index n contains the binary representation of n. - location_embedding = [] - for n in range(2**bit_num): - s = '0' * (bit_num - len(bin(n)[2:])) + bin(n)[2:] - location_embedding.append(list(int(i) for i in s)) - mat = torch.FloatTensor(location_embedding) - # Use the generated result as transformation.. - return torch.nn.Embedding.from_pretrained(mat, freeze=True, padding_idx=None) - - -# delimiter -def test_encoding(): - """ - **Overview**: - Test different encoding methods. - """ - # Test one-hot encoding with nn.Embedding and scatter, compare two float32 dtype tensor. - x = torch.LongTensor([9, 0, 1, 2, 1, 3, 5]) - one_hot_enc = get_one_hot_encoding(10) - y = one_hot_enc(x) - y_ = one_hot(x, num=10) - assert torch.sum(torch.abs(y - y_)) < 1e-6 - # Test binary encoding, compare two int64 dtype tensor. - bin_enc = get_binary_encoding(4) - x = torch.arange(10) - y = bin_enc(x) - ground_truth = torch.LongTensor([ - [0, 0], - [0, 1], - [1, 0], - [1, 1] - ]) - print(y) - print((1%100)%10) - print(torch.randn(10, 2)) - assert torch.eq(y, ground_truth).all() - -class Parity(nn.Module): - def __init__(self, in_size, hidden_size, out_size): - super().__init__() - self.n1 = nn.Linear(in_size, hidden_size) - self.n2 = nn.Linear(hidden_size, out_size) - self.relu = nn.ReLU() - self.sigmoid = nn.Sigmoid() - - def forward(self, x): - x = self.n1(x) - x = self.relu(x) - x = self.n2(x) - out = self.sigmoid(x) - return out - -train_data = np.arange(0, 700, 1) -test_data = np.arange(700, 1000, 1) -bin_enc = get_binary_encoding(10) -Parity1 = Parity(1,32,1) -Parity2 = Parity(10,32,1) -Parity3 = Parity(1,32,1) -pi = torch.pi - -def train_1(): - loss_plt1 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity1.parameters(), lr=0.01) - trainX = torch.tensor(train_data).float().reshape(-1, 1) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity1.train() - for epoch in range(100): - pred = Parity1(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt1.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt1) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.close() - -def test_1(): - Parity1.eval() - testX = torch.tensor(test_data).float().reshape(-1, 1) - pred = Parity1(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - - acc = (pred.round() == testY).float().mean() - return acc - -def train_2(): - loss_plt2 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity2.parameters(), lr=0.01) - trainX = torch.tensor(train_data) - trainX = bin_enc(trainX) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity2.train() - for epoch in range(100): - pred = Parity2(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt2.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt2) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.close() - -def test_2(): - Parity2.eval() - testX = torch.tensor(test_data) - testX = bin_enc(testX) - pred = Parity2(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - acc = (pred.round() == testY).float().mean() - return acc - -def train_3(): - loss_plt3 = [] - loss_func = nn.BCELoss() - optimizer = torch.optim.Adam(Parity3.parameters(), lr=0.01) - trainX = torch.tensor(train_data) - trainX = np.sin(np.pi/2*(2*trainX-1)).reshape(-1, 1) - trainY = torch.tensor(train_data%2).float().reshape(-1, 1) - Parity3.train() - for epoch in range(100): - pred = Parity3(trainX) - acc = (pred.round() == trainY).float().mean() - loss = loss_func(pred, trainY) - optimizer.zero_grad() - loss.backward() - optimizer.step() - loss_plt3.append(loss.item()) - if epoch % 10 == 0: - print("epoch:[%4d] loss:%.4f accuracy:%.4f" %(epoch, loss.item(), acc)) - - plt.plot(loss_plt3) - plt.xlabel("epoch") - plt.ylabel("loss") - plt.show() - plt.close() - -def test_3(): - Parity3.eval() - testX = torch.tensor(test_data) - testX = np.sin(np.pi/2*(2*testX-1)).reshape(-1, 1) - pred = Parity3(testX) - testY = torch.tensor(test_data%2).float().reshape(-1, 1) - acc = (pred.round() == testY).float().mean() - return acc - - -def main(): - train_1() - train_2() - train_3() - print("test_1_acc:%.4f", test_1().item()) - print("test_2_acc:%.4f", test_2().item()) - print("test_3_acc:%.4f", test_3().item()) - - -if __name__ == "__main__": - main()