Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo.png?raw=true#gh-light-mode-only

https://github.com/unifyai/unifyai.github.io/blob/main/img/externally_linked/logo_dark.png?raw=true#gh-dark-mode-only



End-to-end memory modules for machine learning developers, written in Ivy.

Contents

Overview

What is Ivy Memory?

Ivy memory provides differentiable memory modules, including learnt modules such as Neural Turing Machines (NTM), but also parameter-free modules such as End-to-End Egospheric Spatial Memory (ESM). Check out the docs for more info!

The library is built on top of the Ivy machine learning framework. This means all memory modules simultaneously support: Jax, Tensorflow, PyTorch, MXNet, and Numpy.

Ivy Libraries

There are a host of derived libraries written in Ivy, in the areas of mechanics, 3D vision, robotics, gym environments, neural memory, pre-trained models + implementations, and builder tools with trainers, data loaders and more. Click on the icons below to learn more!








Quick Start

Ivy memory can be installed like so: pip install ivy-memory==0.0.1.post0

To quickly see the different aspects of the library, we suggest you check out the demos! We suggest you start by running the script run_through.py, and read the "Run Through" section below which explains this script.

For more interactive demos, we suggest you run either learning_to_copy_with_ntm.py or mapping_a_room_with_esm.py in the interactive demos folder.

Run Through

We run through some of the different parts of the library via a simple ongoing example script. The full script is available in the demos folder, as file run_through.py.

End-to-End Egospheric Spatial Memory

First, we show how the Ivy End-to-End Egospheric Spatial Memory (ESM) class can be used inside a pure-Ivy model. We first define the model as below.

classIvyModelWithESM(ivy.Module):
def__init__(self, channels_in, channels_out):
self._channels_in=channels_inself._esm=ivy_mem.ESM(omni_image_dims=(16, 32))
self._linear=ivy_mem.Linear(channels_in, channels_out)
ivy.Module.__init__(self, 'cpu')
def_forward(self, obs):
mem=self._esm(obs)
x=ivy.reshape(mem.mean, (-1, self._channels_in))
returnself._linear(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('torch')
model=IvyModelWithESM(in_channels, out_channels)
# input configbatch_size=1image_dims= [5, 5]
num_timesteps=2num_feature_channels=3# create image of pixel co-ordinatesuniform_pixel_coords=\
ivy_vision.create_uniform_pixel_coords_image(image_dims, [batch_size, num_timesteps])
# define camera measurementdepths=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [1])
pixel_coords=ivy_vision.depth_to_pixel_coords(depths)
inv_calib_mats=ivy.random_uniform(shape=[batch_size, num_timesteps, 3, 3])
cam_coords=ivy_vision.pixel_to_cam_coords(pixel_coords, inv_calib_mats)[..., 0:3]
features=ivy.random_uniform(shape=[batch_size, num_timesteps] +image_dims+ [num_feature_channels])
img_mean=ivy.concat((cam_coords, features), axis=-1)
cam_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# place these into an ESM camera measurement containeresm_cam_meas=ESMCamMeasurement(
img_mean=img_mean,
cam_rel_mat=cam_rel_mat
)
# define agent pose transformationagent_rel_mat=ivy.eye(4, batch_shape=[batch_size, num_timesteps])[..., 0:3, :]
# collect together into an ESM observation containeresm_obs=ESMObservation(
img_meas={'camera_0': esm_cam_meas},
agent_rel_mat=agent_rel_mat
)
# call model and test outputoutput=model(esm_obs)
assertoutput.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the ESM network can be trained using Ivy functions only.

# define loss functiontarget=ivy.zeros_like(output)
defloss_fn(v):
pred=model(esm_obs, v=v)
returnivy.mean((pred-target) **2)
# optimizeroptimizer=ivy.SGD(lr=1e-4)
# train modelprint('\ntraining dummy Ivy ESM model...\n')
foriinrange(10):
loss, grads=ivy.execute_with_gradients(loss_fn, model.v)
model.v=optimizer.step(model.v, grads)
print('step {}, loss = {}'.format(i, ivy.to_numpy(loss).item()))
print('\ndummy Ivy ESM model trained!\n')
ivy.unset_backend()

