Showing preview only (526K chars total). Download the full file or copy to clipboard to get everything.
Repository: MagNet-DL/magnet
Branch: master
Commit: bff6748803ac
Files: 69
Total size: 502.4 KB
Directory structure:
gitextract_kpew33sp/
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── Tutorials/
│ └── MNIST-Quickstart/
│ ├── MNIST-Quickstart.ipynb
│ └── mnist_quickstart.py
├── arghandle/
│ ├── README.md
│ ├── __init__.py
│ ├── core.py
│ └── handlers.py
├── docs/
│ ├── Makefile
│ ├── make.bat
│ ├── requirements.txt
│ └── source/
│ ├── _static/
│ │ └── css/
│ │ └── magnet-theme.css
│ ├── _templates/
│ │ └── footer.html
│ ├── conf.py
│ ├── data.rst
│ ├── debug.rst
│ ├── index.rst
│ ├── magnet.rst
│ ├── nodes.rst
│ ├── training.rst
│ └── utils.rst
├── environment.yml
├── magnet/
│ ├── __init__.py
│ ├── _autograd.py
│ ├── data/
│ │ ├── __init__.py
│ │ ├── core.py
│ │ ├── data.py
│ │ ├── dataloader.py
│ │ ├── sampler.py
│ │ └── transforms.py
│ ├── debug.py
│ ├── nodes/
│ │ ├── __init__.py
│ │ ├── core.py
│ │ ├── functional/
│ │ │ ├── __init__.py
│ │ │ ├── activations.py
│ │ │ ├── functional.py
│ │ │ ├── losses.py
│ │ │ └── metrics.py
│ │ └── nodes.py
│ ├── training/
│ │ ├── __init__.py
│ │ ├── callbacks.py
│ │ ├── history.py
│ │ ├── train.py
│ │ └── utils.py
│ └── utils/
│ ├── __arghandle__/
│ │ ├── __init__.py
│ │ └── images.py
│ ├── __init__.py
│ ├── _node.py
│ ├── images.py
│ ├── misc.py
│ ├── plot.py
│ ├── statistical.py
│ └── varseq.py
├── readthedocs.yml
├── setup.py
└── tests/
├── data/
│ └── test_dataloader.py
├── nodes/
│ ├── test_core.py
│ └── test_nodes.py
├── test_debug.py
├── training/
│ ├── test_callbacks.py
│ ├── test_history.py
│ └── test_train.py
└── utils/
├── test__node.py
├── test_images.py
├── test_plot.py
├── test_statistical.py
└── test_varseq.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Created by https://www.gitignore.io/api/python,pycharm+all,jupyternotebook
**/checkpoints/
### JupyterNotebook ###
.ipynb_checkpoints
*/.ipynb_checkpoints/*
# Remove previous ipynb_checkpoints
# git rm -r .ipynb_checkpoints/
#
### PyCharm+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries
# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
# Gradle:
.idea/**/gradle.xml
.idea/**/libraries
# CMake
cmake-build-debug/
# Mongo Explorer plugin:
.idea/**/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Ruby plugin and RubyMine
/.rakeTasks
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### PyCharm+all Patch ###
# Ignores the whole idea folder
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
.idea/
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
/__init__.py
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
test_todo.py
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
test*.ipynb
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule.*
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
# End of https://www.gitignore.io/api/python,pycharm+all,jupyternotebook
================================================
FILE: .travis.yml
================================================
language: python
dist: xenial
python:
- "3.6"
install:
- python setup.py install
- pip install codecov
before_script:
- export PYTHONPATH=$PYTHONPATH:$(pwd)
script:
- pytest tests/ --cov=magnet
after_success:
- codecov
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 Vaisakh
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# MagNet: Deep Learning Projects that Build Themselves
<div align="center">
<img src="docs/source/_static/img/logo-full.png" alt="MagNet Logo"/>
</div>
<br>
[](https://github.com/svaisakh/magnet/blob/master/LICENSE)
[](https://travis-ci.org/MagNet-DL/magnet)
[](https://magnet-dl.readthedocs.io/en/latest/?badge=latest)

[](https://github.com/svaisakh/magnet/releases)
[](https://gitter.im/MagNet-DL/Lobby/?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://github.com/svaisakh/magnet/pulls)
[](https://codecov.io/gh/MagNet-DL/magnet)
[](https://www.codacy.com/app/svaisakh/magnet?utm_source=github.com&utm_medium=referral&utm_content=MagNet-DL/magnet&utm_campaign=Badge_Grade)
[](https://www.openhub.net/p/magnet)
MagNet is a high-level Deep Learning API, wrapped around PyTorch.
It was developed with the aim of reducing boilerplate code and writing Deep Learning architectures with more grace.
You should take a look at it if you need something that is:
- **Intelligent.** MagNet's ``Node``s are _self-aware_. Intelligent.
They attach to each other like magnets (hence the name).
This enables you to build complex architectures easily.
- **Simple.** MagNet's API enables a simplistic workflow.
Get the data. Define the model. Train. Debug. Test. Deploy.
- **Extensible.** Written on top of the awesome PyTorch library,
MagNet can also mix with lower-level details.
- **Ready.** The ``Trainer`` can accommodate **any training logic**, however complex.
This means that you can do almost any experiment / research with
all the features that MagNet has to offer.
<hr>
# Getting started: 30 seconds to MagNetize
The core idea of MagNet is the ``Node``.
Nodes are PyTorch modules that can change their properties dynamically based on the computational graph.
This way, they attach to each other... like magnets!
Here, we define a simple 3-layer CNN.
Note that you only need to specify the bare essentials.
No need to specify the strides, paddings, input sizes, or even flatten the output before feeding it to the final layer.
```python
model = nn.Sequential(mn.Conv(32), *mn.Conv() * 2, mn.Linear(10, act=None))
summarize(model, x=torch.randn(1, 1, 28, 28))
"""
+----------+------------+----------------------+
| Node | Shape | Trainable Parameters |
+----------+------------+----------------------+
| input | 1, 28, 28 | 0 |
+----------+------------+----------------------+
| Conv | 32, 14, 14 | 320 |
+----------+------------+----------------------+
| Conv | 64, 7, 7 | 18,496 |
+----------+------------+----------------------+
| Conv | 128, 4, 4 | 73,856 |
+----------+------------+----------------------+
| Linear | 10 | 20,490 |
+----------+------------+----------------------+
Total Trainable Parameters: 113,162
"""
```
Now, we'll get the dataset in a ``Data`` container.
``Data`` is a class that abstracts away the different sets (training, validation, test) and provides easy access to loaders.
```python
data = Data.get('mnist')
```
Next, we'll create a ``Trainer``.
MagNet's ``Trainer`` class abstracts away the training process and allows you to add features through ``callbacks``.
You can _implement your own training logic_.
Here, we'll just use the built-in ``SupervisedTrainer``.
```python
trainer = SupervisedTrainer(model)
# Tracks the loss, metrics and adds a nice progress-bar
monitor_callback = callbacks.Monitor()
# Train the model for one epoch
trainer.train(data(batch_size=64, shuffle=True), callbacks=[monitor_callback])
```
See the progress
```python
monitor_callback
```
<div align="center">
<img src="assets/monitor-plot.png" alt="Monitor Plot" width="600"/>
</div>
For a more thorough introduction, check out:
[Quickstart - Training an AI to Recognize Handwritten Digits](Tutorials/MNIST-Quickstart/MNIST-Quickstart.ipynb)
# Installation
Clone the MagNet repository by running
``git clone https://github.com/svaisakh/magnet.git``
Create the conda environment that has all the needed packages and dependencies.
``
cd magnet && conda env update
``
Add the directory to the ```$PYTHONPATH``` variable by adding the following line to your ```.bashrc```
``export PYTHONPATH=$PYTHONPATH:~/magnet``
Point to a directory to store datasets by default.
``export MAGNET_DATAPATH="<PATH_TO_DIRECTORY>"``
Update by running
``source ~/.bashrc``
Anytime you use MagNet, activate the conda environment
``conda activate magnet``
<hr>
# Nodes - Models that build themselves!
Nodes are PyTorch modules that are _self-aware_!
Nodes can react to what's going on and dynamically change based on the input.
You don't have to worry about specifying the dimensionality of the input,
reshaping or having to work out whether to use Conv1D, Conv2D or Conv3D.
Here's a simple Deep Neural Network with two hidden layers:
```python
dnn = nn.Sequential(mn.Linear(50), mn.Linear(10, act=None))
```
You don't need to specify anything except the bare essentials.
```python
# Intelligent reshaping between nodes
conv = mn.Conv(32)
linear = mn.Linear(10)
x = torch.randn(1, 1, 28, 28)
y = conv(x)
print(y.shape) # Output: torch.Size([1, 32, 14, 14])
z = linear(y)
print(z.shape) # Output: torch.Size([1, 10])
# Din't need to flatten input to Linear layer
```
MagNet's Nodes are built just in time, according to the computational graph.
## Witty Features
Create multiple copies of the node
```python
mn.Linear(10) * 4
```
Create multiple copies with different hidden sizes
```python
mn.Linear() * (50, 30, 10)
mn.Conv() * (50, 30, 10)
```
Built-in activation functions and batch normalization
```python
model = nn.Sequential(mn.Conv(32), mn.Conv(64, act='tanh', bn=True), mn.Conv(128, act='lrelu'),
mn.Conv(10, act=None))
```
## Examples
DCGAN:
```python
conv = lambda *args, **kwargs: mn.Conv(*args, k=5, p='same', act='lrelu', **kwargs)
discriminator = nn.Sequential(conv(32), *conv(bn=True) * (64, 128, 256), mn.Linear(act='sigmoid'))
conv = lambda *args, p='same', bn=True, **kwargs: mn.Conv(*args, k=5, p=p, bn=bn, **kwargs)
generator = nn.Sequential(mn.Linear((256, 7, 7)), *conv(p='double') * 2, conv(32),
conv(1, bn=False, act='tanh'))
```
State of the art, 34-layer ResNet:
```python
class ResBlock(mn.Node):
def __init__(self, c=None, p='same'):
super().__init__(c)
def build(self, x):
# Tell the ResBlock how it should build itself
c = self._args['c']
p = 'half' if c is None and self._args['p'] != 'same' else 'same'
self.convs = nn.Sequential(mn.Conv(c, p=p), mn.Conv(c, p='same', act=None))
super().build(x)
def forward(self, x):
res = self.convs(x)
# If downsampling, pad using zeros
if x.shape[-1] != res.shape[-1]:
x = F.avg_pool2d(x, 2, 2, x.shape[2] % 2)
x = torch.cat([x, torch.zeros(x.shape[0], res.shape[1] - x.shape[1],
x.shape[2], x.shape[3])], dim=1)
return F.relu(res + x)
res_layer = lambda n, c=None: nn.Sequential(ResBlock(c, p='half'),
*[ResBlock(c) for _ in range(n - 1)])
resnet34 = nn.Sequential(mn.Conv(64, k=7), nn.MaxPool2d(3, 2, 1),
res_layer(3, 64), res_layer(4), res_layer(6), res_layer(3),
nn.AvgPool2d(7), mn.Linear(1000, act=None)).eval()
```
<hr>
# Painless Training
MagNet's helps you train your models simply, effortlessly.
```python
# Train a classifier
trainer = SupervisedTrainer(model)
trainer.train(data(batch_size=16, shuffle=True))
```
##### Feature Filled Callbacks
Additional bells and whistles can be added using _callbacks_.
```python
# This callback monitors the training and logs the losses and metrics.
# Also displays a nice progress bar
monitor = callbacks.Monitor()
# This callback tracks the metrics on a validation set
validate = callbacks.Validate(data(batch_size=16, mode='val'),
SupervisedTrainer.validate)
# This callback saves and loads all models, optimizers, schedulers etc. periodically
checkpoint = callbacks.Checkpoint(save_path)
# This is some goofy callback defined by you. I don't know what it does exactly
i_am_kewl = MyGeniusCallback()
# Train again
trainer.train(data(batch_size=16, shuffle=True),
callbacks=[validate, monitor, checkpoint, i_am_kewl])
```
You don't need to write training loops, logging or serialization code.
## Bring your own logic
MagNet is a general purpose framework.
Which means you can **use any training logic** and plug it right into the trainer.
```python
class MyTrainer(Trainer):
def optimize(self):
# Override this method with my own crazy logic
generator, discriminator = self.models
optimizer_generator, optimizer_discriminator = self.optimizers
x = next(self.dataloader)
z = torch.randn(x.shape[0], 32)
x_fake = generator(z)
p_x = discriminator(x)
loss_x = some_loss_fn(p_x)
loss_x.backward()
optimizer_discriminator(loss_x)
p_x_fake = discriminator(x_fake)
# Some wierd stuff here
# ...
p_x_delta_2_nice_place = discriminator(generator(x_really_real))
# ...
# Some out this world shit here
# ...
and_that_is_how_you_invest_in_bitcoin = F.cross_entropy(z_strawberry_hat)
# ...
return massive_blood_loss
"""
```
And then, you can use the trainer like always in all it's might and glory.
```python
trainer = MyTrainer(models=[generator, discriminator],
optimizers=[nn.Adam(generator.parameters()),
nn.Adam(discriminator.parameters())])
trainer.train(data(batch_size=64, shuffle=True), epochs=13.8e9, callbacks=callbacks)
```
<hr>
# Debugging Tools
#### Catch breaks in computational graph
```python
# Suppose this is the loss function
def reconstruction_loss(x_gen, y):
return torch.tensor([F.cross_entropy(input_, target)
for input_, target in zip(x_gen, y)]).mean()
# The check_flow() method can trace any breaks in gradient flow.
mdb.check_flow(trainer, data)
# Raises RuntimeError with a list of broken parameteres
# Aha! The loss function had created a new Tensor
# which did not have the gradient history
def reconstruction_loss(x_gen, y):
return torch.stack([F.cross_entropy(input_, target)
for input_, target in zip(x_gen, y)]).mean()
mdb.check_flow(trainer, data)
# No breaks. No errors. Safe to move on.
```
#### Overfit a small sample
If you can't overfit on a small sample, the model probably cannot model the complexity of the data.
```python
model = mn.Linear(10)
# ...
# The overfit() function trains the model on various sample sizes and batch sizes.
mdb.overfit(trainer, data, batch_size=64)
```
<div align="center">
<img src="docs/source/_static/img/overfit-fail.png" alt="Failed Overfitting" width="600"/>
Failed Overfitting
</div>
```python
# Oops! Looks like there was something wrong.
# Loss does not considerable decrease for samples sizes >= 4.
# Of course, the activation was 'relu'.
model = mn.Linear(10, act=None)
# ...
mdb.overfit(trainer, data, batch_size=64)
```
<div align="center">
<img src="docs/source/_static/img/overfit-pass.png" alt="Good Overfitting" width="600"/>
Good Overfitting
</div>
#### Watch the model evolve
Sometimes, it is helpful to understand exactly how the model evolves over time.
When does the model learn to attend, to decode, to summarize, to track, to colorize?
The ``Babysitter`` callback constantly monitors the model and logs the mean relative gradients for each parameter. This will tell you how the model is learning as training progresses.
```python
# Just add the callback into the mix
trainer.train(dataloader, epochs, callbacks=[*my_existing_callbacks, Babysitter()])
```
<hr>
# Automatic Acceleration
**MagNet's codebase is device-agnostic.**
All data, models, tensors created by MagNet are automatically run on the faster hardware.
No need to shuttle between ``.to(device)`` and ``.cpu()`` calls.
```python
# When run on CPU
import magnet as mag
# Prints: Running your code on a CPU
"""
Your code here
"""
```
```python
# When run on GPU
import magnet as mag
# Prints: Accelerating your code on an NVIDIA 1080Ti GPU.
"""
Same code here
"""
```
<hr>
## Contributors Needed
I'm actively looking for contributors who can help take this forward.
Lots of Node building, Data Loading, Trainer Watching and Bug Squashing to be done.
Join us on Gitter. [](https://gitter.im/MagNet-DL/Lobby/?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
<div align="center">
Handcrafted with ❤ by Vaisakh
</div>
<br>
<hr>
<sub>Created my free logo at LogoMakr.com</sub>
================================================
FILE: Tutorials/MNIST-Quickstart/MNIST-Quickstart.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training an AI to Recognize Handwritten Digits"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accelerating your code on a shiney new Tesla P100-PCIE-16GB .\n"
]
}
],
"source": [
"import magnet.nodes as mn\n",
"\n",
"from magnet.data import Data\n",
"from magnet.training import SupervisedTrainer, callbacks\n",
"from magnet.utils import summarize"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from mnist_quickstart import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the MNIST Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"MagNet's Data class is an abstraction over the training sets and uses MagNet's DataLoaders, Sampler and collate functions."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Load the MNIST Dataset using the simple get() method\n",
"data = Data.get('mnist')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is what the digits look like"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAIuCAYAAABzfTjcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XWAlNX3x/G3haJYKIKNooCCYqAiFioWJgZgoCB2gV8QxUABA8VuscFEEQu7FRRb7E6UEMQAFOv3h79zn/PsPjvM7k48z/J5/eP1zuzs3WVm9plzzz1ngX///fdfRERERFJuwXIvQERERCQfumgRERGRTNBFi4iIiGSCLlpEREQkE3TRIiIiIpmwcFU3/PLrb3z0yec0XHYZ6tVbpJRrEhERkfnU3Ll/MuOnmbRs3oyllmwQu63Ki5aPPvmcW+8cXfTFiYiIiFR0yP77sOnGbWJzVV60NGy4DABPjh3DzBk/FndlIiIiIsAyDZdnh107h+sQr8qLlnqL/LclNHPGj0ybOrl4qxMRERGpwK5DPCXiioiISCbookVEREQyQRctIiIikgm6aBEREZFM0EWLiIiIZIIuWkRERCQTdNEiIiIimVBlnRZJv4033jiMjzvuOAAOPvjgMDdixAgArrjiijD35ptvlmh1IiLpctlll4XxCSecAMB7770HwG677RZu+/rrr0u7MMmbIi0iIiKSCamLtCy00EJhvPTSS1d5P4ssLL744mGuRYsWABx77LFh7sILLwRg//33B+D3338Ptw0dOhSAQYMG1XbZJbXBBhsA8OSTT4a5pZZaCoB///03zHXv3h2APfbYI8wtt9xypVhiZmy//fYA3H777QBss8024baPP/64LGsqldNPPx2IP/8XXPC/zzEdOnQA4Pnnny/5uqQ0llxyyTBu0OC/pnS77rprmGvUqBEAF198cZj7448/SrS6wmratCkABx10UJj7559/AFhnnXUAaNmyZbitrkdamjdvDsAiruLs1ltvDcDVV18NRL+f6njggQcA6NatGwBz586t1TqTKNIiIiIimaCLFhEREcmEkm0PrbbaamFcr149ANq3bx/mttxySwCWWSbq6rjPPvtU63t89913AFx++eVhrnPnzgD8+uuvALzzzjvhtqyFvjfddFMARo8eDcS3z2xbyH5OiEJz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X1/R8vTTT6/y63wlQkt8+uyzz4qxxDrPjjzL/OG9994Doh47flvajrdOmzat9AvLk0+gHDlyZOy/UjjWq+7DDz8Mc+uss065lpM332PMjm0fcsgh1XoMf3zb/gbbtqptm0H0WkoDRVpEREQkEwoSaencuXPsv0l85+WHH34YgL/++ivMWbKtdSetq6wvkhV6qjiWwnr00UfDeL/99ivjSqrH90WxhHRfTEryZxHbG264IcxZIUr7hArx9yiZf3z99dcArLfeemVeSfW8/fbbYWxlM1599VUAzj777HCbdYT3x9+tO7cvGeKP2KeZIi0iIiKSCbpoERERkUxY4N+ksnfAN999z/mXXss9I69n2tRshI1ERCpaaqmlABg1alSYsyrD9913X5jr2bMnUDcS/0WyrNEKTdiv++Gc3OcoVltlpdhtirSIiIhIJpS1y7OISLFZH68uXbqEOUvE9ZVDLSFeCbki6aVIi4iIiGSCLlpEREQkE7Q9JCLzBdsmgqg+i6/TIiLpp0iLiIiIZIIuWkRERCQTdNEiIiIimaCLFhEREckEXbSIiIhIJuiiRURERDJBR55FROZzzZs3B+Cxxx4LcwsttBAAq6++elnWJJJEkRYRERHJBEVaRETmQ1dccUUYd+3aFYCGDRuGuYcffrjkaxKZF0VaREREJBN00SIiIiKZoO2h+dzTTz8dxgsssAAA2223XbmWU6V1110XgN122y3MHX744QC89tprALz99tuVvu7SSy8N47lz5xZziSKp1rhxYwDuu+8+ANq1axdu+/fffwF47733wlyvXr1KuDqR/CjSIiIiIpmQukjLIossEsbt27cH4NxzzwVgiy22KMua6qJLLrkEiH7HACNGjCjXchIdeeSRYTxs2DAAGjRoUOl+zZo1A6Bbt26VbrMoDMCzzz5b6CVKDfl/R0sC/f3338PcxhtvDMCSSy4JwIEHHhhue+655wCYNGlSXt9r8uTJADzwwANh7vXXX6/BqrPHjjIDXHjhhQBsttlmle43YMAAIP57mT59epFXVzoWRb7zzjvDXKdOnYAoivvdd9+VfmFSbYq0iIiISCbookVEREQyIXXbQ0svvXQYWzjfwrtNmjQJt9mcVM/QoUMBOOqoowD4888/w20+KTcN7rnnnjAeNGgQkLw9lMvo0aPD2LaPnnjiiQKsTmpj4MCBYdyvX79qfe3OO+9co+9pWyAAH3zwARDfLrDxV199VaPHTyNfd8W2Q5LY1khd3UKtX78+EE8xsPcSez7dcMMNpV+YVJsiLSIiIpIJqYu0JLEIiyIttWfHHC3h+aWXXgq3jRo1qixrqsqMGTPC+KyzzgKihFyAJZZYAoBvvvkGgNVWW63SYyyzzDJhvNNOOwGKtORifWbsk+n+++8fbjv66KMr3X/s2LEA9OzZs1rfZ++9987rfpYMOnHixLzu//HHH4dxixYtgOg5sOGGG4bbWrduDcA555wT5ux71IVIiyXg3nHHHWHOklGN/zfwScp10ezZswH49NNPw9zKK68MQKNGjcqyprTr27dvGNerVw+AddZZJ8z55Hjz0UcfAdCqVauirUuRFhEREcmETERaKn5CmJ9svfXWYXzaaacB0adfH4nIxX9atk+Yn3/+OVD9fIJyufbaa4H4Meg2bdoA8Msvv+T1GFdddVXhF5ZhHTt2BOKfuO25YrllVnSsKr5AWXVY1AuiqMAnn3xS6X72CfmHH36o0feB6Nj0u+++G+aSonJ77LEHEEWPsqx79+5A/Od85JFHgCifLd8j43WJfw/o0KEDEI8ezG+22WabMLa/DTbXuXPncFvS3+Ck94a1114biHLG7Dh5ISnSIiIiIpmgixYRERHJhExsD1kYarHFFivzSkpv+PDhYWyhNwu5+STaXE499dQwXm655YCob88777xTkHWWik+ctJ9rgw02yOtrLZlsfmTHOddbb70wt8kmm1R5/19//RWA22+/PcxZdWF/TNhXsa0O256sOC4G61eVtCX0xx9/hPH1119f1HUU2/jx48PYXhM+qfjEE08E5s9tIfPqq69WmuvSpQsAJ598cpirzXZkGqy44ophbK/XNddcs9L9fIkRO9hgW0FvvPFGuG2jjTbK6/suuOCCsccqBkVaREREJBMyEWkxbdu2DeNXXnmljCspHUtEhOpHnOzTlh1jBfjnn3+q9Rhpc++994axRZoef/xxIB5FSDJkyBAA9ttvvyKtLh0smnbeeeeFuUMPPRSIJ2/bJykrOAhRl985c+YA0XHyrPDRtMsvvxyAgw8+uMr7b7755mGc1CU8C/bcc08g3lPI3it8gcaaRsXqKoso2HPGErEBrrvuurKsqbYsud5HDVddddVqPYZF8n/88ccwt/zyywOw0korhbmb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pFyfnGtUUVjyZVuPvhp3XXHwwQeHsdVf8Ym2l112GRBVks4SRVpEREQkEzIRaREREZH8PPHEE2FslXB9R/MsRliMIi0iIiKSCbpoERERkUzQ9pCIiEgdYo1GARZeuG79mVekRURERDJBFy0iIiKSCbpoERERkUzQRYuIiIhkgi5aREREJBN00SIiIiKZoIsWERERyQRdtIiIiEgm1K2qMyL/b8011wTgvPPOC3OdO3cGYP311w9zH330UWkXJiIiNaZIi4iIiGSCLlpEREQkE7Q9JHVG+/btw/ixxx4DYNq0aWHuqquuAmDKlCmlXZikVvPmzcP42muvBeDAAw8Mcz/88EPJ11ROHTp0CGPrX7PgggtWuv35558v5bJEAkVaREREJBNSE2np3r07ADvuuGOY22CDDQBo0aJFpfu/8sorAOy+++5h7ueffy7mEjNriSWWCOPnnnsOgJVWWgmALbbYItz21VdflXJZBbPrrrsCcO+994Y5+9R82mmnhbnZs2eXdmFSpSWXXDKMGzRoAMRfv6X6t+rUqVMYb7311gAcdthhYc4Suf/666+SrKdcevToAcDxxx8f5v75559K97v44osBGDFiBBBFL6Hu/44kbsCAAQCcc845Ye6CCy4A4JRTTina91WkRURERDJBFy0iIiKSCWXZHlp++eUBuOGGG8KcbfPMnDkzzI0fPx6Iti18ktiWW24JwMsvvxzm1l133aKsN61siwegUaNGlW7/6aefANh2223D3MYbbwzAxx9/DMD06dOLucSiWmuttQAYNWoUEE8O7Nu3L5Ac4pby69+/fxhbmPmkk04Kc5dccklJ1vH6669XmjvzzDPD+M477wTgs88+K8l6Ssm2hCDanvc1jJLY7RdeeCEA999/f7jt66+/LvAKS2v11VcP4xNPPBGAY445JswtvPB/fy7vuuuuMHfAAQeUaHXp4Ld1bSvx33//DXN9+vQB4NNPPwXgxhtvLPgaFGkRERGRTChLpMWOozZt2jTMWQLPsGHDwtyMGTNiX9eyZcswfvXVV4H4kcWBAwcCMHjw4MIuuAxat24NwAknnBDm/CcBiP/sq622WqXHGDp0KBCPQC2wwAIATJo0CYB69eoVaMWlsdhii4WxRereffddALp06RJumx8jLA0bNgSga9euAJx66qnhNh+VM6effjoQrxpcTj7C8cUX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yQRdtIiIiEgmaHuoxKzqoO93Udd7X0j19ejRI4yPOeYYAMaPHx/mfAKuiFTme+5YXZJiVzFOo9VXX73cSygoRVpEREQkExRpEUkR67ZrvZMgqup7/fXXhznf8VxEKmvSpEm5lyBFoEiLiIiIZIIuWkRERCQTtD0kkiKvvvoqAKuuumqZVyIikj6KtIiIiEgm6KJFREREMkEXLSIiIpIJumgRERGRTNBFi4iIiGSCLlpEREQkE3TRIiIiIpmgixYRERHJhEwVl7vjjjvCuF27dgDsv//+YW7ChAklX5OIiIiUhiItIiIikgm6aBEREZFMyNT20Oqrrx7GTZs2BWDkyJFhrlWrVgD8+eefJV1XMe2zzz5hvNhiiwHQtm1bAPr06RNue/bZZwG48cYbw9yHH34IwJtvvln0dYqIiBSbIi0iIiKSCZmItFjHW4sweGuttVYYL7zwfz9O1iIt9evXB6BFixZhbsiQIQBsv/32YW7RRReNfd0///wTxttss03svwBffvklAM8880yYO/nkkwH45ZdfAPj7779r/wNISdjzBGCnnXYC4MwzzwxzG2ywAQD//vtvlY/Rq1evMP7pp58q3f7ZZ58B8N5779VusTWw1157hfHxxx8PwLbbbgvAAgssEG7L9fPdf//9Yfzoo48C8MQTTwCw3HLLhds++eQTAH777bfaLlukTlh33XWBKIK/4oorhtt22203AB544IEwN378+EqPMXz4cABmzpxZtHUq0iIiIiKZoIsWERERyYQF/q0i1vrNd99z/qXXcs/I65k2dXKp1xXTunVrACZOnFjpNh8O3nfffYH4tknarL/++gBstdVWYc5C/bvuumvJ1jFo0CAA7rvvvjBXji2BYltttdXC+OWXXwai3zek52e2rUHbvkuy+OKLh/F+++1XlHW8//77QPRasm2UYrJtoREjRoS5JZZYomCP/+mnnwLx39+PP/4IwNy5cyvd/3//+18YJ4XAReqiiy++GIDevXvX+DFsy/m0004D4LrrrqvR4zRaoQn7dT+ck/scxWqrrBS7TZEWERERyYRUJ+JaYm2uT5933nlnGKc5wmIswnL55Zfndf9vvvkmjPNJmvXJU3ZEOoklcE6bNi3MpSXqYJo3bx7Gv//+OxD/feTjmmuuCWP7VP3rr78WYHWF9eSTTwKw8sorl3UdVjbgtddeA+DW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WvnXkq+UXNGsWbOAeFVP629Viq60xWYRJR9RbdCgARB//7DE5JpEFOoiey3Y+4Yvp2D9uF544YVKX+crdVvvu1wVp0vBIvN25Np6kwF07NgRiHq0QRQZOvLII0u1xIJRpEVEREQyQRctIiIikglF2x6y5lOXXnopAF27ds3r63y1V2sLb5UF33nnnRqvZ8SIETX+2pry2z3PPPMMAM2aNavy/j5UZ/U0khJJV1ttNaDwtTTKUVegEHzVTzN69OgyrCQ/1lQtV62eo446KoynTJlS6faff/4ZiIelLQG9b9++AOy0007htupuFWbB4MGD87qfNTscO3ZsmPOh8izy23xWtdhvl1lS8SGHHBLmnn/++RKtLhusKehWW20FxOvWWJXcH3/8sdLX+ffJilv01oizFFq0aBHG9lpYcMH/4hC+mniuwxx77713pTnbUkxrDTRFWkRERCQTihZpsRb3uSIs/pPPRRddBMR7nczreGbaWVIjREcyLTHYVyZNYsml9t9Cs54q06dPD3M33XRTUb5XsVk1Su+NN94ow0ryY8+Bddddt8r7JCUAepYs7T9x+74n1XHLLbeE8Ysvvlijxygliy5ZNHderJ+S/RdgzJgxQFRWoSr2mrAj0laJG8pbObdVq1ZhbBEW31vL3n+zllRfSieffDIAiy22GBDvy2VRS4tqz4tF80aOHFnIJebkK1r70h8QP95s/PuDReAWXrjyJYC9NiZOnFiQdRaaIi0iIiKSCUWLtNjVmvXa+f7778Ntdvz35ptvLta3Tx37VGbFf/yVseU41Ma3334LQLdu3cLchx9+WOX9bZ/T8oayyHrFHH300UDd6EicL19YrTr8EV/7tx82bFiY++ijj2q3sBKwHCb7hFwTvqdXLr6EAMSL7p166qlAvBN7qfh/RzvS7fveKMIyb/aefMIJJwDRvydE+YXzKhFgzwf7m+YjccXWoUOHMPYFVQFOPPHEMN5ss82AeOHFpAiS5TydcsophVxmwSnSIiIiIpmgixYRERHJhKJtD1lfCwvhy3+sFfhzzz0X5qwXSNOmTcOcr25phg8fDiQnaX7xxRcATJgwoVBLTT1LUraQrK8CmWb22vDbo7YN4as515Y/5m9HIK3fCmS3Guz9998PxI+F29gf+03qv1JdX375JRCF3+1IKURbAhWTIEvBl3+wpNys/nuWm1V/th53EFVMTjOfbGtJ5pacvswyy4TbOnXqVOVj+ET0iy++GEh/vzZFWkRERCQTytrleX7mj0P7nhcmC1f65WafIOzY9sCBA8u5nLxZUavDDjsszFkCrPVMytegQYMqPa7xJQV8sam64tZbb600btu2bZirGOX1RQhzdbQ9/fTTw/i+++4DoqieRTQh3lW5nLLenVpqxjrZA+y4445AlIy9wgor5Pzaxx9/HIgn4ZcjobwmFGkRERGRTNBFi4iIiGSCtock8z7++GMgd4+NtLvwwgtj/5Wa8cnYFROzb7zxxoJ+r0I/nkhN2VbRiiuuWOaVFJ8iLSIiIpIJirRIZvXv37/cSxARkRJSpEVEREQyQRctIiIikgm6aBEREZFM0EWLiIiIZIIuWkRERCQTdNEiIiIimaCLFhEREckEXbSIiIhIJuiiRURERDIhUxVxhwwZEsbWPt63ZW/VqhUAv/32W2kXJiIiIkWnSIuIiIhkQqojLQsttBAAZ5xxBgB9+/YNtz322GMATJgwIcytueaaAEycOLFUSxSRlNtpp50AOOWUU8LcE088AcAbb7xRaU5E0kuRFhEREckEXbSIiIhIJqR6e6hbt24ADBw4EIChQ4eG20499dSyrElEsmW33XYDYOuttw5z22yzDQDPP/98mBs3bhwAs2bNKuHqymeXXXYJ44cffhiA77//PswdccQRALz++uthbtq0aSVanZTaggv+F8Owv7dnnnlmuG3AgAFA/G9wuSjSIiIiIpmQukjLpptuGsaXXnopAG+++SYAgwYNKsuaJN3atm0LwGuvvRbm/vnnnyrv7z9BnH322cVbmJSVRRIOOeSQKu/joy9LL700MP9EWjx7vTRp0iTMPfjggwA89NBDYW7vvfcu7cKkqJo2bRrGgwcPBuDAAw8E4u+hW2yxRUnXlYsiLSIiIpIJumgRERGRTEjd9tBRRx0VxssuuywAF110EQB//PFHWdYk6WbbPT6cme/2UKNGjQAYPXo0AC+88EIxlpgZq666KgB9+vQBYPPNNw+32fjll18Oc+3bty/h6uatWbNmYXzHHXcAsMQSS1R5/9tvvz2Mp06dWryFpcAyyywDwNVXXw3AVlttldfX+W1XqVsuvvjiMN5zzz1jt/35559h/Mgjj5RsTfOiSIuIiIhkQmoiLXYEsXv37mHu7rvvBtJxzCpNWrduDcSTo6655ppK91tggQUAePzxx8PcZZddBsCjjz5azCUWjU8cs5/LJw9W13HHHQfAJ598AtT9SEuXLl3CeLPNNgOSoym5fPfdd4VfWIH07t07jJdaaqkq7/f0008DUfIhwF9//VW8haXA+uuvD0SHHVZaaaVwW67IpP8dffDBBwA88MADxVhiTosttlgYW4TU+PdCe99be+21q/X4PrJw2223AfEj4H///Xe1Hi/NmjdvDkTPiSR2zBmS/76UiyItIiIikgmpibRY9MD6DQFMmjSpXMtJjf322y+M9913XyAqluU/efz777+VvtbmdthhhzBnV9annXYaADfffHOBV1xcCy8cPWWt15TEVcxLgeh5ZLfNi+WtWNkBgFGjRhVqiQU3bNgwALp27ZrX/f1rYn5hOYK5cnzm5brrrgOiyIw/Dl1st9xySxj7iGExnHPOOUB07BugV69eAEyfPr2o37tYGjduHMaWo7LGGmtUef+05jIp0iIiIiKZoIsWERERyYTUbA/tuuuuAPzwww9h7qabbirXcsrOqhL6I2nLL788ACNHjgTiCbb16tUD4Pzzzw9zFZPVIAoRrrLKKgVecWn4pMB8HH744WG88cYbA/Fj9XWRlQjwW4vmnnvuCeN777230u1p3gLKZYMNNgCi14hnWxlXXHFFSddUTpZwb4nmSazXTHXY+8fqq69es4XVwqKLLhrGViW9kGUwfGqCJSvvscceYa5du3YAjB07tmDfs5Ss4jPk3hYaP348AJ9++mnR11QTirSIiIhIJpQ10mKJYQAbbbQRADfeeGOY++ijj0q+prTo0aMHEP/keMoppwBw+eWXA/FPGRZpWWeddcLcMcccA8QT7+xT56+//lqEVRdWUhfaXCx5DqJOpZ4dgfWfMG1sxySzzCIs9onQR1UsYvfKK6+UfmFF0qpVqzBed911q7yfJXD+73//K/aSUsOS8HMdZfbsufLiiy+GOevLlNRvqHPnzgDcddddYe7HH3+s2WLzZNFniI4n+2PKteWT/O1IvC/A16FDByC7kZZ59Y2yCIsd+JgyZUrR11QTirSIiIhIJuiiRURERDKhrNtD/fr1C+MVVlgBSHe1zVJacsklK81ZxU4LiVq9FojCwb4XTFI9Bqv06OtvZEE+Ye6kLSEvV8g8qc5NFvh6Fbb9YTVW+vbtG2779ttvS7uwEjji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hmP77Fx55ZXD2Prrrw/AXnvtBcDChQvDuUsvvRSIR6SfffZZAB555JGc5yh39neoppGUJXnuueeAeAR4SRRpERERkUxIdaTF7gR+//33nHMXXXQRUF7bz/xd7v333w/EI0kmaZt3t27dAOjevXsYO+OMM4D43bjdYWbtdWvbti0Ae+65Zxjr27cvEEUWkvz888/heMGCBQWaXfEddNBBAFx99dVhzHK/pk2bBsDIkSPDObvL3nzzzcPYo48+CkS5LWnSpUsXAI4++mggigpBPFenJnzUYbPNNgNg7NixYcy/NlnkPyu22247AMaNGxfG7P1hn6f//e9/wzkrn9C6desw5qNbZu211wbggAMOyNe086Jhw4bh2ApnWlkMiEddKuNfP8uh8pG4H3/8EYAOHTqEMYvklmNui4/s5yPCYnkrL7zwQp2eR5EWERERyQRdtIiIiEgmpHp5qF27dkDy1l07t2jRoqLOqZAee+yxcGxLY2+++WYY22WXXYBou6YP31kS2Q033BDG7PzSSy8dxp544on8TroANtpoIyAenu7duzcQbYOHKEnuxhtvBOIVgo855hgAnn766TBmS2PlwJaFfBVPC4s/+OCDALRq1Sqc23vvvYH4Fk5bMrrkkksKO9k6GDFiRN6eyyqfArz66qsATJ8+PW/PXyq2dHrFFVeEsf322y/ncbYkfPLJJwPxpTHb7OAT/0844YRKnyNtRo0aFY5t2dgnVtvvxvjx48NY8+bNgShp/6yzzgrn7HPGLyvZxhC/PF+Oy0LGkmQ9vzU5aZnHztdkC3NNKdIiIiIimZDqSEt947cg2jbNN954I4z99NNPscf7q1mLMiRFUizhEuDwww/Py1zzxYoL+TulVVZZBYjubCBKKrWiYwBTp04FogTbTTbZJJyzSMs777xTiGmXxODBg8OxRVEsWgJRhMWst9564diKFPokVotilFMEqipTpkwJx/a7VvE1yworZwBR0qh//1uRSf/+sIjku+++m/N8a665JhAVrvQef/zxcHzOOefUZdp5t/HGGwNRdAWi5GPbLl8Z29592WWXATB8+PBwbrXVVgPg+uuvD2MWzfYRrayyKLyP1lcsFmefzVDYyElNKdIiIiIimaCLFhEREcmEVC8PWcJYfXHVVVeF41NPPRWIL+dYuH/QoEE5//aOO+7IGbM6DJaElkZWodIn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7V9i5xRpERERkUxQl2cRqRfGjx8fjq3zc1ZZOQiIqmArurJkvpP36NGjgagibjlserA+c1YSpBwp0iIiIiKZoIsWERERyQQtD4lI2SjnsLjna85I9X344YfhOKl5raSfIi0iIiKSCbpoERERkUzQRYuIiIhkgi5aREREJBN00SIiIiKZoIsWERERyQRdtIiIiEgm6KJFREREMkEXLSIiIpIJumgRERGRTNBFi4iIiGSCeg+J1CONGzcOx//85z8B2GOPPcLYzJkzAVhjjTWKOi+RUlt99dXD8TPPPAPAOuusE8a+/fZbAP7+97+HsXfffbdIsxOjSIuIiIhkQmoiLVtuuSUAm266aRg79dRTAVhzzTUB2GGHHcK5F154oYizk6w577zzAPjHP/4Rxuyu6NJLLw1j9957b3EnVmIbbLBBOO7VqxcAf/75Zxjzx2m1+eabAzBlypSCPP++++4bju1zxu6ypfy0b98egCeffDKMrbXWWgD88ccfYWyllVYCYMKECWGsQ4cOxZhiUbVq1QqAkSNHhjH7rPCGDBkCwNChQ4szsf9PkRYRERHJBF20iIiISCaUZHmoZcuWANx4441hbMcddwRg5ZVXznm8hawfeOCBMPbVV19V+vznnntuOH7ppZcAmDNnTh1mLIV20UUXhePx48cD8NZbb9XoOXyS6RlnnAHElzs6deoEwFFHHRXG6svy0DLL/O9X/cwzz6zycb/88ksxplNjO++8czgeO3YsAN98800Y22STTQD47bffav01+vbtC8Cdd94Zxh5++GEA9t9//1o/b9bZMj3AOeecA8CkSZOAbL8uO+20ExAt9zRt2jTnMS+//HI43nrrrQFYaqnyvNc/9thjgeh3rWfPnuGcXyYztjz0/fffh7FbbrmlkFMEFGkRERGRjChJpMW2jNX0Kt0iNAArrrhipY976KGHwvGDDz4IwEEHHQTAr7/+WqOvmUbrrrsuACeddFIY6927NxAlUQG8//77QDzyZK9HqdnPz7bbDhw4MJwbMGAAEN+CWNM76KS7pvrM7or22WefnHMff/xxOLb3UVrssssuAIwePTqM2eeA/zxo0KBBnb/WwoULgfhdpd2N33XXXQAccsghdf46aeajCPY9H3DAAWHMolsXX3xxcSeWJ34r/3XXXQckf1a8+eabAPTo0SOMWVTWJ7NnlUWN7rjjjjC26qqrArDccssBydGVJFdccUU4btKkCRCtotQl8lkZRVpEREQkE4oWabEtzQC33nprsb5suHM88cQTAbj88suL9rXzbfDgwQCcddZZQPwOwXI3fA5Hx44dgfhd6sEHHwyUPuJicxs1alSlj8nH3bP8jy8gV5HPFfvwww+LMZ0latasGRBtWbftphDdAQ4fPjyMLV68uM5f034nvv766zD217/+FYg+v5o3bx7OzZ8/v85fM20222yzcNyvX7+c8/bzePvtt4s2p3waM2ZMOLbPIDN79uxwfNxxxwHxHK/DDjsMgIYNGxZyigXTrVu3cHzfffcByTmkNeX/DvmoC8CwYcPq/PwVKdIiIiIimaCLFhEREcmEgi8PtWjRAoDHHnssjC2//PK1eq5HH300HK+wwgpAlFC0JLbV86abbgpjP/30U63mUSg+ifaEE04Aoi2GEC2XWIKtr+Bo2/a++OKLMPbaa6/lPK+Ff0u9PCSF57csWtVPb968eUC89EBa3HDDDUBU/daz5c5BgwYVbT5rr702EE9k9luj08pv799qq60AOP300wH47rvvwjlLvvRLycYSciHqV5U1Z599NgBdunTJOWfLQr4S8iuvvJLzuLlz5xZodsXhk+zzsSxUFXvfaXlIRERE6q2CR1psW2Jtoiu2Xeqaa64B4lEHe17fj8gSfC0K49nXT2NhIIuE+GiURUSmT58exmy75QcffADAggULwjnA1y4BAAANEElEQVTbBn3kkUeGsaReGb7vjpQ3H4mwBFK/5X+vvfYC4omnpeSTQHfffffYOV8c0kdLJZkV27v66qvDmH2enn/++TmPv+eee4DocwSiCIsvrfDjjz/mf7IF4pPPbct/UhLt/fffD8QLyZUT68NW3chkTf9GJj3eInfrr79+GPN/y+oifX/BRURERBLookVEREQyoeDLQ76nTE1ddtllAFxwwQU55yxcnNSPyO9HtyUV25NvIXFITjorBWvt7cPjFq7t379/tZ5ju+22A6JaLhDVbHnqqafCmF9SSjvfb+aRRx4p4UyyxZZT/etntU0mT54cxl544YXiTqwSnTt3BqJ+NhAl8BtfMXnq1KkFnY9/jaxOi/GVYNOWiOuXxW1Jx+rdQJS4b8n6llwMsM022wDx5Z+TTz45ZyxL/HsoaVnI+tL5z8xyZH8/q1vh1tT08f7fWHVdn65wyimn1Pj5kijSIiIiIplQsEiLVZDs06dPtR5vlRavvfbaMFbTqIBtU/Pb1ewOwiItvhrvRx99lPP4UrDkN1/NtroRlqqew459Im5a2M+lKv7K/LnnngPi29RtC1+7du2Aqqu+1gcWbbOeXv698PPPPwPx36+0sA7vFaMrANOmTQPgX//6V9HmY91uATbccEMgSmxdeumlizaPmvIRaat87TvwWkKmsd8piKI0tjUY4IcffijENAuubdu2QDyBOIlF7Ox3o5ysttpq1Xqc/xk3atQIiJJoPUvitlIEEP0ttc8dP2bsfQjR3yEfyawNRVpEREQkE3TRIiIiIplQsOUhq0CblABljcZ8Qp01zrMqnYXi52OVIX2Vy1LYdtttARgxYkSN/p1PcraGkL7JoFW89JUv06JiHY4kPuxoS3m///57GLM6NI0bN67R1/bJlFm3xRZbhON7770XiJLgPPt9fPzxx4szsRqw965n71mrzeQb1xWa/1qLFi2KnbMQOsAaa6wBwOeff16MaVXKqo8ef/zxYcyWha666qowNmXKFCBaRvVLCA8//DAAV155ZWEnWwSWgL7pppvmnPOfhdY00JJFbdNGZezf+qa7pU4tqGjjjTcGYOzYsVU+zpaFfMXk1q1bA3DzzTfnPN6WhexzxOvQoUOlX8fXZ/NJ4XWhSIuIiIhkQsEiLWuuuWal51588UWgOImT1itjt912yzm31lprFfzrV4clTPreEHYXl9QjyB7Xo0ePnOfwLrnkknxOs8585MRv766OVVZZJW/zKHQ0r5gOP/zwcNymTZvYOetRBdGddBrZvP172O5g/Xb9QvBRqaQIVcW7Q3/n+MQTTwDxKrLF4qPDtonBVyb9z3/+A8QjrxZhtL5mnj2H3+ZqycfrrbdeGLNoXpodeuihlZ6zauIQJSbvsssuNXp+3w/Ljq1/UalY1MwiLEt6Tx533HFA8t+XGTNmAPHfx3//+9+1mtfEiRPD8RtvvFGr56hIkRYRERHJhIJFWuyq31/pm6SxQrErz06dOgFw1llnlWQeVbHcHn91bOuyPppSscvzyJEjw7kBAwYA8S7Pd999d4FmXDv+zt+2vfkCaIVm67hJvamyxiJx/fr1C2MVo22WJwbp6S9UXRaJs15Z1e035PMY+vbtu8TH2+cCRNubq8tyAEphv/32C8dJUUjLGasqd8x//tmd9KuvvhrGNthgAyCew5EF9ruRpKpSC08//XQ4tgi9FdiD6L3yl7/8JYxZXozvgVcKFsX2vX5MUm+gqqIeFkGsjYpfyxdztb9XdXl+UKRFREREMkIXLSIiIpIJBVsesoSupARR66tTTDYPn2iWNLdS6NKlCxBfHkraBmpLKpY8ZT1mIPpeLMkZ0rfV+dtvvw3HVinRqrcmbaVbEgs32vP6MHZSVUfbau+3+RU60TOffOjVkimbNm2a8zhbFrr66quLM7E6svezDyVbCP6MM86I/bfUfEXm7t27l2wep512Wjh+7LHHcs7bEonv/WLJmrNmzQLiy7VJn4UWxreeReXGPg+effZZIP65YJ+dfhnFqjN7vn9Tse27777h2LYkV9UvyJ87+uijgfz/XlX19fP191aRFhEREcmEgnd5TnLAAQcAxdk+Z3enTZo0KfjXqiu/Hc/3P6lozJgxQDwJ0yIsvtdDmtmdjCVYVjfRsio+UjVo0KCc86uvvjoAn332WZ2/VilYTxVIjsRZxOm2224r2pzywbbv+gisReAKzW/lTOp6bVvKLfLjeyAVutt0VXzC/V133ZVz3pJoff8d69ZsEaLp06cXcoqpZ12e995770ofYwUsK2OJuMXUrVs3AIYPHx7G/Fb8iiwJ32/p94UIjW17r6oXk9/EsPLKKwO5/YYguVdRbbdNV6RIi4iIiGSCLlpEREQkE0qyPGTJS74i7SeffFKQr2Uh9aRwelbZMohPbEpb9dtSsIQ6SF4eyrol1RGxOhO+1kaW+N4vlihoy6RV1d6AKNTvl006d+4MVL1c5nsLLVy4MOe81Umy5SFfyyNtfN0VW3LzCemWdFkfl4WSfieq2hBiFd2Tlt4WL14cjl977bU8zK5mLPm+qiUhX4nWKv/6pGyzzDLRJYAtn/s0hYr69+8fjm0jiN8gYIm4VfUqqitFWkRERCQTChZpeffdd4EoIczr2LEjEE9q69WrFwAff/xxXudRVUffd955J69fq9Csq7NVC73uuuvCuSxt3S2Url27lnoKBWG9UW6//facc88//3w4TuopkyWWvOePr7jiilo/n9/+XxP+M6tdu3a1/vrF5hNKhwwZAkQ9iACGDRtW9DmlhVUNtiRWgC+//DL2GN8tfuDAgUC8E7bxkapx48bldZ51ZREWi1RCtOnhlFNOqfXz2uvgt4UnseRgS+otBEVaREREJBN00SIiIiKZULDlIUuEtJBb7969cx7ToUOHcGxhLWtUBXDZZZcByQlyVfGtxnfaaafYuQkTJoTjLITTfe2Rc845B4gScP33IvHwbjmxkGurVq1yzvlGiHPnzi3anMqZLW0DzJw5E4jXuEibZZddFojXbbLmoKeeempJ5lRKlnbglzIskfuqq64KY7Z5wWp4+Wa6e+65Z87zWn2nPn365HfCtZTUCNHer3Wphm6fM74hr6VvJFl66aVr/bVqQ5EWERERyYSCRVrmzJkDwEEHHQTEowI777xzzuMtOff8888PY7Yl+uabbwbglVdeqfJrbr/99kC8SmHz5s1jjzniiCPC8bx586r+JkrIokWPPvpoGLMtjVb11noR1XetW7cGYL/99ivxTPKnU6dO4bhZs2aVPs5vBbY7JN/jSermm2++AWDKlCkATJo0qZTTSWR9iHzvprFjxwJL/swsRzfeeCMAe+yxRxizSJmPklQnYuJ76djrnO/NIrWV1Odnu+22A+Daa68NY74qcnVYhKVnz545X8tXjbaeYcWmSIuIiIhkQsGLy/36669APKfFivr4O4MktkZrhZJ8UZ+kq0zLafC5DbatzQpzWWfPtDv77LOBeAE5i7CU6go3rRo1agRE2xrLgfWJgfj7viLfJ6SmuV+yZLZ11IpwVdwmmwb2+eh//v5Ou7557733gHg+o3WqbtOmTRjzxfgqss9dnwPz0EMP5XWetWW/8/4zwgrNbbTRRrH/Auy2225A9bssW/HX2bNnhzHrCN63b98wVpe8mbpQpEVEREQyQRctIiIikglF6z3kQ5cDBgwAot4FEG0x88mU1gvBtqT5cF5VoS6/BGSVIdOcdGsGDx4cji2hyic+3X333UWfUxbYUuGCBQvCmPXn8CyZ8vLLLy/OxOrAL0P4/jgV+dbvWXiPZ82sWbNKPYUlsv5qtjUeYOrUqaWaTmr4yrX2t8Rvg95qq62A6G+T71tlpQTuuOOOgs+zpqzSs696a0mzvjeQsQ0tSSkVVfHV5G+66aYaz7NQFGkRERGRTChJl2fbDm2dWf3xrbfeGsa6d+8ORMk/vm9EUqTFkq383efjjz+er2kXjCUp++JGttWyLv0i6gu7K7KEREj+udud6BNPPFGcieVJ+/btSz0FSRkrKAdRkTGLSEvl/N8Xf5xFDzzwQDh+6623gORIS3VZuZFp06YB6e0GrkiLiIiIZIIuWkRERCQTSrI8VBVfbdCOfYJZObLqtz551KrdKqGu+p566qlwXOx+GCLF5KskW0+c5ZZbrlTTkRKzv5UNGzYs8UwKT5EWERERyYTURVrqI0sq9olPdUmoEpHy5quRdu7cuYQzESkuRVpEREQkE3TRIiIiIpmg5aEUOOaYY0o9BRERkdSr9KJl0W+/AbBCy5WLNhkRERGp3+y6w65DvEovWubM+QGAnXr2LtC0RERERJLNmfMD/DVeEbzBn5V0Hpw3/yc++OgTWq64Ao0alf/ebxERESm9RYt+Y87cH1i3w1q0aB6vP1TpRYuIiIhImmj3kIiIiGSCLlpEREQkE3TRIiIiIpmgixYRERHJhP8H/kn5lCnTB70AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x, y = next(data(batch_size=64))\n",
"show_images(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define Linear Node"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define a simple Linear classifier using a Linear ``Node``.\n",
"\n",
"Nodes are at MagNet's heart.\n",
"<br><br>\n",
"They are _self-aware_ modules.\n",
"<br><br>\n",
"They react to the computational graph and change their properties accordingly"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Note that the activation has to be explicitly disabled.\n",
"# The default is ReLU.\n",
"model = mn.Linear(10, act=None)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Linear()"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model\n",
"# The model is not yet built.\n",
"# Makes sense since we don't know the input dimensionality yet"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"MagNet automatically builds Nodes just in time.\n",
"\n",
"Let's summarize the model"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"+--------+-----------+----------------------+\n",
"| Node | Shape | Trainable Parameters |\n",
"+--------+-----------+----------------------+\n",
"| input | 1, 28, 28 | 0 |\n",
"+--------+-----------+----------------------+\n",
"| Linear | 10 | 7,850 |\n",
"+--------+-----------+----------------------+\n",
"Total Trainable Parameters: 7,850\n"
]
}
],
"source": [
"summarize(model, x) # x is the input to the model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will ask the model to sort digits into respective buckets.\n",
"\n",
"The first column represents $0$, the second $1$ and so on...\n",
"\n",
"All the digits in the first column are what the model thinks is $0$.\n",
"\n",
"The correct results are in black and the wrong ones are in white."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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uj79urvqd97usmbN4tKmSevKlSvr+vbvwR5TAADf0pw9e/ZsrBcBAAAAAImGK1MAAAAA4AMnUwAAAADgAydTAAAAAOCD5zS/g4cOuzXrNrrcuXK6DBnSR3NNAAAAABBzJ06cdHv37XdXlijusmfL+o//3fNkas26jW7UuIkRXRwAAAAAxLuG9R5xlSqU/cftnidTuXPntC8sWCBf5FYGAACQgK6rUCHWS0hRflqyJNZLAP5h5649btS4iXZu9L88T6YypP//al/BAvlckcIXRWZ1AAAACWrP7p2xXkKKwudNxLNz50b/iwEUAAAAAOADJ1MAAAAA4AMnUwAAAADgAydTAAAAAOADJ1MAAAAA4AMnUwAAAADgg+dodKRe3bp1s3zo0CHLHTp0sJw5c2bnnHPTp0+32x544AHLN9xwg+UJEyZYLliwYHgXCwAAAMQIV6YAAAAAwAdOpgAAAADAB2p+cM45N378eMtdunSxfPToUctZs2a13K5dO+ecc1WqVLHbSpUqZXnhwoWW7733XsuLFy+2nCFDhuQuGwAAwNOKFSssz5gxwznn3Jo1a+y2DRs2WP7+++8tnzp1KuDxzp49azlHjhyWa9WqZblly5aWy5Yt62fZSCBcmQIAAAAAHziZAgAAAAAfqPmlYjpl78knn7R84sSJgPfXyX7n5MuXz7JeSr/lllssf/vtt5aHDRtm+bnnngttwQni5MmTlnv06GF5zpw5ll9//XXL1apVi8q6Ymnz5s2WO3bsaHns2LEB73/NNddY1pqoeuWVVyxrBRXB2717t+U6depYzpUrl+UPP/zQ8rkpngAQb/7880/L9evXt6yfQc69V1StWtVuq1GjRsDsZefOnZZnz55t+eOPPw6Y69WrZ3ngwIGWM2bMmORjITFwZQoAAAAAfOBkCgAAAAB8oOaXymzatMnyE088Ydmr2nfhhRdavv7664N+HK0GXXfddZbbtGlj+YorrrB81113BX3seLRs2TLLL7/8suW5c+dazpIli+VgamlaF9T6wsaNGy1rVfPZZ5+1XKJECcvp0qVL8rEi4bfffrN89913W9b1p0mTJuDXamVUs+rZs6flSZMmWb7nnntCX2wq1blzZ8sLFiwIeJ9KlSpZLl26tOXBgwdb1lpgrL3//vuWmzZtarlv376WixYtavn++++PzsKA//Hll19a1olv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PSxTpozlP//807LW/PS5qfVhnRYYL68HXJkCAAAAAB84mQIAAAAAH+Km5qeT6H777TfLmTNntqybf8XzxoaRppPvdu3aZdlrw0mdOqebQ8ZaJDbIDMaOHTssjx492rJXtU8vTderV89yr169At5fN5XUzU+TM61n8eLFvr8WKcOxY8cst2rVyrJW+7S2p5Wy/v37W9Z6be/evS3r1M1gKida69ApeLr5ZCLQ95J3333XslbLvCZGff3115Y7depkWasne/futTx48GDLutmkTl5MlIlq+n3zmsgXLlq32rp1a0QfK5q0wqfTzZ544gnLF1zg/2Pa6dOnLY8aNcryp59+almnTfbp08ey/k5369bN8m233eZ7PYlGJ0gnh/7e64RFnRyYiPRPRcaNG2e5Zs2aAe+v0xHbtGljWeuC+qcrBQsWtKwV1Hic4smVKQAAAADwgZMpAAAAAPAhpjU/ra3oxCgvOklIaytZsmQJeH+tquTOnduyXkbUCSHxTDd385ospapWrWq5adOmEVlTotIpVDqxKBg6eW/hwoVhWxOQlNmzZ1ueOnWqZa32vfHGG5Zbt25tWacrffDBB2FZj76+6kbbWglKZNmyZbNcuXLlgPfR20uVKmVZa+teEzp37txpuXbt2pYnTJhgOVEqf/BHJz1qDhedwqcT6DTrZymtm86fP99yrVq1LOtrj254nVLo77FuSutF/1xh48aNlm+//XbLKamaqvQ94Oabb/Z9HJ1e2aRJE8tal543b57v40cDV6YAAAAAwAdOpgAAAADAh5jW/HRSik7wU1oFvPvuu8PyuP369bOslxRffPFFy8mZoBMJWvH5/vvvk7z/jBkzLGtdJRZ0U0xdlypXrlxE13D8+HHLodbzdAJNMLR2pTWIQoUKWdYpOD179rTs9bPVaipSD33evvDCC5Z1I26t7em0Sa2w6n30tU3rz3fddZflHDlyBFyPTgL88ssvLSfihpPhphOsKlSoYFkrkG+99VbAr922bZtlfR/SiWr4dzpdEsHTKcn6GUunAGv1VKf56XNbq4OJRqt9kyZNshzMJrxKpySm1GpfJOj0ytKlS1vW6apr1qyJ6ppCxZUpAAAAAPCBkykAAAAA8CGmXbaVK1f6/lqtUuklWqWbrU6ePNmyTlzRy9TPPfec5Xir+emmhcFceo51tU/phDGdSqgbMnfs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xXKBAgWSPH68+emnnyzPnDkzLMf8/fffLWtdPlwyZMhgOdRKVqRpXUzfT3RSsNa6k+Ppp58OmG+99VbLWjXUirr+Tj/33HNhWU+i0T8t0d/pcKlQoULA27VyjX/n9ac90caVKQAAAADwgZMpAAAAAPAh7mt+77//vmWtOimtcugUFC/ff/+9Za0Fnj17NmBW99xzj+UnnngiyceKN7oBsU7aUjpp66233or4muKRbnaoOXv27Ja19hjqxC6tiI4aNcryl19+aVkrru+8845lan6pk04M1WqfWrBggeW6detaDqaiMnjw4IC36+vlF198YVl/L/744w/LWn3TrBteFy5cOMn1+KUVqWCqfV60Jr5s2bKAt+sGk0o3ZtX1tGvXzrK+l8SKvh9Ur17d8unTpy3r9EK9PVwiMSkuEafPhavaFwytnmq9UCf+6Xu/1t10s/pEVKlSJefc+b+7J06ciOhjFilSxLJOnNPPnyq1/knF/9Jps151vhIlSkRrOf+KK1MAAAAA4AMnUwAAAADgQ1zW/FauXGlZLzXrpfs6depY1s1kvcyaNcuyTknTCVbFixe3/OyzzwY8TiJW+06ePGlZN531qmzoZXydXJWa6IbG+rzTDUw1J4duZqoT2PRxtX6B1Gnq1KlJ3kcrJDolUidJeunYsWPA27UOozU/deGFF1rWTYF1U0rdcDSS3njjDcvjx4+33KxZM8vB1Azz5s1rWX8vvW5v0aKF5a+//tryd999Z1k387322mst62TEaLruuuss6/uBvmckh9ab9Ji6OXlyKp9ahdYNmrW2pVMWdTptapYjRw7L+nt59913W9bPTFq30p9j+vTpI7XEsNLn4bk/b9Cacq1atSyvWrXK9+OkS5fOstaBp02bZlm/96px48aWU8NGvcHInz+/Za/PojoZNJZS5ydlAAAAAEgmTqYAAAAAwIe4rPlpDW/Pnj2Wr776asu6SWrWrFkDHkcnoL366quWtT6lm1xOnz7dcrZs2UJddtzSyTBeVaEXXnjBcsWKFSO+pninU3a0zqfPx/nz51vWyWleDh8+bFnrJu+++65lfW4+88wzlvW5jJRt7969lrXmvGTJkoD318rzwIEDLefOnTss6wnmua21lAcffDAsj+uXbg6sOTm8pnXq7R9//LHlxx57zPLcuXMtr1+/3rL+3D755BPLhQoVSt5i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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"order(model, data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train the Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since this is a [supervised learning](https://machinelearningmastery.com/supervised-and-unsupervised-machine-learning-algorithms) problem, we will use the simple ``SupervisedTrainer`` class."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Track the accuracy of classification as well\n",
"trainer = SupervisedTrainer(model, metrics='accuracy')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Callbacks breathe life into MagNet's training process.\n",
"\n",
"Callbacks allow you to add additional features to the trainer."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# This callback tracks metrics (loss, accuracy) on a held-out validation set\n",
"validate_callback = callbacks.Validate(data(batch_size=64, mode='val'),\n",
" SupervisedTrainer.validate)\n",
"\n",
"# This callback logs the metrics and adds a nice progress bar\n",
"monitor_callback = callbacks.Monitor()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Train for an epoch with batch size $64$"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(IntProgress(value=0, max=750), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r"
]
}
],
"source": [
"trainer.train(data(batch_size=64, shuffle=True),\n",
" callbacks=[validate_callback, monitor_callback])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the Monitor callback to see how training went"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/vaisakh/magnet/magnet/utils/statistical.py:122: RuntimeWarning: window_fraction (0.3) too low for order (3) and length (9) of data\n",
"Returning raw data\n",
" RuntimeWarning)\n"
]
},
{
"data": {
"image/png": "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NA1ln90b37q7wcRCF+PzHYVmYkuD9E1coXP0/l3okLeEiC9HPFhFOlRHzF+OyaTI93HplRMREREREXmM2axOymLHKYsd3xvL5/MsrI4xNtfO5EI300u7u9AzzT9VCx3xZe+7F1q70L8YhWUREREREZF9xjAMQt4SQt4SGrO/uje+dXeDiflOxhc6P9iFnrxC5+ibe49xO0KEvaVEfTnigWpS4fd3oc1FWMnjS2FZRERERETkgLBZnZTFT1AWP7E3ls/nWVwdZ2y+UAs9s9TP7PLQfbvQZpOVoCd9Xy10OnwEl91frKUUncKyiIiIiIjIAWYYBkFvmqD3Z9VCdzI+/8EudP/k1ftqoT/YhS4v1EKH64n6codiF1phWURERERE5BAq1EKfoCx2/y70wuooY3MdTC50Mb3U/9O10GY7QXeKsK+MeKCSZLCWdLgep91XrKU8EgrLIiIiIiIiArxfC11KyFt6Xy30na01xhc6mJjvYmqxl9nlQfomLt9XC+1xRAj7MoVmYoFq0uF6wr6yIqzi4VBYFhERERERkZ/LbnOTi58mFz+9N5bP55lfGWFsro3JxW6mF/uZWxliaPoW798LbTU7CLhT+CwVVFX9D0Wa/cejsCwiIiIiIiIfmWEYhH0Zwr4MR/nC3vjm1jJjcx1MLHQytdjL9OIAG3fnijjTj0dhWURERERERB4ah81HRfIcFclzAKyvr9PT01PkWX10pmJPQERERERERORxo7AsIiIiIiIi8gCFZREREREREZEHKCyLiIiIiIiIPEBhWUREREREROQBCssiIiIiIiIiD1BYFhEREREREXmAwrKIiIiIiIjIAxSWRURERERERB6gsCwiIiIiIiLyAIVlERERERERkQcoLIuIiIiIiIg8QGFZRERERERE5AEKyyIiIiIiIiIPUFgWEREREREReYDCsoiIiIiIiMgDFJZFREREREREHqCwLCIiIiIiIvIAhWURERERERGRBygsi4iIiIiIiDxAYVlERERERETkAQrLIiIiIiIiIg+wFHsCUhxbd+8CMDk1U+SZ3G9zc5OZuQWc7kkcDkexp3Oo6LUvHr32xaPXvnj02heXXv/i0WtfPHrti+dxfe3fz0LvZ6MHKSwfUvPziwB8+7t/W+SZiIiIiIiIFM/8/CLkyn5q3Mjn8/kizEeKbHlllc7uPkLBADabtdjT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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
gitextract_kpew33sp/
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── Tutorials/
│ └── MNIST-Quickstart/
│ ├── MNIST-Quickstart.ipynb
│ └── mnist_quickstart.py
├── arghandle/
│ ├── README.md
│ ├── __init__.py
│ ├── core.py
│ └── handlers.py
├── docs/
│ ├── Makefile
│ ├── make.bat
│ ├── requirements.txt
│ └── source/
│ ├── _static/
│ │ └── css/
│ │ └── magnet-theme.css
│ ├── _templates/
│ │ └── footer.html
│ ├── conf.py
│ ├── data.rst
│ ├── debug.rst
│ ├── index.rst
│ ├── magnet.rst
│ ├── nodes.rst
│ ├── training.rst
│ └── utils.rst
├── environment.yml
├── magnet/
│ ├── __init__.py
│ ├── _autograd.py
│ ├── data/
│ │ ├── __init__.py
│ │ ├── core.py
│ │ ├── data.py
│ │ ├── dataloader.py
│ │ ├── sampler.py
│ │ └── transforms.py
│ ├── debug.py
│ ├── nodes/
│ │ ├── __init__.py
│ │ ├── core.py
│ │ ├── functional/
│ │ │ ├── __init__.py
│ │ │ ├── activations.py
│ │ │ ├── functional.py
│ │ │ ├── losses.py
│ │ │ └── metrics.py
│ │ └── nodes.py
│ ├── training/
│ │ ├── __init__.py
│ │ ├── callbacks.py
│ │ ├── history.py
│ │ ├── train.py
│ │ └── utils.py
│ └── utils/
│ ├── __arghandle__/
│ │ ├── __init__.py
│ │ └── images.py
│ ├── __init__.py
│ ├── _node.py
│ ├── images.py
│ ├── misc.py
│ ├── plot.py
│ ├── statistical.py
│ └── varseq.py
├── readthedocs.yml
├── setup.py
└── tests/
├── data/
│ └── test_dataloader.py
├── nodes/
│ ├── test_core.py
│ └── test_nodes.py
├── test_debug.py
├── training/
│ ├── test_callbacks.py
│ ├── test_history.py
│ └── test_train.py
└── utils/
├── test__node.py
├── test_images.py
├── test_plot.py
├── test_statistical.py
└── test_varseq.py
SYMBOL INDEX (314 symbols across 37 files)
FILE: Tutorials/MNIST-Quickstart/mnist_quickstart.py
function order (line 8) | def order(model, data, c=10, n=5):
function visualize_weights (line 31) | def visualize_weights(model):
FILE: arghandle/core.py
function arghandle (line 6) | def arghandle(fn):
function args (line 17) | def args():
function __get_handler (line 31) | def __get_handler(fn):
FILE: arghandle/handlers.py
function checkif (line 1) | def checkif(arg, types, exclude=False, name=None):
function typecheck (line 27) | def typecheck(include=None, exclude=None, **kwargs):
FILE: magnet/__init__.py
function __print_init_message (line 3) | def __print_init_message():
FILE: magnet/_autograd.py
function eval (line 10) | def eval(*modules):
function _eval_context_manager (line 74) | def _eval_context_manager(*modules):
FILE: magnet/data/core.py
function MNIST (line 4) | def MNIST(val_split=0.2, path=None, **kwargs):
FILE: magnet/data/data.py
function _get_data_dir (line 1) | def _get_data_dir():
class Data (line 19) | class Data:
method __init__ (line 55) | def __init__(self, train, val=None, test=None, val_split=0.2, **kwargs):
method __getitem__ (line 72) | def __getitem__(self, args):
method __setitem__ (line 87) | def __setitem__(self, mode, dataset):
method __len__ (line 90) | def __len__(self):
method _split_val (line 93) | def _split_val(self, val_split):
method __call__ (line 116) | def __call__(self, batch_size=1, shuffle=False, replace=False, probabi...
method get (line 151) | def get(name):
FILE: magnet/data/dataloader.py
class TransformedDataset (line 10) | class TransformedDataset(Dataset):
method __init__ (line 11) | def __init__(self, dataset, transforms=None, fetch_fn=None):
method __getitem__ (line 16) | def __getitem__(self, index):
method __len__ (line 22) | def __len__(self):
method _apply_transforms (line 25) | def _apply_transforms(self, x):
class DataLoader (line 45) | class DataLoader(DataLoaderPyTorch):
method __init__ (line 46) | def __init__(self, dataset, batch_size=1, shuffle=False, sampler=None,
method state_dict (line 60) | def state_dict(self):
method save_state_dict (line 71) | def save_state_dict(self, path):
method load_state_dict (line 76) | def load_state_dict(self, state_dict):
method compatible_with (line 90) | def compatible_with(self, state_dict):
method __next__ (line 94) | def __next__(self):
method __len__ (line 97) | def __len__(self):
function pack_collate (line 100) | def pack_collate(batch, pack_dims=None):
FILE: magnet/data/sampler.py
class OmniSampler (line 5) | class OmniSampler(Sampler):
method __init__ (line 6) | def __init__(self, dataset, shuffle=False, replace=False, probabilitie...
method _begin (line 15) | def _begin(self, pos):
method __next__ (line 30) | def __next__(self):
method __iter__ (line 36) | def __iter__(self):
method __len__ (line 39) | def __len__(self):
FILE: magnet/data/transforms.py
function augmented_image_transforms (line 1) | def augmented_image_transforms(d=0, t=0, s=0, sh=0, ph=0, pv=0, resample...
function image_transforms (line 31) | def image_transforms(augmentation=0, direction='horizontal'):
FILE: magnet/debug.py
function overfit (line 4) | def overfit(trainer, data, batch_size, epochs=1, metric='loss', **kwargs):
function check_flow (line 96) | def check_flow(trainer, data):
class Babysitter (line 123) | class Babysitter:
method __init__ (line 134) | def __init__(self, frequency=10, **kwargs):
method __call__ (line 142) | def __call__(self, trainer, signal, **kwargs):
method append (line 165) | def append(self, trainer, models):
method load (line 174) | def load(self, path):
method save (line 178) | def save(self, path):
function shape (line 183) | def shape(debug=True):
class _SetTrace (line 197) | class _SetTrace(object):
method __init__ (line 198) | def __init__(self, func):
method __enter__ (line 201) | def __enter__(self):
method __exit__ (line 206) | def __exit__(self, ext_type, exc_value, traceback):
class _Monitor (line 209) | class _Monitor:
method __init__ (line 210) | def __init__(self, names=True):
method init (line 215) | def init(self, frameinfo):
method is_same (line 220) | def is_same(self, frame):
method __call__ (line 224) | def __call__(self, frame, event, arg):
FILE: magnet/nodes/core.py
class Lambda (line 8) | class Lambda(Node):
method __init__ (line 34) | def __init__(self, fn, **kwargs):
method forward (line 42) | def forward(self, *args, **kwargs):
class Conv (line 45) | class Conv(Node):
method __init__ (line 151) | def __init__(self, c=None, k=3, p='half', s=1, d=1, g=1, b=True, ic=No...
method build (line 154) | def build(self, x):
method forward (line 173) | def forward(self, x):
method _find_layer (line 183) | def _find_layer(x):
method _set_padding (line 188) | def _set_padding(self, x):
method _mul_list (line 210) | def _mul_list(self, n):
class Linear (line 220) | class Linear(Node):
method __init__ (line 318) | def __init__(self, o=1, b=True, flat=True, i=None, act='relu', bn=Fals...
method build (line 321) | def build(self, x):
method forward (line 343) | def forward(self, x):
method _mul_list (line 354) | def _mul_list(self, n):
class _RNNBase (line 364) | class _RNNBase(Node):
method __init__ (line 365) | def __init__(self, mode, h, n=1, b=False, bi=False, act='tanh', d=0, b...
method build (line 369) | def build(self, x, h=None):
method forward (line 386) | def forward(self, x, h=None):
method _mul_list (line 389) | def _mul_list(self, n):
class RNN (line 400) | class RNN(_RNNBase):
method __init__ (line 454) | def __init__(self, h, n=1, b=False, bi=False, act='tanh', d=0, batch_f...
class LSTM (line 458) | class LSTM(_RNNBase):
method __init__ (line 463) | def __init__(self, h, n=1, b=False, bi=False, d=0, batch_first=False, ...
class GRU (line 468) | class GRU(_RNNBase):
method __init__ (line 473) | def __init__(self, h, n=1, b=False, bi=False, d=0, batch_first=False, ...
class BatchNorm (line 478) | class BatchNorm(Node):
method __init__ (line 563) | def __init__(self, e=1e-05, m=0.1, a=True, track=True, i=None, **kwargs):
method build (line 566) | def build(self, x):
method forward (line 575) | def forward(self, x):
method _find_layer (line 579) | def _find_layer(x):
FILE: magnet/nodes/functional/metrics.py
function accuracy (line 1) | def accuracy(scores, y):
FILE: magnet/nodes/nodes.py
class Node (line 9) | class Node(nn.Module):
method __init__ (line 34) | def __init__(self, *args, **kwargs):
method build (line 39) | def build(self, *args, **kwargs):
method __call__ (line 48) | def __call__(self, *args, **kwargs):
method _parse_args (line 52) | def _parse_args(self):
method get_args (line 72) | def get_args(self):
method to (line 77) | def to(self, *args, **kwargs):
method load_state_dict (line 87) | def load_state_dict(self, f):
method _mul_int (line 100) | def _mul_int(self, n):
method _mul_list (line 103) | def _mul_list(self, n):
method __mul__ (line 118) | def __mul__(self, n):
FILE: magnet/training/callbacks.py
class Monitor (line 6) | class Monitor:
method __init__ (line 44) | def __init__(self, frequency=10, show_progress=True, **kwargs):
method __call__ (line 53) | def __call__(self, trainer, signal, **kwargs):
method show (line 116) | def show(self, metric=None, log=False, x_key='epochs', **kwargs):
method __repr__ (line 121) | def __repr__(self):
method load_state (line 125) | def load_state(self, path):
method save_state (line 129) | def save_state(self, path):
class Validate (line 133) | class Validate:
method __init__ (line 173) | def __init__(self, dataloader, validate, frequency=10, batches=None, d...
method __call__ (line 181) | def __call__(self, trainer, signal, **kwargs):
method validate_batch (line 214) | def validate_batch(self, trainer):
method load_state (line 218) | def load_state(self, path):
method save_state (line 223) | def save_state(self, path):
class Checkpoint (line 227) | class Checkpoint:
method __init__ (line 250) | def __init__(self, path, interval='5 m', **kwargs):
method parse_duration (line 256) | def parse_duration(interval):
method __call__ (line 263) | def __call__(self, trainer, signal, **kwargs):
method clear_state (line 299) | def clear_state(self):
method load_state (line 303) | def load_state(self, trainer, path):
method save_state (line 308) | def save_state(self, trainer, path):
class ColdStart (line 312) | class ColdStart:
method __init__ (line 325) | def __init__(self, epochs=0.1, **kwargs):
method __call__ (line 330) | def __call__(self, trainer, signal, **kwargs):
class LRScheduler (line 352) | class LRScheduler:
method __init__ (line 361) | def __init__(self, scheduler, **kwargs):
method __call__ (line 365) | def __call__(self, trainer, signal, **kwargs):
method load_state (line 380) | def load_state(self, path):
method save_state (line 384) | def save_state(self, path):
class CallbackQueue (line 388) | class CallbackQueue(list):
method append (line 397) | def append(self, callback):
method extend (line 400) | def extend(self, callbacks):
method find (line 403) | def find(self, name):
method exists (line 417) | def exists(self, name):
method __call__ (line 420) | def __call__(self, signal, *args, **kwargs):
FILE: magnet/training/history.py
class History (line 3) | class History(dict):
method find (line 36) | def find(self, key):
method append (line 53) | def append(self, key, value, validation=False, buffer_size=None, **sta...
method show (line 88) | def show(self, key=None, log=False, x_key=None, validation=True, legen...
method flush (line 153) | def flush(self, key=None, **stamps):
class SnapShot (line 172) | class SnapShot:
method __init__ (line 183) | def __init__(self, buffer_size=-1):
method append (line 189) | def append(self, value, buffer=False, **stamps):
method flush (line 211) | def flush(self, **stamps):
method _retrieve (line 229) | def _retrieve(self, key='val', stamp=None):
method _pop (line 233) | def _pop(self, index):
method _clear (line 236) | def _clear(self):
method __len__ (line 239) | def __len__(self):
method __getitem__ (line 242) | def __getitem__(self, index):
method __repr__ (line 245) | def __repr__(self):
method show (line 248) | def show(self, ax, x=None, label=None, **kwargs):
FILE: magnet/training/train.py
class Trainer (line 4) | class Trainer:
method __init__ (line 28) | def __init__(self, models, optimizers):
method optimize (line 35) | def optimize(self):
method train (line 57) | def train(self, dataloader, epochs=1, callbacks=None, **kwargs):
method __iter__ (line 88) | def __iter__(self):
method __next__ (line 91) | def __next__(self):
method mock (line 97) | def mock(self, path=None):
method epochs (line 124) | def epochs(self, mode=None):
method is_training (line 138) | def is_training(self):
method load_state (line 141) | def load_state(self, path):
method save_state (line 156) | def save_state(self, path):
method register_parameter (line 171) | def register_parameter(self, name, value):
class SupervisedTrainer (line 177) | class SupervisedTrainer(Trainer):
method __init__ (line 230) | def __init__(self, model, optimizer='adam', loss='cross_entropy', metr...
method optimize (line 246) | def optimize(self):
method validate (line 263) | def validate(trainer, dataloader):
method get_loss (line 271) | def get_loss(self, dataloader, validation=False):
function finish_training (line 290) | def finish_training(path, names=None):
FILE: magnet/training/utils.py
function load_state (line 5) | def load_state(module, path, alternative_name=None):
function save_state (line 35) | def save_state(module, path, alternative_name=None):
function load_object (line 56) | def load_object(path, **kwargs):
function save_object (line 77) | def save_object(obj, path):
FILE: magnet/utils/__arghandle__/images.py
function show_images (line 9) | def show_images(images, titles=None, pixel_range='auto', cmap='gray', sh...
function _show_image (line 32) | def _show_image(image, title=None, cmap='gray', ax=None, pixel_range='au...
function __handle_shape (line 38) | def __handle_shape(n_images, shape):
function __handle_string_shape (line 59) | def __handle_string_shape(n_images, shape):
function __handle_resize (line 66) | def __handle_resize(images, size='smean'):
function __square_factors (line 82) | def __square_factors(x):
function __handle_image_dimensions (line 93) | def __handle_image_dimensions(images, stacked=True):
function __handle_image_type (line 109) | def __handle_image_type(image):
function __is_generator (line 126) | def __is_generator(iterable):
FILE: magnet/utils/_node.py
function summarize (line 3) | def summarize(module, x, parameters='trainable', arguments=False, batch=...
FILE: magnet/utils/images.py
function show_images (line 8) | def show_images(images, **kwargs):
function _resize (line 71) | def _resize(images, size='smean'):
function _merge (line 76) | def _merge(images, shape):
function _show_image (line 82) | def _show_image(image, title=None, cmap='gray', ax=None, pixel_range='au...
FILE: magnet/utils/misc.py
function caller_locals (line 5) | def caller_locals(ancestor=False):
function num_params (line 31) | def num_params(module):
function get_tqdm (line 44) | def get_tqdm():
FILE: magnet/utils/plot.py
function smooth_plot (line 6) | def smooth_plot(*args, **kwargs):
FILE: magnet/utils/statistical.py
function find_outliers (line 7) | def find_outliers(data, threshold=3.5, window_fraction=0.15):
function smoothen (line 65) | def smoothen(data, window_fraction=0.3, **kwargs):
function _spline_interpolate (line 120) | def _spline_interpolate(x, y, x_new, **kwargs):
FILE: magnet/utils/varseq.py
function pack (line 5) | def pack(sequences, lengths=None):
function unpack (line 50) | def unpack(sequence, as_list=False):
function sort (line 72) | def sort(sequences, order, dim=0):
function unsort (line 82) | def unsort(sequences, order, dim=0):
FILE: tests/data/test_dataloader.py
class TestDataLoader (line 5) | class TestDataLoader:
method test_batch_size_cannnot_be_too_high (line 6) | def test_batch_size_cannnot_be_too_high(self):
FILE: tests/nodes/test_core.py
class TestLambda (line 10) | class TestLambda:
method test_lambda_function_has_name_lambda (line 11) | def test_lambda_function_has_name_lambda(self):
method test_function_name_transferred (line 16) | def test_function_name_transferred(self):
method test_square (line 23) | def test_square(self):
class TestConv (line 30) | class TestConv:
method test_half_padding_args (line 31) | def test_half_padding_args(self):
method test_half_padding (line 42) | def test_half_padding(self):
method test_same_padding (line 46) | def test_same_padding(self):
method test_double_padding (line 50) | def test_double_padding(self):
method test_conv_1d (line 54) | def test_conv_1d(self):
method test_conv_2d (line 59) | def test_conv_2d(self):
method test_conv_3d (line 64) | def test_conv_3d(self):
method test_mul_list (line 69) | def test_mul_list(self):
class TestLinear (line 80) | class TestLinear:
method test_flatten (line 81) | def test_flatten(self):
method test_inflate (line 87) | def test_inflate(self):
method test_mul_list (line 93) | def test_mul_list(self):
class TestRNN (line 104) | class TestRNN:
method test_shape (line 107) | def test_shape(self):
method test_mul_list (line 115) | def test_mul_list(self):
class TestLSTM (line 126) | class TestLSTM(TestRNN):
class TestGRU (line 129) | class TestGRU(TestRNN):
class TestBatchNorm (line 132) | class TestBatchNorm:
method test_bn_1d (line 133) | def test_bn_1d(self):
method test_bn_2d (line 140) | def test_bn_2d(self):
method test_bn_3d (line 145) | def test_bn_3d(self):
FILE: tests/nodes/test_nodes.py
class TestNode (line 5) | class TestNode:
method test_not_built (line 6) | def test_not_built(self):
method test_store_arguments (line 10) | def test_store_arguments(self):
method test_name_is_not_senseless (line 20) | def test_name_is_not_senseless(self):
method test_mul_int (line 25) | def test_mul_int(self):
method test_print_args (line 33) | def test_print_args(self):
method test_cannot_mul_list (line 37) | def test_cannot_mul_list(self):
FILE: tests/test_debug.py
function test_overfit (line 14) | def test_overfit():
class TestFlow (line 18) | class TestFlow:
method test_ok (line 19) | def test_ok(self):
method test_broken (line 23) | def test_broken(self):
class TestBabysitter (line 28) | class TestBabysitter:
method test_accumulating (line 29) | def test_accumulating(self):
function get_obj (line 38) | def get_obj(broken=False):
class BrokenModel (line 49) | class BrokenModel(nn.Module):
method __init__ (line 50) | def __init__(self):
method forward (line 55) | def forward(self, x):
method sample (line 60) | def sample(self, x):
FILE: tests/training/test_callbacks.py
class TestCheckpoint (line 17) | class TestCheckpoint:
method get_callbacks (line 19) | def get_callbacks(data, trainer, path):
method test_start_from_checkpoint (line 27) | def test_start_from_checkpoint(self):
class TestColdStart (line 45) | class TestColdStart:
method test_not_trained (line 46) | def test_not_trained(self):
class TestLRScheduler (line 56) | class TestLRScheduler:
method test_lr_decay (line 57) | def test_lr_decay(self):
class TestCallbackQueue (line 67) | class TestCallbackQueue:
method test_exists (line 68) | def test_exists(self):
method test_multiple_callbacks_error (line 73) | def test_multiple_callbacks_error(self):
method test_cannot_add_same_name (line 78) | def test_cannot_add_same_name(self):
function get_obj (line 86) | def get_obj():
function copy_tensor (line 94) | def copy_tensor(x):
FILE: tests/training/test_history.py
class TestHistory (line 5) | class TestHistory:
method test_can_show (line 6) | def test_can_show(self):
FILE: tests/training/test_train.py
class TestTrainer (line 15) | class TestTrainer:
method test_cannot_call (line 16) | def test_cannot_call(self):
class TestSupervisedTrainer (line 23) | class TestSupervisedTrainer:
method test_iterations (line 24) | def test_iterations(self):
method test_epochs (line 30) | def test_epochs(self):
method test_epoch_start (line 36) | def test_epoch_start(self):
method test_epoch_end (line 42) | def test_epoch_end(self):
method test_less_loss (line 48) | def test_less_loss(self):
method test_not_training_when_eval (line 61) | def test_not_training_when_eval(self):
method test_mocking (line 71) | def test_mocking(self):
method test_change_batch_size (line 79) | def test_change_batch_size(self):
function test_finish_training (line 90) | def test_finish_training():
function get_obj (line 106) | def get_obj():
function copy_tensor (line 114) | def copy_tensor(x):
FILE: tests/utils/test__node.py
function test_summarize_node (line 8) | def test_summarize_node():
function test_summarize_module (line 12) | def test_summarize_module():
FILE: tests/utils/test_images.py
class TestShowImages (line 9) | class TestShowImages:
method test_pass_numpy_array (line 10) | def test_pass_numpy_array(self):
method test_torch_tensor (line 15) | def test_torch_tensor(self):
method test_cannot_mix_inputs (line 18) | def test_cannot_mix_inputs(self):
method test_pixel_range_string (line 22) | def test_pixel_range_string(self):
method test_pixel_range_integer (line 26) | def test_pixel_range_integer(self):
method test_bad_merge_shape (line 30) | def test_bad_merge_shape(self):
method test_shape_negative (line 34) | def test_shape_negative(self):
method test_shape_row_column (line 38) | def test_shape_row_column(self):
method test_shape_dict (line 42) | def test_shape_dict(self):
method test_shape_evil (line 46) | def test_shape_evil(self):
method test_resize_negative (line 50) | def test_resize_negative(self):
method test_savepath_not_string (line 54) | def test_savepath_not_string(self):
method test_can_plot_seperately (line 58) | def test_can_plot_seperately(self):
FILE: tests/utils/test_plot.py
class TestSmoothenPlot (line 6) | class TestSmoothenPlot:
method test_get_gained_points_back (line 7) | def test_get_gained_points_back(self):
FILE: tests/utils/test_statistical.py
class TestRemoveOutlier (line 9) | class TestRemoveOutlier:
method test_data_can_be_1d (line 10) | def test_data_can_be_1d(self):
method test_data_can_be_linear (line 13) | def test_data_can_be_linear(self):
method test_cannot_send_none (line 16) | def test_cannot_send_none(self):
method test_cannot_send_empty (line 20) | def test_cannot_send_empty(self):
method test_threshold_not_negative (line 27) | def test_threshold_not_negative(self):
method test_threshold_not_none (line 31) | def test_threshold_not_none(self):
method test_threshold_not_inf (line 35) | def test_threshold_not_inf(self):
method test_window_fraction_is_fraction (line 39) | def test_window_fraction_is_fraction(self):
class TestSmoothen (line 46) | class TestSmoothen:
method test_cannot_send_none (line 47) | def test_cannot_send_none(self):
method test_cannot_send_empty (line 57) | def test_cannot_send_empty(self):
method test_cannot_send_2d (line 64) | def test_cannot_send_2d(self):
method test_cannot_send_illegal (line 68) | def test_cannot_send_illegal(self):
method test_window_fraction_is_fraction (line 79) | def test_window_fraction_is_fraction(self):
method test_window_fraction_too_low_warning (line 85) | def test_window_fraction_too_low_warning(self):
method test_order_cannot_be_negative (line 89) | def test_order_cannot_be_negative(self):
method test_interpolate_fn_cannot_be_none (line 93) | def test_interpolate_fn_cannot_be_none(self):
method test_returns_same_shape (line 97) | def test_returns_same_shape(self):
FILE: tests/utils/test_varseq.py
function test_pack_unpack (line 6) | def test_pack_unpack():
function test_pack_padded (line 16) | def test_pack_padded():
Condensed preview — 69 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (525K chars).
[
{
"path": ".gitignore",
"chars": 2757,
"preview": "\n# Created by https://www.gitignore.io/api/python,pycharm+all,jupyternotebook\n\n**/checkpoints/\n\n### JupyterNotebook ###\n"
},
{
"path": ".travis.yml",
"chars": 232,
"preview": "language: python\ndist: xenial\npython:\n - \"3.6\"\n\ninstall:\n - python setup.py install\n - pip install codecov\n\nbefore_sc"
},
{
"path": "LICENSE",
"chars": 1064,
"preview": "MIT License\n\nCopyright (c) 2018 Vaisakh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
},
{
"path": "README.md",
"chars": 13994,
"preview": "# MagNet: Deep Learning Projects that Build Themselves\n\n<div align=\"center\">\n <img src=\"docs/source/_static/img/logo-fu"
},
{
"path": "Tutorials/MNIST-Quickstart/MNIST-Quickstart.ipynb",
"chars": 338285,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Training an AI to Recognize Handw"
},
{
"path": "Tutorials/MNIST-Quickstart/mnist_quickstart.py",
"chars": 875,
"preview": "import magnet as mag\n\nfrom magnet.utils.images import show_images\n\nimport torch\n\n@mag.eval\ndef order(model, data, c=10, "
},
{
"path": "arghandle/README.md",
"chars": 1403,
"preview": "`arghandle` is a small tool used to separate handling of arguments in functions from function logic.\r\n\r\nSuppose you have"
},
{
"path": "arghandle/__init__.py",
"chars": 42,
"preview": "from arghandle.core import arghandle, args"
},
{
"path": "arghandle/core.py",
"chars": 1123,
"preview": "import inspect, importlib.util\n\nfrom pathlib import Path\nfrom functools import wraps\n\ndef arghandle(fn):\n handler_fn "
},
{
"path": "arghandle/handlers.py",
"chars": 1186,
"preview": "def checkif(arg, types, exclude=False, name=None):\n if name is None: name = 'One of the arguments'\n\n def error_mes"
},
{
"path": "docs/Makefile",
"chars": 607,
"preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS =\nSPHI"
},
{
"path": "docs/make.bat",
"chars": 814,
"preview": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sp"
},
{
"path": "docs/requirements.txt",
"chars": 94,
"preview": "sphinx\n-e git://github.com/snide/sphinx_rtd_theme.git#egg=sphinx_rtd_theme\nsphinxcontrib.katex"
},
{
"path": "docs/source/_static/css/magnet-theme.css",
"chars": 2008,
"preview": "\n/* Use white for docs background */\n.wy-side-nav-search {\n background-color: #fff;\n}\n\n.wy-nav-content-wrap, .wy-menu"
},
{
"path": "docs/source/_templates/footer.html",
"chars": 133,
"preview": "{% extends \"!footer.html\" %}\n{% block extrafooter %}\n <p>Created my free logo at LogoMakr.com</p>\n {{ super() }}\n{"
},
{
"path": "docs/source/conf.py",
"chars": 6835,
"preview": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a s"
},
{
"path": "docs/source/data.rst",
"chars": 294,
"preview": "magnet.data\n===================================\n\nData\n----\n\n.. automodule:: magnet.data\n\n.. autoclass:: Data\n :members"
},
{
"path": "docs/source/debug.rst",
"chars": 155,
"preview": "Debugging\n===================================\n\n.. automodule:: magnet.debug\n :members: overfit, check_flow, Babysitter"
},
{
"path": "docs/source/index.rst",
"chars": 610,
"preview": ".. MagNet documentation master file, created by\n sphinx-quickstart on Thu Aug 23 10:42:23 2018.\n You can adapt this "
},
{
"path": "docs/source/magnet.rst",
"chars": 90,
"preview": "magnet\n===================================\n\n.. automodule:: magnet\n\n.. autofunction:: eval"
},
{
"path": "docs/source/nodes.rst",
"chars": 362,
"preview": "Nodes\n===================================\n\n.. automodule:: magnet.nodes\n\nNode\n----------\n\n.. autoclass:: Node\n :member"
},
{
"path": "docs/source/training.rst",
"chars": 1316,
"preview": "magnet.training\n===================================\n\n.. automodule:: magnet.training\n\nTrainer\n^^^^^^^^^^^^^^^^^\n\n.. auto"
},
{
"path": "docs/source/utils.rst",
"chars": 515,
"preview": "magnet.utils\n===================================\n\n.. automodule:: magnet.utils\n\n.. autofunction:: summarize\n\nmagnet.util"
},
{
"path": "environment.yml",
"chars": 270,
"preview": "name: magnet\nchannels:\n - pytorch\n - defaults\ndependencies:\n - scikit-image=0.14.0\n - pytorch=0.4.1\n - torchvision="
},
{
"path": "magnet/__init__.py",
"chars": 434,
"preview": "from ._autograd import eval, device, build_lock\n\ndef __print_init_message():\n from magnet.utils.misc import in_notebo"
},
{
"path": "magnet/_autograd.py",
"chars": 2098,
"preview": "import torch\n\nfrom contextlib import contextmanager\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\ndevice = to"
},
{
"path": "magnet/data/__init__.py",
"chars": 32,
"preview": "from .data import DIR_DATA, Data"
},
{
"path": "magnet/data/core.py",
"chars": 824,
"preview": "from . import data\nfrom .transforms import image_transforms\n\ndef MNIST(val_split=0.2, path=None, **kwargs):\n r\"\"\"The "
},
{
"path": "magnet/data/data.py",
"chars": 6846,
"preview": "def _get_data_dir():\n import os, warnings\n from pathlib import Path\n\n DIR_DATA = os.environ.get('MAGNET_DATAPAT"
},
{
"path": "magnet/data/dataloader.py",
"chars": 4358,
"preview": "import torch, collections\n\nfrom torch.utils.data.dataloader import DataLoader as DataLoaderPyTorch\nfrom torch.utils.data"
},
{
"path": "magnet/data/sampler.py",
"chars": 1299,
"preview": "import numpy as np\n\nfrom torch.utils.data.sampler import Sampler\n\nclass OmniSampler(Sampler):\n def __init__(self, dat"
},
{
"path": "magnet/data/transforms.py",
"chars": 2056,
"preview": "def augmented_image_transforms(d=0, t=0, s=0, sh=0, ph=0, pv=0, resample=2):\n r\"\"\"Returns a list of augmented transfo"
},
{
"path": "magnet/debug.py",
"chars": 8640,
"preview": "import sys, inspect, torch\nfrom contextlib import contextmanager\n\ndef overfit(trainer, data, batch_size, epochs=1, metri"
},
{
"path": "magnet/nodes/__init__.py",
"chars": 43,
"preview": "from .nodes import Node\nfrom .core import *"
},
{
"path": "magnet/nodes/core.py",
"chars": 21123,
"preview": "# coding=utf-8\nimport torch.nn.functional as F\n\nfrom torch import nn\n\nfrom .nodes import Node\n\nclass Lambda(Node):\n r"
},
{
"path": "magnet/nodes/functional/__init__.py",
"chars": 25,
"preview": "from .functional import *"
},
{
"path": "magnet/nodes/functional/activations.py",
"chars": 246,
"preview": "from functools import partial\nfrom torch.nn.functional import relu, leaky_relu\nfrom torch import sigmoid, tanh\n\nwiki = {"
},
{
"path": "magnet/nodes/functional/functional.py",
"chars": 548,
"preview": "from torch.nn import functional as F\nfrom magnet.nodes.functional import activations, losses, metrics\n\ndimensional_func"
},
{
"path": "magnet/nodes/functional/losses.py",
"chars": 86,
"preview": "from torch.nn.functional import cross_entropy\n\nwiki = {'cross_entropy': cross_entropy}"
},
{
"path": "magnet/nodes/functional/metrics.py",
"chars": 119,
"preview": "def accuracy(scores, y):\n\ty_pred = scores.max(1)[1]\n\treturn (y_pred == y).float().mean()\n\nwiki = {'accuracy': accuracy}"
},
{
"path": "magnet/nodes/nodes.py",
"chars": 4069,
"preview": "# coding=utf-8\nimport torch\nimport magnet as mag\n\nfrom torch import nn\n\nfrom magnet.utils.misc import caller_locals\n\ncla"
},
{
"path": "magnet/training/__init__.py",
"chars": 35,
"preview": "from magnet.training.train import *"
},
{
"path": "magnet/training/callbacks.py",
"chars": 16038,
"preview": "import magnet as mag\nimport torch\n\nfrom time import time\n\nclass Monitor:\n r\"\"\"Allows easy monitoring of the training "
},
{
"path": "magnet/training/history.py",
"chars": 10277,
"preview": "from magnet.utils.plot import smooth_plot\n\nclass History(dict):\n r\"\"\"A dictionary-like repository which is used to st"
},
{
"path": "magnet/training/train.py",
"chars": 12635,
"preview": "from torch import optim\nfrom contextlib import contextmanager\n\nclass Trainer:\n r\"\"\"Abstract base class for training m"
},
{
"path": "magnet/training/utils.py",
"chars": 3193,
"preview": "import torch, pickle\n\nimport magnet as mag\n\ndef load_state(module, path, alternative_name=None):\n r\"\"\"Loads the state"
},
{
"path": "magnet/utils/__arghandle__/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "magnet/utils/__arghandle__/images.py",
"chars": 4427,
"preview": "import arghandle\n\nimport numpy as np, matplotlib.pyplot as plt\n\nfrom arghandle.handlers import typecheck\nfrom pathlib im"
},
{
"path": "magnet/utils/__init__.py",
"chars": 28,
"preview": "from ._node import summarize"
},
{
"path": "magnet/utils/_node.py",
"chars": 3251,
"preview": "import magnet as mag\n\ndef summarize(module, x, parameters='trainable', arguments=False, batch=False, max_width=120):\n "
},
{
"path": "magnet/utils/images.py",
"chars": 3698,
"preview": "import numpy as np\nimport matplotlib.pyplot as plt\n\nfrom skimage.transform import resize as imresize\nfrom arghandle impo"
},
{
"path": "magnet/utils/misc.py",
"chars": 1384,
"preview": "try: get_ipython()\nexcept NameError: in_notebook = False\nelse: in_notebook = True\n\ndef caller_locals(ancestor=False):\n "
},
{
"path": "magnet/utils/plot.py",
"chars": 1741,
"preview": "import numpy as np\nimport matplotlib.pyplot as plt\n\nfrom .statistical import smoothen, _spline_interpolate, find_outlier"
},
{
"path": "magnet/utils/statistical.py",
"chars": 5462,
"preview": "import warnings\n\nimport numpy as np\nfrom scipy.signal import savgol_filter\nfrom scipy import interpolate\n\ndef find_outli"
},
{
"path": "magnet/utils/varseq.py",
"chars": 3339,
"preview": "import torch, numpy as np\n\nfrom torch.nn.utils.rnn import pack_sequence, pad_packed_sequence, pack_padded_sequence\n\ndef "
},
{
"path": "readthedocs.yml",
"chars": 91,
"preview": "# .readthedocs.yml\n\nbuild:\n image: latest\n\npython:\n version: 3.6\n setup_py_install: true"
},
{
"path": "setup.py",
"chars": 936,
"preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nfrom setuptools import setup\n\nsetup(\n name='MagNet',\n version='0.1'"
},
{
"path": "tests/data/test_dataloader.py",
"chars": 231,
"preview": "import pytest\n\nfrom magnet.data import Data\n\nclass TestDataLoader:\n def test_batch_size_cannnot_be_too_high(self):\n "
},
{
"path": "tests/nodes/test_core.py",
"chars": 4211,
"preview": "import torch\n\nfrom torch import nn\n\nimport magnet as mag\nfrom magnet.nodes.core import Lambda, Conv, Linear, RNN, LSTM, "
},
{
"path": "tests/nodes/test_nodes.py",
"chars": 997,
"preview": "import pytest\n\nfrom magnet.nodes import Node\n\nclass TestNode:\n def test_not_built(self):\n node = Node()\n "
},
{
"path": "tests/test_debug.py",
"chars": 1469,
"preview": "import pytest\nimport matplotlib\nmatplotlib.use('agg')\n\nfrom torch import nn\n\nimport magnet as mag\nimport magnet.nodes as"
},
{
"path": "tests/training/test_callbacks.py",
"chars": 2965,
"preview": "import torch\nimport pytest\nimport matplotlib\nmatplotlib.use('agg')\n\nfrom torch.optim.lr_scheduler import ExponentialLR\nf"
},
{
"path": "tests/training/test_history.py",
"chars": 308,
"preview": "from time import time\n\nfrom magnet.training.history import History\n\nclass TestHistory:\n def test_can_show(self):\n "
},
{
"path": "tests/training/test_train.py",
"chars": 3453,
"preview": "import torch\nimport pytest\n\nfrom torch import optim\nfrom pathlib import Path\nfrom shutil import rmtree\n\nimport magnet as"
},
{
"path": "tests/utils/test__node.py",
"chars": 343,
"preview": "import torch\n\nfrom torch import nn\n\nimport magnet.nodes as mn\nfrom magnet.utils import summarize\n\ndef test_summarize_nod"
},
{
"path": "tests/utils/test_images.py",
"chars": 1976,
"preview": "import pytest\nimport numpy as np\nimport matplotlib\nmatplotlib.use('agg')\nimport torch\n\nfrom magnet.utils.images import s"
},
{
"path": "tests/utils/test_plot.py",
"chars": 342,
"preview": "import numpy as np\n\nfrom magnet.utils.plot import smooth_plot\n\n\nclass TestSmoothenPlot:\n def test_get_gained_points_b"
},
{
"path": "tests/utils/test_statistical.py",
"chars": 3073,
"preview": "import numpy as np\nimport pytest\nimport matplotlib\nmatplotlib.use('agg')\n\nfrom magnet.utils.statistical import find_outl"
},
{
"path": "tests/utils/test_varseq.py",
"chars": 613,
"preview": "import torch\nimport numpy as np\n\nfrom magnet.utils.varseq import pack, unpack\n\ndef test_pack_unpack():\n x = [torch.ar"
}
]
About this extraction
This page contains the full source code of the MagNet-DL/magnet GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 69 files (502.4 KB), approximately 266.8k tokens, and a symbol index with 314 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.