{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Learning sensorimotor models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the [last tutorial](http://nbviewer.ipython.org/github/flowersteam/explauto/blob/master/notebook/setting_environments.ipynb) we have seen how to set up environments in Explauto, allowing to compute the sensory effects of given motor commands. Here we present another essential building block of the library: the [sensorimotor_model package](http://flowersteam.github.io/explauto/explauto.sensorimotormodel.html).\n", "\n", "As explained in the [Explauto introduction](http://flowersteam.github.io/explauto/about.html), an important challenge in Developmental Robotics is how robots can efficiently learn sensorimotor mappings by experience, i.e. the mappings between the motor actions they make and the sensory effects they produce. This can be a robot learning how arm movements make physical objects move, or how movements of a virtual vocal tract modulates vocalization sounds.\n", "\n", "Learning sensorimotor mappings involves machine learning algorithms, for which Explauto provides a unified interface through the [SensorimotorModel abstract class](http://flowersteam.github.io/explauto/explauto.sensorimotormodel.html#explauto.sensorimotor_model.sensorimotor_model.SensorimotorModel). \n", "\n", "Let's begin with a low-dimensional simple arm environment:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from explauto import Environment\n", "environment = Environment.from_configuration('simple_arm', 'low_dimensional')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will not add noise to sensory effects in this tutorial:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "environment.noise = 0." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now generate 100 random motor configurations:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "random_motors = environment.random_motors(n=100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember that we can visualize the corresponding arm configurations using:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "ax = axes()\n", "\n", "for m in random_motors:\n", " environment.plot_arm(ax, m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a flow of sensorimotor experience, that is a flow of $(m, s)$ pairs (motor configuration associated with the corresponding observed sensory effect), we want to iteratively learn a sensorimotor model of this low-dimensional arm, which will be able to:\n", "* infer the position of the end-effector from a given motor command, what is called forward prediction,\n", "* infer the motor command allowing to reach a particular end-effector position, what is called inverse prediction.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly to environments, available sensorimotor models in Explauto can be accessed using:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available sensorimotor models: ['LWLR-BFGS', 'nearest_neighbor', 'WNN', 'LWLR-CMAES']\n" ] } ], "source": [ "from explauto.sensorimotor_model import sensorimotor_models\n", "print 'Available sensorimotor models: {}'.format(sensorimotor_models.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we will use the 'nearest_neighbor' model. This sensorimotor model simply stores sensorimotor experience, ie. $(m, s)$ pairs where $m$ are motor commands (here arm joint positions) and $s$ are the corresponding sensory effects (here end-effector positions). When asked for a forward prediction for a given motor command $m$, it returns the associated sensory effect $s$ of the nearest neighbor of $m$ in the stored sensorimotor experience. When asked for an inverse prediction to reach a sensory goal $s$, it returns the associated motor command $m$ of the nearest neighbor of $s$ in the stored sensorimotor experience, possibly pertubated with a bit gaussian noise." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's have a look at the available configurations for the 'nearest_neighbor' model:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available configurations for the nearest_neighbor model: ['default', 'exact']\n" ] } ], "source": [ "sm_cls, sm_configs = sensorimotor_models['nearest_neighbor']\n", "print 'Available configurations for the nearest_neighbor model: {}'.format(sm_configs.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use the 'exact' configuration, which perform forward and inverse prediction as explained above, without any noise added (ie., it just looks for the nearest neighbor). \n", "\n", "Now we can instantiate the sensorimotor model by using:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "model = sm_cls(environment.conf, **sm_configs['default'])\n", "#model = sm_cls(environment.conf, **{'fwd': 'NN', 'inv': 'NN', 'sigma_explo_ratio':1.0})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in addition to the configuration keyword arguments, one also has to pass environment.conf. This a [Configuration](http://flowersteam.github.io/explauto/explauto.utils.html#explauto.utils.config.Configuration) object which is instantiated during the environment creation and provides information about the motor and sensorimotor ranges used in the environment. It is useful for the sensorimotor model to be properly configured. When using the 'default' configuration for example, the added noise when performing inverse prediction depends on the motor ranges. Passing environment.conf thus allows to define sensorimotor model configurations independently of particular environment settings.\n", "\n", "Note that instead of the previous lines, one can equivalently use this shortcut in order to instantiate the sensorimotor model (similarly to the [Environment.from_configuration](http://flowersteam.github.io/explauto/explauto.environment.html#explauto.environment.environment.Environment.from_configuration) class method we used above):" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from explauto import SensorimotorModel\n", "model = SensorimotorModel.from_configuration(environment.conf, 'nearest_neighbor', 'default')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's train the model from the execution of random motor commands (that we already have stored above in random_motors):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for m in random_motors:\n", " s = environment.compute_sensori_effect(m) # compute the sensori effect s of the motor command m through the environment\n", " model.update(m, s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that sensorimotor model training in Explauto is an iterative process. They incorporate new sensorimotor experience on the fly instead that using batch training. This is a requirement for autonomous exploration where the internal model has to be refined *online*.\n", "\n", "Once the sensorimodel has been trained, one can perform forward and inverse prediction with it. Let's predict the sensori effect of a new random motor command (which is not in the training set we just used) using the [forward_prediction](http://flowersteam.github.io/explauto/explauto.sensorimotormodel.html#explauto.sensorimotor_model.sensorimotor_model.SensorimotorModel.forward_prediction) method:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "random motor command: [ 0.55860706 0.05924781 0.82209782]\n", "predicted effect: [ 0.56979514 0.78545853]\n" ] } ], "source": [ "m = environment.random_motors(n=1)[0, :]\n", "s_pred = model.forward_prediction(m)\n", "print 'random motor command: ', m\n", "print 'predicted effect: ', s_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and compare the predicted effect with the real effect observed from executing $m$ through the environment:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = axes()\n", "environment.plot_arm(ax, m)\n", "ax.plot(*s_pred, marker='o', color='red')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We observe that the predicted end-effector position is quite close to the observed position when executing the motor command. Using the 'nearest_neighbor' model, it simply corresponds to the sensory effect of the nearest neighbor of $m$ in the stored sensorimotor experience." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sensorimotor models can also be used for inverse prediction using the [inverse_prediction](http://flowersteam.github.io/explauto/explauto.sensorimotormodel.html#explauto.sensorimotor_model.sensorimotor_model.SensorimotorModel.inverse_prediction) method, allowing the inference of an appropriate motor comand $m$ in order to reach a given sensory goal $s_g$:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Inferred motor command to reach the position [0.7, 0.5] : [ 0.04339393 0.90288491 0.52605263]\n" ] } ], "source": [ "s_g = [0.7, 0.5]\n", "m = model.inverse_prediction(s_g)\n", "print 'Inferred motor command to reach the position ', s_g, ': ', m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check if the inferred motor command is actually appropriate to reach the goal $s_g$:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nUpH/ByBSxFJlOgKZAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = axes()\n", "environment.plot_arm(ax, m)\n", "ax.plot(*s_g, marker='o', color='red')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We observe that the inferred motor command results in an end-effector position which is quite close to the goal. Using the 'exact' configuration of the 'nearest_neighbor' model, it is simply the motor command which resulted in the sensory effect which is the closest to $s_g$ in the stored experience." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercises" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the sensorimotor model we just trained to follow a straight line with the end-effector from point $A=[0.8, 0.5]$ to point $B=[0.8, -0.5]$." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%load exercise_solutions/learning_sensorimotor_models__follow_line.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "if the result is not satisfactory, continue to train the model with more random points (eg.: 10000) an try again." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%load exercise_solutions/learning_sensorimotor_models__more_training.py" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" }, "widgets": { "state": {}, "version": "1.1.2" } }, "nbformat": 4, "nbformat_minor": 0 }