Neural Turing Machine

We next show how the Ivy Neural Turing Machine (NTM) class can be used inside a TensorFlow model. First, we define the model as below.

classTfModelWithNTM(tf.keras.Model):
def__init__(self, channels_in, channels_out):
tf.keras.Model.__init__(self)
self._linear=tf.keras.layers.Dense(64)
memory_size=4memory_vector_dim=1self._ntm=ivy_mem.NTM(
input_dim=64, output_dim=channels_out, ctrl_output_size=channels_out, ctrl_layers=1,
memory_size=memory_size, memory_vector_dim=memory_vector_dim, read_head_num=1, write_head_num=1)
self._assign_variables()
def_assign_variables(self):
self._ntm.v.map(
lambdax, kc: self.add_weight(name=kc, shape=x.shape))
self.set_weights([ivy.to_numpy(v) fork, vinself._ntm.v.to_iterator()])
self.trainable_weights_dict=dict()
forweightinself.trainable_weights:
self.trainable_weights_dict[weight.name] =weightself._ntm.v=self._ntm.v.map(lambdax, kc: self.trainable_weights_dict[kc+':0'])
defcall(self, x, **kwargs):
x=self._linear(x)
returnself._ntm(x)

Next, we instantiate this model, and verify that the returned tensors are of the expected shape.

# create modelin_channels=32out_channels=8ivy.set_backend('tensorflow')
model=TfModelWithNTM(in_channels, out_channels)
# define inputsbatch_shape= [1, 2]
timesteps=3input_shape=batch_shape+ [timesteps, in_channels]
input_seq=tf.random.uniform(batch_shape+ [timesteps, in_channels])
# call model and test outputoutput_seq=model(input_seq)
assertinput_seq.shape[:-1] ==output_seq.shape[:-1]
assertinput_seq.shape[-1] ==in_channelsassertoutput_seq.shape[-1] ==out_channels

Finally, we define a dummy loss function, and show how the NTM can be trained using a native TensorFlow optimizer.

# define loss functiontarget=tf.zeros_like(output_seq)
defloss_fn():
pred=model(input_seq)
returntf.reduce_sum((pred-target) **2)
# define optimizeroptimizer=tf.keras.optimizers.Adam(1e-2)
# train modelprint('\ntraining dummy TensorFlow NTM model...\n')
foriinrange(10):
withtf.GradientTape() astape:
loss=loss_fn()
grads=tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
print('step {}, loss = {}'.format(i, loss))
print('\ndummy TensorFlow NTM model trained!\n')
ivy.unset_framework()

Interactive Demos

In addition to the run through above, we provide two further demo scripts, which are more visual and interactive.

The scripts for these demos can be found in the interactive demos folder.

Learning to Copy with NTM

The first demo trains a Neural Turing Machine to copy a sequence from one memory bank to another. NTM can overfit to a single copy sequence very quickly, as show in the real-time visualization below.

Mapping a Room with ESM

The second demo creates an egocentric map of a room, from a rotating camera. The raw image observations are shown on the left, and the incrementally constructed omni-directional ESM feature and depth images are shown on the right. While this example only projects color values into the memory, arbitrary neural network features can also be projected, for end-to-end training.

Get Involved

We hope the memory classes in this library are useful to a wide range of machine learning developers. However, there are many more areas of differentiable memory which could be covered by this library.

If there are any particular functions or classes you feel are missing, and your needs are not met by the functions currently on offer, then we are very happy to accept pull requests!

We look forward to working with the community on expanding and improving the Ivy memory library.

Citation

@article{lenton2021ivy,
title={Ivy: Templated deep learning for inter-framework portability},
author={Lenton, Daniel and Pardo, Fabio and Falck, Fabian and James, Stephen and Clark, Ronald},
journal={arXiv preprint arXiv:2102.02886},
year={2021}
}

About

Differentiable memory modules for machine learning with Ivy

Resources

Stars

38 stars

Watchers

18 watching

Forks

Releases

Packages

Used by

Contributors

Languages