Updated SOL code
This commit is contained in:
1 parent
85c12f7d52
commit
4afc1c816e
1 file changed
+70
-59
+70
-59
@@ -201,6 +201,8 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"RE_FAC_SOL = 10/(128*128) # factor to compensate for the original scaling from the original solver-in-the-loop paper\n",
|
||||
"\n",
|
||||
"class KarmanFlow():\n",
|
||||
" def __init__(self, domain):\n",
|
||||
" self.domain = domain\n",
|
||||
@@ -210,12 +212,13 @@
|
||||
" self.inflow = self.domain.scalar_grid(Box(y=(5,10), x=(25,75)) ) # scale with domain if necessary!\n",
|
||||
" self.obstacles = [Obstacle(Sphere(center=tensor([50, 50], channel(vector=\"y,x\")), radius=10))] \n",
|
||||
"\n",
|
||||
" def step(self, marker_in, velocity_in, re, res, buoyancy_factor=0, dt=1.0):\n",
|
||||
" def step(self, marker_in, velocity_in, Re, res, buoyancy_factor=0, dt=1.0):\n",
|
||||
" velocity = velocity_in\n",
|
||||
" marker = marker_in\n",
|
||||
" marker = marker_in\n",
|
||||
" Re_phiflow = Re / RE_FAC_SOL # rescale for phiflow\n",
|
||||
"\n",
|
||||
" # viscosity\n",
|
||||
" velocity = phi.flow.diffuse.explicit(u=velocity, diffusivity=1.0/re*dt*res*res, dt=dt)\n",
|
||||
" velocity = phi.flow.diffuse.explicit(u=velocity, diffusivity=1.0/Re_phiflow*dt*res*res, dt=dt)\n",
|
||||
" \n",
|
||||
" # inflow boundary conditions\n",
|
||||
" velocity = velocity*(1.0 - self.vel_BcMask) + self.vel_BcMask * (1,0)\n",
|
||||
@@ -301,15 +304,14 @@
|
||||
" )\n",
|
||||
" (Res_out): Conv2d(32, 2, kernel_size=(1, 1), stride=(1, 1))\n",
|
||||
")\n",
|
||||
"Parameters: 47330\n"
|
||||
"Total number of trainable parameters: 47330\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"layers = [32,32,32] # small\n",
|
||||
"#layers = [32,48,48,48,32] # a bit larger\n",
|
||||
"#network = conv_net(in_channels=3,out_channels=2,layers=layers)\n",
|
||||
"#layers = [32,48,48,48,32] # uncomment for a somewhat larger and deeper network\n",
|
||||
"#network = conv_net(in_channels=3,out_channels=2,layers=layers) # a simpler variant\n",
|
||||
"network = res_net(in_channels=3,out_channels=2,layers=layers)\n",
|
||||
"print(network)\n",
|
||||
"\n",
|
||||
@@ -339,7 +341,7 @@
|
||||
"It also adds a constant channel via `math.ones` that is multiplied by the desired Reynolds number in `ext_const_channel` onto the stack. The resulting stack of grids is turned into a single pytorch tensor via `native(order='batch,channels,y,x')` and represents the input to the neural network. \n",
|
||||
"\n",
|
||||
"The last function is a helper to transform the output of the dataloader into data structurs for phiflow.\n",
|
||||
"The data loader produces numpy arrays, and they're transformed into a velocity grid with the `to_phiflow` function from above. At the same time, we're normalizing the Reynolds number for the NN operator, and we keep the original one as a scalar value for the phiflow solver, as the latter uses \"physical units\", in contrast to the network.\n"
|
||||
"The data loader produces numpy arrays, and they're transformed into a velocity grid with the `to_phiflow` function from above. At the same time, we're normalizing the Reynolds number for the NN operator, and we keep the original one as a scalar value for the phiflow solver, as the latter uses \"physical units\", in contrast to the network. Each batch for training will contain multiple samples with the same Reynolds number. This is taken care of by the dataloader.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -382,7 +384,7 @@
|
||||
" v_in = to_phiflow(inputs)\n",
|
||||
" Re = math.tensor(inputs[0,3, 0,0].detach()) # Scalar , get first index 0,0\n",
|
||||
"\n",
|
||||
" Re_norm = (Re - math.tensor(dataloader.dataset.const_mean)) / math.tensor(dataloader.dataset.const_std[0])\n",
|
||||
" Re_norm = (Re - math.tensor(DATA_RE_MEAN)) / math.tensor(DATA_RE_STD) \n",
|
||||
" Re_norm = float(Re_norm.native().detach()) # we just need a single number\n",
|
||||
"\n",
|
||||
" return marker_in, v_in, Re, Re_norm\n"
|
||||
@@ -410,14 +412,12 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"LEARNING_RATE = 1e-3\n",
|
||||
"#LEARNING_RATE = 3e-4 # NT_DEBUG\n",
|
||||
"optimizer = adam(network, LEARNING_RATE)\n",
|
||||
"\n",
|
||||
"# one of the most crucial parameters: how many simulation steps to look into the future in each training step\n",
|
||||
"MSTEPS = 4\n",
|
||||
"\n",
|
||||
"BATCH_SIZE = 3\n",
|
||||
"#BATCH_SIZE = 10 # NT_DEBUG\n"
|
||||
"BATCH_SIZE = 3"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -446,19 +446,22 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[96m\u001b[1mSuccessfully loaded local-sol with 10 simulations (6 selected) and 496 samples each.\u001b[0m\n"
|
||||
"\u001b[96m\u001b[1mSuccess:\u001b[22m Loaded solver-in-the-loop-wake-flow with 10 simulations (6 selected) and 496 samples each.\u001b[0m\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import pbdl\n",
|
||||
"import pbdl.torch.loader\n",
|
||||
"from pbdl.normalization import StdNorm\n",
|
||||
"\n",
|
||||
"dataloader = pbdl.torch.loader.Dataloader(\"local-sol\", batch_size=BATCH_SIZE, sel_sims=[0,1,2,3,4,5],\n",
|
||||
" time_steps=MSTEPS, intermediate_time_steps=True, shuffle=True, normalize=False)\n",
|
||||
"dataloader = pbdl.torch.loader.Dataloader(\"solver-in-the-loop-wake-flow\", MSTEPS, shuffle=True, sel_sims=[0,1,2,3,4,5],\n",
|
||||
" batch_size=BATCH_SIZE, normalize=StdNorm(), intermediate_time_steps=True)\n",
|
||||
"\n",
|
||||
"dataloader.dataset.__prepare_norm_data__() # manual?\n",
|
||||
"dataloader.dataset.const_mean = dataloader.dataset.dset[\"norm_const_mean\"][()]\n",
|
||||
"dataloader.dataset.const_std = dataloader.dataset.dset[\"norm_const_std\"][()]\n"
|
||||
"# remember for normalization of the Reynolds number conditioning\n",
|
||||
"DATA_RE_MEAN = dataloader.dataset.normalize.const_mean[0][0]\n",
|
||||
"DATA_RE_STD = dataloader.dataset.normalize.const_std[0][0]\n",
|
||||
"dataloader.dataset.normalize = None"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -488,16 +491,16 @@
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/tmp/ipykernel_652541/1761501079.py:8: FutureWarning: Domain (phi.physics._boundaries) is deprecated and will be removed in a future release.\n",
|
||||
"/tmp/ipykernel_953067/1761501079.py:8: FutureWarning: Domain (phi.physics._boundaries) is deprecated and will be removed in a future release.\n",
|
||||
"Please create grids directly, replacing the domain with a dict, e.g.\n",
|
||||
" domain = dict(x=64, y=128, bounds=Box(x=1, y=1))\n",
|
||||
" grid = CenteredGrid(0, **domain)\n",
|
||||
" from phi.physics._boundaries import Domain, OPEN, STICKY as CLOSED\n",
|
||||
"/tmp/ipykernel_652541/1761501079.py:15: DeprecationWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
|
||||
"/tmp/ipykernel_953067/1761501079.py:15: DeprecationWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
|
||||
" domain = phi.physics._boundaries.Domain(y=SOURCE_RES[0], x=SOURCE_RES[1], boundaries=BNDS, bounds=Box(y=2*LENGTH, x=LENGTH))\n",
|
||||
"/tmp/ipykernel_652541/1761501079.py:15: FutureWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
|
||||
"/tmp/ipykernel_953067/1761501079.py:15: FutureWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n",
|
||||
" domain = phi.physics._boundaries.Domain(y=SOURCE_RES[0], x=SOURCE_RES[1], boundaries=BNDS, bounds=Box(y=2*LENGTH, x=LENGTH))\n",
|
||||
"/tmp/ipykernel_652541/2464907391.py:5: DeprecationWarning: HardGeometryMask and SoftGeometryMask are deprecated. Use field.mask or field.resample instead.\n",
|
||||
"/tmp/ipykernel_953067/4224160660.py:7: DeprecationWarning: HardGeometryMask and SoftGeometryMask are deprecated. Use field.mask or field.resample instead.\n",
|
||||
" self.vel_BcMask = self.domain.staggered_grid(HardGeometryMask( Box(y=(None, 5), x=None) ) )\n"
|
||||
]
|
||||
}
|
||||
@@ -539,11 +542,11 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@jit_compile \n",
|
||||
"def simulation_step(marker,velocity,re,resolution):\n",
|
||||
"def simulation_step(marker,velocity,Re,resolution):\n",
|
||||
" m,v = simulator.step(\n",
|
||||
" marker_in=marker,\n",
|
||||
" velocity_in=velocity,\n",
|
||||
" re=re, res=resolution \n",
|
||||
" Re=Re, res=resolution \n",
|
||||
" )\n",
|
||||
" return m,v"
|
||||
]
|
||||
@@ -573,7 +576,7 @@
|
||||
" m2,v2 = simulation_step(\n",
|
||||
" marker=prediction[-1][0],\n",
|
||||
" velocity=prediction[-1][1],\n",
|
||||
" re=Re, resolution=SOURCE_RES[1] \n",
|
||||
" Re=Re, resolution=SOURCE_RES[1] \n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" net_in = to_pytorch([m2,v2],Re_norm)\n",
|
||||
@@ -593,8 +596,7 @@
|
||||
" vdiff = prediction[-1][1] - to_phiflow(targets[:,i,...]) \n",
|
||||
" loss += field.l2_loss(vdiff) \n",
|
||||
"\n",
|
||||
" return loss, prediction\n",
|
||||
"\n"
|
||||
" return loss, prediction\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -617,9 +619,9 @@
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 0%| | 0/4960 [00:00<?, ?it/s]/tmp/ipykernel_652541/1256326133.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" 0%| | 0/4960 [00:00<?, ?it/s]/tmp/ipykernel_953067/1256326133.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" input = torch.tensor(input_cpu, dtype=torch.float32).to(device);\n",
|
||||
"/tmp/ipykernel_652541/1256326133.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
"/tmp/ipykernel_953067/1256326133.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
|
||||
"/home/thuerey/anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
|
||||
" warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
|
||||
@@ -627,11 +629,11 @@
|
||||
" return torch.sparse_csr_tensor(row_pointers, column_indices, values, shape, device=values.device)\n",
|
||||
"/home/thuerey/anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
|
||||
" warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
|
||||
"loss 11.255152: 0%| | 1/4960 [00:17<23:31:23, 17.08s/it]/tmp/ipykernel_652541/1256326133.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
"loss 11.792998: 0%| | 1/4960 [00:17<23:34:51, 17.12s/it]/tmp/ipykernel_953067/1256326133.py:7: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" input = torch.tensor(input_cpu, dtype=torch.float32).to(device);\n",
|
||||
"/tmp/ipykernel_652541/1256326133.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
"/tmp/ipykernel_953067/1256326133.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n",
|
||||
"loss 0.12536502: 100%|████████████████████████████████████| 4960/4960 [2:20:33<00:00, 1.70s/it]\n"
|
||||
"loss 0.21036954: 100%|████████████████████████████████████| 4960/4960 [2:21:38<00:00, 1.71s/it]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -659,9 +661,9 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"Note that each call to `update_weights` internally performs all 3 interleaved simulation steps and neural network calls, and back-propagates gradients for the whole chain. So, for the 3 steps, the first network will receive feedback whether it's inferred correction influenced the two subsequent states towards the right direction or now.\n",
|
||||
"Note that each call to `update_weights` internally performs all 4 interleaved simulation steps and neural network calls, and back-propagates gradients for the whole chain. Due to the order, solver first, then network, the first step does not go back through the solver. However, for the next 3 steps, the first network call will receive feedback whether it's inferred correction influenced the 3 subsequent states towards the right direction or not.\n",
|
||||
"\n",
|
||||
"With the default parameters, the loss should go down from 50 initially to circa 5 (more epochs and larger/deeper networks could bring it down further). The decreasing loss is a good sign, but of course it's even more important to see how the resulting NN-solver combination fares on new inputs. With this training approach we've realized a hybrid solver, consisting of a regular _source_ simulator, and a network operator that was trained to specifically interact with this simulator for a chosen domain of simulation cases.\n"
|
||||
"With the default parameters, the loss should go down from above 10 initially to around 0.2 (more epochs and larger/deeper networks will bring it down further). The decreasing loss is a good sign, but of course it's even more important to see how the resulting NN-solver combination fares on new inputs. With this training approach we've realized a hybrid solver, consisting of a regular _source_ simulator, and a network operator that was trained to specifically interact with this simulator for a chosen domain of simulation cases.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -684,19 +686,16 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[96m\u001b[1mSuccessfully loaded local-sol with 10 simulations (4 selected) and 300 samples each.\u001b[0m\n"
|
||||
"\u001b[96m\u001b[1mSuccess:\u001b[22m Loaded solver-in-the-loop-wake-flow with 10 simulations (4 selected) and 300 samples each.\u001b[0m\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# testing\n",
|
||||
"del dataloader # close hdf5 file handle\n",
|
||||
"\n",
|
||||
"dataloader_test = pbdl.torch.loader.Dataloader(\"local-sol\", batch_size=1, time_steps=200, sel_sims=[6,7,8,9],\n",
|
||||
" intermediate_time_steps=True, shuffle=True, normalize=False)\n",
|
||||
"\n",
|
||||
"dataloader_test.dataset.__prepare_norm_data__() # manual?\n",
|
||||
"dataloader_test.dataset.const_mean = dataloader_test.dataset.dset[\"norm_const_mean\"][()]\n",
|
||||
"dataloader_test.dataset.const_std = dataloader_test.dataset.dset[\"norm_const_std\"][()]"
|
||||
"# get new & unseen test data\n",
|
||||
"dataloader_test = pbdl.torch.loader.Dataloader(\"solver-in-the-loop-wake-flow\", 200, batch_size=1, shuffle=True, sel_sims=[6,7,8,9],\n",
|
||||
" normalize=False, intermediate_time_steps=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -750,7 +749,7 @@
|
||||
" marker_sim,v_sim = simulation_step(\n",
|
||||
" marker=prediction[-1][0],\n",
|
||||
" velocity=prediction[-1][1],\n",
|
||||
" re=Re, resolution=SOURCE_RES[1] # take Re from constant field\n",
|
||||
" Re=Re, resolution=SOURCE_RES[1] # take Re from constant field\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" if network: # run hybrid solver with trained Neural op\n",
|
||||
@@ -767,7 +766,7 @@
|
||||
" ], math.dual(vector=\"y,x\")\n",
|
||||
" ) ) \n",
|
||||
"\n",
|
||||
" prediction += [ [domain.scalar_grid(marker_sim) , v_sim + v_corr] ]\n",
|
||||
" prediction += [ [domain.scalar_grid(marker_sim) , v_sim + v_corr] ] \n",
|
||||
" correction += [ [domain.scalar_grid(marker_sim) , v_corr] ] \n",
|
||||
" \n",
|
||||
" else: # only low-fidelity solver \n",
|
||||
@@ -792,23 +791,23 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Re \u001b[94m1920000.0\u001b[0m\n"
|
||||
"Re \u001b[94m1171.875\u001b[0m\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/tmp/ipykernel_652541/345484244.py:3: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
"/tmp/ipykernel_953067/345484244.py:3: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" input = torch.tensor(input_cpu, dtype=torch.float32).to(device)\n",
|
||||
"/tmp/ipykernel_652541/345484244.py:4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
"/tmp/ipykernel_953067/345484244.py:4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
|
||||
" targets = torch.tensor(targets_cpu, dtype=torch.float32).to(device)\n"
|
||||
]
|
||||
}
|
||||
@@ -836,42 +835,46 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Running test with Re=\u001b[94m1920000.0\u001b[0m, Sim. only\n"
|
||||
"Running test with Re=\u001b[94m1171.875\u001b[0m, Sim. only\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Sim. only: 100%|██████████████| 100/100 [00:15<00:00, 6.45it/s]\n"
|
||||
"Sim. only: 0%| | 0/100 [00:00<?, ?it/s]/home/thuerey/anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
|
||||
" warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
|
||||
"/home/thuerey/anaconda3/envs/torch24/lib/python3.12/site-packages/phiml/math/_optimize.py:631: UserWarning: Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\n",
|
||||
" warnings.warn(\"Possible rank deficiency detected. Matrix might be singular which can lead to convergence problems. Please specify using Solve(rank_deficiency=...).\")\n",
|
||||
"Sim. only: 100%|██████████████| 100/100 [00:23<00:00, 4.22it/s]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Running test with Re=\u001b[94m1920000.0\u001b[0m, With corr.\n"
|
||||
"Running test with Re=\u001b[94m1171.875\u001b[0m, With corr.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"With corr.: 100%|█████████████| 100/100 [00:36<00:00, 2.73it/s]"
|
||||
"With corr.: 100%|█████████████| 100/100 [00:40<00:00, 2.49it/s]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Rel. L2 errors: low-fidelity: 0.13189382933080196 corrected: 0.0202646186389029\n"
|
||||
"Rel. L2 errors: low-fidelity: 0.13536353854462504 corrected: 0.03418217146769166\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -884,6 +887,7 @@
|
||||
],
|
||||
"source": [
|
||||
"ROLLOUT_STEPS = 100\n",
|
||||
"\n",
|
||||
"err_lowfid_only, prediction_lowfid_only, refs, _ = run_sim(input, targets, ROLLOUT_STEPS)\n",
|
||||
"err_corrected, prediction_corrected , _ , corrs = run_sim(input, targets, ROLLOUT_STEPS, network)\n",
|
||||
"print(\"Rel. L2 errors: low-fidelity:\", float(np.mean(err_lowfid_only)),\" corrected:\", float(np.mean(err_corrected)) )"
|
||||
@@ -898,19 +902,19 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"MAE for low-fidelity: 0.13189382933080196 , and hybrid: 0.0202646186389029\n"
|
||||
"MAE for low-fidelity: 0.13536353854462504 , and hybrid: 0.03418217146769166\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABg2ElEQVR4nO3dd3hT1f8H8He6ku69Zwpl7xZqAcFRrYoiigjIKIgoCAhUQFBZ6teCyhQEAWUJUlBBAUGxDEU2CAgdrO690z2S+/sjP26NDJuSNm3zfj1PnrYnyc0nF2jenHPuORJBEAQQERERGRAjfRdARERE1NgYgIiIiMjgMAARERGRwWEAIiIiIoPDAEREREQGhwGIiIiIDA4DEBERERkcE30X0BSpVCqkp6fD2toaEolE3+UQERFRHQiCgOLiYnh4eMDI6P59PAxAd5Geng5vb299l0FERET1kJKSAi8vr/s+hgHoLqytrQGoT6CNjY2eqyEiIqK6UCgU8Pb2Fj/H74cB6C5uD3vZ2NgwABERETUzdZm+wknQREREZHAYgIiIiMjgMAARERGRweEcoAegVCpRXV2t7zIMjqmpKYyNjfVdBhERNWMMQPUgCAIyMzNRWFio71IMlp2dHdzc3LhOExER1QsDUD3cDj8uLi6wsLDgh3AjEgQBZWVlyM7OBgC4u7vruSIiImqOGIC0pFQqxfDj6Oio73IMkrm5OQAgOzsbLi4uHA4jIiKtcRK0lm7P+bGwsNBzJYbt9vnnHCwiIqoPBqB64rCXfvH8ExHRg2AAIiIiIoPDAEREREQGhwGIiIiIDA4DkAHJycnBxIkT4ePjA6lUCjc3N4SFheHPP//Ud2lERGQgYmLKMXZsIqKi8vVaBy+DNyCDBw9GVVUVNm/eDH9/f2RlZSE6Ohp5eXkN9ppVVVUwMzNrsOMTEVHz8OefJVi8OAt79xYBAC5cKMfLL9vr7aIW9gAZiMLCQvzxxx9YvHgxHn30Ufj6+qJXr16YM2cOBg4cCABITk7G888/DysrK9jY2ODll19GVlaWeIwxY8Zg0KBBGsedNm0aHnnkEfHnRx55BJMnT8a0adPg5OSEsLAwAMDVq1fx7LPPwsbGBtbW1nj44Ydx8+ZN8XkbNmxA+/btIZPJ0K5dO3zxxRcNdzKIiKhRqFQC9u4tRN++8ejb95oYfgAgObkKN29W6q029gDpSFBQHDIzG3dNGjc3U5w7165Oj7WysoKVlRX27NmDhx56CFKpVON+lUolhp9jx46hpqYGkyZNwtChQ3H06FGt6tq8eTMmTpwoDq2lpaWhX79+eOSRR3D48GHY2Njgzz//RE1NDQBg27ZtmDdvHlatWoXu3bvjr7/+wvjx42FpaYnw8HCtXpuIiPSvqkqFbdsK8OmnWYiNrdC4z8vLFBERLnjtNSdYW+tvIVsGIB3JzKxGWlrTXZTPxMQEmzZtwvjx47F27Vr06NED/fv3x7Bhw9ClSxdER0fj77//RkJCAry9vQEAW7ZsQceOHXH27Fn07Nmzzq8VEBCATz75RPz53Xffha2tLXbs2AFTU1MAQJs2bcT758+fjyVLluDFF18EAMjlcsTExODLL79kACIiakYUCiXWrcvFsmXZSE/X/Ezs0EGGWbNcMXy4PczM9D8AxQCkI25upk3+NQcPHowBAwbgjz/+wKlTp3DgwAF88skn2LBhAxQKBby9vcXwAwAdOnSAnZ0dYmNjtQpAgYGBGj9fvHgRDz/8sBh+/qm0tBQ3b97EuHHjMH78eLG9pqYGtra2Wr0/IiLSj4KCGqxcmYPly7NRWKjUuO/hh60wa5YrnnnGBkZGTWcRWwYgHanrUJS+yWQyPPHEE3jiiScwd+5cvPbaa5g/fz7efvvt/3yukZERBEHQaLvbVhSWlpYaP9/eu+tuSkpKAADr169HcHCwxn3c44uIqGnLza3BsmVZWLUqBwqFSmyXSIBBg2wxc6YrQkKs9FjhvTEAGbgOHTpgz549aN++PVJSUpCSkiL2AsXExKCwsBAdOnQAADg7O+PKlSsaz7948eJde3b+qUuXLti8eTOqq6vveKyrqys8PDxw69YtjBgxQofvjIiIGkppqRKffZaNTz/NQmlpbfAxNgZGjXLA7NluaNtWpscK/5v+B+GoUeTl5eGxxx7DN998g8uXLyMhIQG7du3CJ598gueffx6hoaHo3LkzRowYgQsXLuDMmTMYPXo0+vfvj6CgIADAY489hnPnzmHLli24fv065s+ff0cgupvJkydDoVBg2LBhOHfuHK5fv46tW7ciPj4eALBw4UJERkZi5cqVuHbtGv7++29s3LgRS5cubdBzQkRE2lEqBWzYkIuAgBgsWJAhhh9TUwlef90J1693xMaNfk0+/AAMQAbDysoKwcHBWLZsGfr164dOnTph7ty5GD9+PFatWgWJRIIff/wR9vb26NevH0JDQ+Hv74+oqCjxGGFhYZg7dy5mzZqFnj17ori4GKNHj/7P13Z0dMThw4dRUlKC/v37IzAwEOvXrxd7g1577TVs2LABGzduROfOndG/f39s2rQJcrm8wc4HERHVnSAIOHCgCN26xWL8+GRkZKinP5iYABMnOuHmzY748ksfyOXS/zhS0yER/j2pg6BQKGBra4uioiLY2Nho3FdRUYGEhATI5XLIZE0/4bZU/HMgImocZ8+W4p130nDkSIlG+wsv2GLRIk+0adN0fgff7/P73zgHiIiIiO5w/XoF3nsvHbt2FWq09+plgc8+88LDDzfNyc11xQBEREREosLCGixYkIHVq3Pw/+vVAgBatZLif/9z1+v2FbrEAERERERQKgV89VUe3nsvHbm5tcnHxcUE8+e7Y/x4J5iaNv/gcxsDEBERkYH7/fdiTJ2aiosXy8U2c3MJZs1yxYwZrrCyannrsjEAERERGagrV8rx7rvpGpuUAsCwYfb45BNPeHub6amyhscAREREZGCSk6swf346tmzJh6p2HUN0726OFSu8m/0E57pgACIiIjIQubk1iIzMxOrVOaisrF0Fx8vLFAsXuiM83BHGxi1nns/9MAARERG1cMXFSixdmo0lS7JQXFzb5WNnZ4x333XD5MnOMDc3rLWRDevd0gNLTEyERCLBxYsXtX7uggUL0K1bt/s+ZsyYMRg0aFC9aiMiIk2VlSosX54Nf/+rWLAgQww/MpkEM2e64Natjpg509Xgwg/AAGRQ7hUujh49ColEgsLCwgZ9/RkzZiA6OrpBX4OIiNRbV/zwQwE6dozF9Omp4mXtJibAG2844caNjvjkEy/Y2xvuQJDhvnNqNIIgQKlUwsrKClZWLX9iHRGRPp07V4qIiDT88Uft1hUSCTB8uD0WLnRH69ZNZ+sKfWIPEIlKS0thY2OD7777TqN9z549sLS0RHFxsdgWFxeH3r17QyaToVOnTjh27Jh43+0epQMHDiAwMBBSqRTHjx+/YwhMqVQiIiICdnZ2cHR0xKxZs8Ct6YiI6icjoxpjxiSiZ894jfDzyCNWOH++HbZtkzP8/AMDEIksLS0xbNgwbNy4UaN948aNeOmll2BtbS22zZw5E2+//Tb++usvhISE4LnnnkNeXp7G82bPno1FixYhNjYWXbp0ueP1lixZgk2bNuHrr7/G8ePHkZ+fj927dzfMmyMiaqEqK1VYvDgTbdpcxebN+WJ7QIAUe/b44/DhAHTvbqHHCpsmDoHpSNC6IGSWZDbqa7pZueHc6+e0es6+ffvuGIZSKpXi96+99hp69+6NjIwMuLu7Izs7Gz///DN+++03jedMnjwZgwcPBgCsWbMGBw8exFdffYVZs2aJj/nggw/wxBNP3LOW5cuXY86cOXjxxRcBAGvXrsUvv/yi1fshIjJUgiBg374iRESk4caNSrHdzs4Y8+e74803nWBmxn6Oe2EA0pHMkkykFafpu4z/9Oijj2LNmjUabadPn8bIkSMBAL169ULHjh2xefNmzJ49G9988w18fX3Rr18/jeeEhISI35uYmCAoKAixsbEajwkKCrpnHUVFRcjIyEBwcPAdx+EwGBHR/cXFVWDatFT88otCbDMyAl5/3QkffOAOZ2dTPVbXPDAA6YiblVuzeE1LS0u0bt1aoy01NVXj59deew2rV6/G7NmzsXHjRowdO7ZeO/9aWlpq/RwiIrq3wsIafPBBJj7/PFtjp/b+/a2wYoUXunblUFddMQDpiLZDUU3ZyJEjMWvWLKxcuRIxMTEIDw+/4zGnTp0Se4Vqampw/vx5TJ48uc6vYWtrC3d3d5w+ffqO4/To0UM3b4SIqIUQBAGbNuXjnXfSkJNTm3x8fMzw2WeeeOklu3r9R9WQMQDRHezt7fHiiy9i5syZePLJJ+Hl5XXHY1avXo2AgAC0b98ey5YtQ0FBAV599VWtXmfq1KlYtGgRAgIC0K5dOyxdurTB1yIiImpu4uIq8MYbyfj999oru2QyCWbPdsPMma6wsOA8n/rgWaO7GjduHKqqqu4ZahYtWoRFixaha9euOH78OH766Sc4OTlp9Rpvv/02Ro0ahfDwcISEhMDa2hovvPCCLsonImr2KitVWLAgHV27xmqEn5deskNcXAfMn+/O8PMAJAJnnN5BoVDA1tYWRUVFsLGx0bivoqICCQkJkMvlkMla7noKW7duxfTp05Geng4zMzN9l3MHQ/lzICLDdPhwMd58Mxnx8bVXd8nlZlizxgdhYTb3eaZhu9/n979xCIw0lJWVISMjA4sWLcIbb7zRJMMPEVFLlZ5ehbffTsOOHQVim7ExMGOGK+bNY4+PLvFMkoZPPvkE7dq1g5ubG+bMmaPvcoiIDEJNjYBly7LQrl2MRvh56CFLXLjQDosWeTL86BjPJmlYsGABqqurER0dzX27iIgawYkTJQgMjENERJq4W7ujozHWr/fBn3+2QZcuvLS9IXAIjIiISA/y82swe3Ya1q+v3UZIIgFee80RkZGecHTLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -938,12 +942,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABhQAAAHqCAYAAADs06STAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZzV1N0/8E+Su80MDAgCA8qmVnBjUR4RhRYUHXGpVOrCowU3fGqlVahSsS2LWqlWBW1RRFHQVlHr/qPigqLYghSQVttKEVEQmRFQGGZg7pb8/sC5knPzPZfcyTAz3M/79coLJslJTnJzzze5J+ccw3EcB0RERERERERERERERBpmY2eAiIiIiIiIiIiIiIiaPlYoEBERERERERERERFRTqxQICIiIiIiIiIiIiKinFihQEREREREREREREREObFCgYiIiIiIiIiIiIiIcmKFAhERERERERERERER5cQKBSIiIiIiIiIiIiIiyokVCkRERERERERERERElBMrFIiIiIiIiIiIiIiIKCdWKNB+sXbtWpxxxhlo1aoVDMPACy+80NhZIiKiZuB3v/sdDjvsMFiWhT59+gAAunXrhssuuyxn2rlz58IwDHz66acNmkciIiIiIiKiQsEKBcpS9wNM3RQKhXDIIYfgsssuw6ZNm/La5ujRo/HBBx/gN7/5DR5//HH069cv4FwTEVG+6sr9FStWNHZWXF577TVMmDABp5xyCh599FHcfvvtjZ0lIiIK2Lp16/B///d/OOywwxCLxVBaWopTTjkF9957L3bv3t3Y2SMiIiIiRaixM0BN1y233ILu3bujtrYWy5Ytw9y5c/Huu+/iww8/RCwW2+ft7N69G0uXLsUvf/lLjB07tgFzTEREB5I333wTpmlizpw5iEQimflr1qyBafKdCCKi5m7BggW44IILEI1GMWrUKBx77LFIJBJ49913ceONN+Jf//oXZs+e3djZJCIiIqK9sEKBRMOGDcu0JLjqqqtw8MEH44477sBLL72ECy+8cJ+3s2XLFgBA69atGyKbRER0gPryyy9RVFTkqkwAgGg02kg5IiKioKxfvx4XX3wxunbtijfffBMdO3bMLLv22mvx8ccfY8GCBfXah+M4qK2tRVFRUday2tpaRCIRVlATERER+cS7J9pngwYNArCnWXKdjz76CD/84Q/Rpk0bxGIx9OvXDy+99FJm+ZQpU9C1a1cAwI033gjDMNCtW7f9mm8iIqq/999/H8OGDUNpaSlatGiB0047DcuWLcss3759OyzLwn333ZeZt3XrVpimibZt28JxnMz8a665BmVlZdr9GYaBRx99FDU1NZku+ObOnQvAewyFf/3rXzj11FNRVFSEQw89FLfddhts267/gRMRUYO48847UV1djTlz5rgqE+occcQRuO666wAAqVQKt956Kw4//HBEo1F069YNN998M+LxuCtNt27dcM455+DVV19Fv379UFRUhAcffBCLFy+GYRiYP38+fvWrX+GQQw5BcXExqqqq9suxEhERER1I2EKB9lndoJYHHXQQgD0/3pxyyik45JBDcNNNN6GkpARPP/00hg8fjmeffRY/+MEPcP7556N169YYN24cRo4cibPOOgstWrRoxKMgIiK//vWvf2HQoEEoLS3FhAkTEA6H8eCDD2Lw4MF4++230b9/f7Ru3RrHHnss3nnnHfzsZz8DALz77rswDANfffUV/v3vf+OYY44BACxZsiRTSS15/PHHMXv2bCxfvhwPP/wwAODkk0/2XLeiogJDhgxBKpXKxKPZs2d7vpFKRERNw8svv4zDDjtMLNv3dtVVV2HevHn44Q9/iJ///Od47733MG3aNPznP//B888/71p3zZo1GDlyJP7v//4PY8aMQY8ePTLLbr31VkQiEdxwww2Ix+NZLeCIiIiIKDdWKJBox44d2Lp1K2pra/Hee+9h6tSpiEajOOeccwAA1113Hbp06YK///3vme4nfvKTn2DgwIH4xS9+gR/84Afo1asXSktLMW7cOBx//PG49NJLG/OQiIgoD7/61a+QTCbx7rvv4rDDDgMAjBo1Cj169MCECRPw9ttvA9jTku3Pf/5zJt2SJUswcOBAfPTRR1iyZAmOOeaYTOXC1Vdfrd3npZdeijfeeAOrVq3KGTvuuOMObNmyBe+99x5OPPFEAMDo0aPxne98pz6HTUREDaSqqgqbNm3Ceeedl3Pdf/zjH5g3bx6uuuoqPPTQQwD2PHO0b98ed911F9566y0MGTIks/7HH3+MhQsXory8PDNv8eLFAPZ0c7RixQpWOBMRERHVA7s8ItHQoUPRrl07dO7cGT/84Q9RUlKCl156CYceeii++uorvPnmm7jwwguxc+dObN26FVu3bsW2bdtQ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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABhQAAAHqCAYAAADs06STAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzde3wU1d0/8M/M7C0JJAgCAeXmDbwBCgVR8AGbGvFSKdQLj1ZExdaKVVJF8bFc1IpaK2hLRRQFbRWl9VJ/VLygKFqQitKqLRQsFUQSAYWQQPY28/sDszJn53uW3UxIwn7evOb1YmfmzJyZnT3fOTkz5xiO4zggIiIiIiIiIiIiIiLSMJs6A0RERERERERERERE1PyxQYGIiIiIiIiIiIiIiDJigwIREREREREREREREWXEBgUiIiIiIiIiIiIiIsqIDQpERERERERERERERJQRGxSIiIiIiIiIiIiIiCgjNigQEREREREREREREVFGbFAgIiIiIiIiIiIiIqKM2KBAREREREREREREREQZsUGBDoh169bhzDPPRElJCQzDwAsvvNDUWSIiohbgV7/6FY444ghYloW+ffsCALp3747LL788Y9p58+bBMAz897//bdQ8EhEREREREeULNihQmvo/wNRPgUAAhx12GC6//HJs3rw5p22OGTMGH330EX75y1/iySefRP/+/X3ONRER5aq+3H///febOisur776KiZOnIjTTjsNjz/+OO66666mzhIREfns008/xY9//GMcccQRiEQiKC4uxmmnnYYHHngAe/bsaersEREREZEi0NQZoObr9ttvR48ePVBXV4cVK1Zg3rx5eOedd/Dxxx8jEons93b27NmD5cuX4//+7/8wfvz4RswxEREdTN544w2Ypom5c+ciFAql5q9duxamyWciiIhaukWLFuGCCy5AOBzGZZddhhNOOAGxWAzvvPMObrrpJnzyySeYM2dOU2eTiIiIiPbBBgUSDR8+PPUmwVVXXYVDDz0U99xzD/785z/jwgsv3O/tbN26FQDQpk2bxsgmEREdpL788ksUFBS4GhMAIBwON1GOiIjILxs2bMDFF1+Mbt264Y033kCnTp1Sy6699lqsX78eixYtatA+HMdBXV0dCgoK0pbV1dUhFAqxgZqIiIgoS7x7ov02ZMgQAHtfS663Zs0a/PCHP0Tbtm0RiUTQv39//PnPf04tnzp1Krp16wYAuOmmm2AYBrp3735A801ERA334YcfYvjw4SguLkarVq3w3e9+FytWrEgt37FjByzLwoMPPpiat23bNpimiXbt2sFxnNT8a665BqWlpdr9GYaBxx9/HLW1taku+ObNmwfAewyFTz75BGeccQYKCgpw+OGH484774Rt2w0/cCIiahT33nsvampqMHfuXFdjQr2jjjoK119/PQAgkUjgjjvuwJFHHolwOIzu3bvj1ltvRTQadaXp3r07zj33XLzyyivo378/CgoK8PDDD2Pp0qUwDAMLFizAbbfdhsMOOwyFhYWorq4+IMdKREREdDDhGwq03+oHtTzkkEMA7P3jzWmnnYbDDjsMt9xyC4qKivDss89ixIgR+NOf/oQf/OAHGDlyJNq0aYMJEyZg9OjROPvss9GqVasmPAoiIsrWJ598giFDhqC4uBgTJ05EMBjEww8/jKFDh+Ktt97CwIED0aZNG5xwwgl4++238bOf/QwA8M4778AwDHz11Vf45z//ieOPPx4AsGzZslQjteTJJ5/EnDlzsHLlSjz66KMAgFNPPdVz3crKSgwbNgyJRCIVj+bMmeP5RCoRETUPL730Eo444gixbN/XVVddhfnz5+OHP/whfv7zn+O9997D9OnT8a9//QvPP/+8a921a9di9OjR+PGPf4xx48ahZ8+eqWV33HEHQqEQbrzxRkSj0bQ34IiIiIgoMzYokGjnzp3Ytm0b6urq8N5772HatGkIh8M499xzAQDXX389unbtir/97W+p7id++tOfYvDgwbj55pvxgx/8AL1790ZxcTEmTJiAk08+GZdeemlTHhIREeXgtttuQzwexzvvvIMjjjgCAHDZZZehZ8+emDhxIt566y0Ae99k++Mf/5hKt2zZMgwePBhr1qzBsmXLcPzxx6caF66++mrtPi+99FK8/vrr+OCDDzLGjnvuuQdbt27Fe++9hwEDBgAAxowZg6OPProhh01ERI2kuroamzdvxvnnn59x3b///e+YP38+rrrqKjzyyCMA9tY5OnTogPvuuw9vvvkmhg0bllp//fr1WLx4McrLy1Pzli5dCmBvN0fvv/8+G5yJiIiIGoBdHpGorKwM7du3R5cuXfDDH/4QRUVF+POf/4zDDz8cX331Fd544w1ceOGF2LVrF7Zt24Zt27Zh+/btKC8vx7p167B58+amPgQiImqgZDKJV199FSNGjEg1JgBAp06d8L//+7945513Ul1GDBkyBFVVVVi7di2AvQ0Kp59+OoYMGYJly5YB2PvWguM4Gd9QyMZf/vIXnHLKKanGBABo3749LrnkEt/2QURE/qmPG61bt8647l/+8hcAQEVFhWv+z3/+cwBIG2ehR48ersaEfY0ZM4aNCUREREQNxAYFEs2aNQuvvfYa/vjHP+Lss8/Gtm3bUm8irF+/Ho7j4Be/+AXat2/vmqZMmQJg72CaRETUsm3duhW7d+92dRlR79hjj4Vt29i0aROAb8faWbZsGWpra/Hhhx9iyJAhOP3001MNCsuWLUNxcTH69OkDAKipqUFlZWVq2rp1a9Z5/OyzzzzfRvDKMxERNb3i4mIAwK5duzKu+9lnn8E0TRx11FGu+aWlpWjTpg0+++wz1/wePXqI29ItIyIiIqL9wy6PSDRgwAD0798fADBixAgMHjwY//u//4u1a9emBrq88cYbxSeA1Jt+IiI6uHXu3Bk9evTA22+/je7du8NxHAwaNAjt27fH9ddfj88++wzLli3DqaeeCtPc+0zDfffdh2nTpqW20a1bt9SYPUREdHAqLi5G586d8fHHH+93GsMw9ms93RsIfDuBiIiIqOHYoED7xbIsTJ8+HcOGDcNvf/tbXHHFFQCAYDCIsrKyJs4dERE1lvbt26OwsDDVjdG+1qxZA9M00aVLl9S8IUOG4O2330aPHj3Qt29ftG7dGn369EFJSQkWL16MDz74wNWAcNlll2Hw4MGpz7n8sadbt25Yt25d2nyvPBMRUfNw7rnnYs6cOVi+fDkGDRokrtetWzfYto1169bh2GOPTc2vqqrCjh070K1btwORXSIiIiL6Brs8ov02dOhQDBgwADNnzkRxcTGGDh2Khx9+GFu2bElbN5cuK4iIqPmxLAtnnnkmXnzxRdebA1VVVXjqqacwePDgVNcVwN4Ghf/+97945plnUl0gmaaJU089Fffffz/i8bhr/IQjjjgCZWVlqem0007LOo9nn302VqxYgZUrV6bmbd26FX/4wx/S1t2yZQvWrFmDeDye9X6IiMg/EydORFFREa666ipUVVWlLf/000/xwAMP4OyzzwYAzJw507X8/vvvBwCcc845OeeBMYGIiIgoe3xDgbJy00034YILLsC8efMwa9YsDB48GCeeeCLGjRuHI444AlVVVVi+fDk+//xz/P3vf2/q7BIRURYee+wxLF68OG3+1KlT8dprr2Hw4MH46U9/ikAggIcffhjRaBT33nuva936xoK1a9firrvuSs0//fTT8fLLLyMcDuM73/mOr/meOHEinnzySZx11lm4/vrrUVRUhDlz5qBbt274xz/+4Vp30qRJmD9/PjZs2IDu3bv7mg8iItp/Rx55JJ566ilcdNFFOPbYY3HZZZfhhBNOQCwWw1//+lcsXLgQl19+Oa6//nqMGTMGc+bMwY4dO/A///M/WLlyJebPn48RI0Zg2LBhOeeBMYGIiIgoe2xQoKyMHDkSRx55JO677z6MGzcO77//PqZNm4Z58+Zh+/bt6NChA0466SRMnjy5qbNKRERZeuihhzznX3755Vi2bBkmTZqE6dOnw7ZtDBw4EL///e8xcOBA17o9e/ZEhw4d8OWXX7q6MqpvaBgwYADC4bCv+e7UqRPefPNNXHfddbj77rvRrl07/OQnP0Hnzp1x5ZVX+rovIiLyz/e//3384x//wK9+9Su8+OKLeOihhxAOh9G7d2/8+te/xrhx4wAAjz76KI444gjMmzcPzz//PEpLSzFp0iRMmTKliY+AiIiIKP8YjuM4TZ0JIiIiIiIiIiIiIiJq3jiGAhERERERERERERERZcQGBSIiIiIiIiIiIiIiyogNCkRERERERERERERElBEbFIiIiIiIiIiIiIiIKCM2KBARERERERERERERUUZsUCAiIiIiIiIiIiIioowCTZ0BlW3b+OKLL9C6dWsYhtHU2SE6qDiOg127dqFz584wzdzaE+vq6hCLxXzNVygUQiQS8XWblL8YR4gaB2MI5QPGEKLG4UcMARhHiIgod4wh/ml2DQpffPEFunTp0tTZIDqobdq0CYcffnjW6erq6tCjx2GorPzK1/yUlpZiw4YNeVkIk/8YR4gaF2MIHcwYQ4gaV64xBGAcISKi3NXV1aFHt2JUfhn3dbv5GkOaXYNC69atAQD/+P4P0ToYTFte1CXpndCWt+kkhCTCfF2a+G75SaXYHu/TWVsbFtNU13kv+0qYDwBfx9PPS72dccs7D5pjTTrexxQ0HTFNK+HKKY3ILX3di3d5zu90+E4xTcHRIc/51uFtxDRo00peFpbPncgWLq6kcC0CgMe1q92WZntO5ddikk/+4P3d3fJ37y8o4cSwYtec1O8sW7FYDJWVX+G/nz2L4uLCnLahqq7eje7dLkQsFsu7ApgaR/31veS0sSgKpJchXY6Qf1MSMY4k5ZiQjHk/fZeIy0/lxaLev914wrtsB4BYwjtNLCnvJ65Z5iD7J3Itw7tsC1lymRcJeZ/UwkhUTtPLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1600x500 with 8 Axes>"
|
||||
]
|
||||
@@ -1017,6 +1021,13 @@
|
||||
"* Use the external github code to generate tougher test data, and run your trained NN on these cases. You'll see that a reduced training error not always directly correlates with an improved test performance.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
Reference in new issue
Block a user