├── LICENSE ├── README.md ├── docker └── Dockerfile ├── experiment ├── kalman_filter │ └── hookes_movement.ipynb └── sin_wave.ipynb └── model ├── deep_kalman_filter.py └── kalman_filter.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Kohei Morimoto 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pytorch Re-Implementation of DeepKalmanFilter 2 | wip 3 | 4 | Model structure is based on PlaNet [2] and https://github.com/DanieleGammelli/DeepKalmanFilter. 5 | 6 | ## Reference 7 | [1] Deep Kalman Filters. Rahul G. Krishnan, Uri Shalit, David Sontag. 8 | 9 | 10 | [2] Learning Latent Dynamics for Planning from Pixels. Hafner, Danijar and Lillicrap, Timothy and Fischer, Ian and Villegas, Ruben and Ha, David and Lee, Honglak and Davidson, James. 11 | 12 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM pytorch/pytorch:latest 2 | 3 | # Install required libraries 4 | RUN conda config --add channels pytorch \ 5 | && conda config --append channels conda-forge \ 6 | && conda update --all --yes --quiet \ 7 | && conda install --yes --quiet \ 8 | ipywidgets \ 9 | jupyterlab \ 10 | matplotlib \ 11 | nodejs \ 12 | opencv \ 13 | pandas \ 14 | scikit-learn \ 15 | seaborn \ 16 | sympy \ 17 | && conda clean --all -f -y 18 | 19 | # Install jupyter extensions 20 | RUN jupyter nbextension enable --py --sys-prefix widgetsnbextension \ 21 | && jupyter labextension install @jupyter-widgets/jupyterlab-manager 22 | 23 | RUN conda install --yes --quiet attrdict 24 | 25 | #COPY jupyter_notebook_config.py /root/.jupyter/ -------------------------------------------------------------------------------- /experiment/kalman_filter/hookes_movement.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 117, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "The autoreload extension is already loaded. To reload it, use:\n", 15 | " %reload_ext autoreload\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "import numpy as np\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "from model import kalman_filter\n", 23 | "%load_ext autoreload\n", 24 | "%autoreload 2" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 102, 30 | "outputs": [], 31 | "source": [ 32 | "def get_artificial_data(num_step=10000, delta_time = 0.1, hookes_const = 0.01, friction_rate=0.01):\n", 33 | "\n", 34 | " transition_noise = lambda : np.random.randn(2) * 0.0001\n", 35 | " observation_noise = lambda : np.random.randn(2) * 0.1\n", 36 | "\n", 37 | " A = np.array([[1, delta_time], [-hookes_const*delta_time, 1-friction_rate*delta_time]])\n", 38 | " C = np.identity(2)\n", 39 | " print(\"A=\", A, \"c=\", C)\n", 40 | "\n", 41 | " init_pos = np.array([1., 0.,])\n", 42 | " hidden_data = [init_pos]\n", 43 | " observed_data = [C@init_pos + observation_noise()]\n", 44 | "\n", 45 | " for n in range(num_step):\n", 46 | " hidden_data.append(A @ hidden_data[-1] + transition_noise())\n", 47 | " observed_data.append(C @ hidden_data[-1] + observation_noise())\n", 48 | "\n", 49 | " return np.stack(hidden_data), np.stack(observed_data), A, C" 50 | ], 51 | "metadata": { 52 | "collapsed": false, 53 | "pycharm": { 54 | "name": "#%%\n" 55 | } 56 | } 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 103, 61 | "outputs": [ 62 | { 63 | "name": "stdout", 64 | "output_type": "stream", 65 | "text": [ 66 | "A= [[ 1. 0.1 ]\n", 67 | " [-0.001 0.999]] c= [[1. 0.]\n", 68 | " [0. 1.]]\n" 69 | ] 70 | } 71 | ], 72 | "source": [ 73 | "hidden_data, observed_data, A, C, = get_artificial_data()" 74 | ], 75 | "metadata": { 76 | "collapsed": false, 77 | "pycharm": { 78 | "name": "#%%\n" 79 | } 80 | } 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 104, 85 | "outputs": [ 86 | { 87 | "data": { 88 | "text/plain": "[]" 89 | }, 90 | "execution_count": 104, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | }, 94 | { 95 | "data": { 96 | "text/plain": "
", 97 | "image/png": "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\n" 98 | }, 99 | "metadata": { 100 | "needs_background": "light" 101 | }, 102 | "output_type": "display_data" 103 | } 104 | ], 105 | "source": [ 106 | "plt.plot(hidden_data[:, 0])" 107 | ], 108 | "metadata": { 109 | "collapsed": false, 110 | "pycharm": { 111 | "name": "#%%\n" 112 | } 113 | } 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": 108, 118 | "outputs": [ 119 | { 120 | "data": { 121 | "text/plain": "[]" 122 | }, 123 | "execution_count": 108, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | }, 127 | { 128 | "data": { 129 | "text/plain": "
", 130 | "image/png": "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\n" 131 | }, 132 | "metadata": { 133 | "needs_background": "light" 134 | }, 135 | "output_type": "display_data" 136 | } 137 | ], 138 | "source": [ 139 | "plt.plot(observed_data[:, 0])" 140 | ], 141 | "metadata": { 142 | "collapsed": false, 143 | "pycharm": { 144 | "name": "#%%\n" 145 | } 146 | } 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 126, 151 | "outputs": [], 152 | "source": [ 153 | "kalman = kalman_filter.KalmanFilter(2, A, C, np.identity(2) * 0.0001, np.identity(2)*0.1)\n", 154 | "mu, covar, c = kalman.forward(observed_data, np.array([1., 0.]), np.array([[1., 0], [0, 1]]))" 155 | ], 156 | "metadata": { 157 | "collapsed": false, 158 | "pycharm": { 159 | "name": "#%%\n" 160 | } 161 | } 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 138, 166 | "outputs": [ 167 | { 168 | "data": { 169 | "text/plain": "" 170 | }, 171 | "execution_count": 138, 172 | "metadata": {}, 173 | "output_type": "execute_result" 174 | }, 175 | { 176 | "data": { 177 | "text/plain": "
", 178 | "image/png": "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\n" 179 | }, 180 | "metadata": { 181 | "needs_background": "light" 182 | }, 183 | "output_type": "display_data" 184 | } 185 | ], 186 | "source": [ 187 | "plt.plot(mu[1:, 0])\n", 188 | "plt.fill_between(np.arange(len(mu)-1), (mu[1:, 0]-np.sqrt(covar[:, 0, 0])), (mu[1:, 0]+np.sqrt(covar[:, 0, 0])), alpha=.1, color=\"r\")" 189 | ], 190 | "metadata": { 191 | "collapsed": false, 192 | "pycharm": { 193 | "name": "#%%\n" 194 | } 195 | } 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 135, 200 | "outputs": [ 201 | { 202 | "name": "stdout", 203 | "output_type": "stream", 204 | "text": [ 205 | "[0.30151134 0.21858453 0.18071951 ... 0.08200822 0.08200822 0.08200822]\n" 206 | ] 207 | } 208 | ], 209 | "source": [ 210 | "print(np.sqrt(covar[:, 0, 0]))" 211 | ], 212 | "metadata": { 213 | "collapsed": false, 214 | "pycharm": { 215 | "name": "#%%\n" 216 | } 217 | } 218 | } 219 | ], 220 | "metadata": { 221 | "kernelspec": { 222 | "display_name": "Python 3", 223 | "language": "python", 224 | "name": "python3" 225 | }, 226 | "language_info": { 227 | "codemirror_mode": { 228 | "name": "ipython", 229 | "version": 2 230 | }, 231 | "file_extension": ".py", 232 | "mimetype": "text/x-python", 233 | "name": "python", 234 | "nbconvert_exporter": "python", 235 | "pygments_lexer": "ipython2", 236 | "version": "2.7.6" 237 | } 238 | }, 239 | "nbformat": 4, 240 | "nbformat_minor": 0 241 | } -------------------------------------------------------------------------------- /model/deep_kalman_filter.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | 5 | class Emitter(nn.Module): 6 | def __init__(self, z_dim, hidden_dim, obs_dim): 7 | super(Emitter, self).__init__() 8 | self.z_to_hidden = nn.Linear(z_dim, hidden_dim) 9 | self.hidden_to_hidden = nn.Linear(hidden_dim, hidden_dim) 10 | self.hidden_to_loc = nn.Linear(hidden_dim, obs_dim) 11 | self.relu = nn.ReLU() 12 | self.softplus = nn.Softplus() 13 | 14 | def forward(self, z): 15 | hidden1 = self.relu(self.z_to_hidden(z)) 16 | hidden2 = self.relu(self.hidden_to_hidden(hidden1)) 17 | loc = self.hidden_to_loc(hidden2) 18 | 19 | return loc 20 | 21 | 22 | class Transition(nn.Module): 23 | def __init__(self, z_dim, hidden_dim): 24 | super(Transition, self).__init__() 25 | self.z_to_hidden = nn.Linear(z_dim, hidden_dim) 26 | self.hidden_to_hidden = nn.Linear(hidden_dim, hidden_dim) 27 | self.hidden_to_loc = nn.Linear(hidden_dim, z_dim) 28 | self.hidden_to_sig = nn.Linear(hidden_dim, z_dim) 29 | 30 | self.relu = nn.ReLU() 31 | self.softplus = nn.Softplus() 32 | 33 | def forward(self, z_t_1): 34 | hidden1 = self.relu(self.z_to_hidden(z_t_1)) 35 | hidden2 = self.relu(self.hidden_to_hidden(hidden1)) 36 | 37 | loc = self.hidden_to_loc(hidden2) 38 | sigma = self.softplus(self.hidden_to_sig(hidden2)) 39 | 40 | return loc, sigma 41 | 42 | 43 | class Posterior(nn.Module): 44 | def __init__(self, z_dim, hidden_dim, obs_dim): 45 | super(Posterior, self).__init__() 46 | self.z_obs_to_hidden = nn.Linear(2 * z_dim + obs_dim, hidden_dim) 47 | self.hidden_to_hidden = nn.Linear(hidden_dim, hidden_dim) 48 | 49 | self.hidden_to_loc = nn.Linear(hidden_dim, z_dim) 50 | self.hidden_to_sig = nn.Linear(hidden_dim, z_dim) 51 | 52 | self.relu = nn.ReLU() 53 | self.softplus = nn.Softplus() 54 | 55 | def forward(self, z_mu, z_sig, obs_t): 56 | hidden1 = self.relu(self.z_obs_to_hidden(torch.cat((z_mu, z_sig, obs_t), dim=-1))) 57 | hidden2 = self.relu(self.hidden_to_hidden(hidden1)) 58 | 59 | loc = self.hidden_to_loc(hidden2) 60 | sig = self.softplus(self.hidden_to_sig(hidden2)) 61 | 62 | return loc, sig 63 | 64 | 65 | class DeepKalmanFilter(nn.Module): 66 | def __init__(self, config): 67 | super(DeepKalmanFilter, self).__init__() 68 | 69 | self.emitter = Emitter(config.z_dim, config.emit_hidden_dim, config.obs_dim) 70 | self.transition = Transition(config.z_dim, config.trans_hidden_dim) 71 | 72 | self.posterior = Posterior( 73 | config.z_dim, 74 | config.post_hidden_dim, 75 | config.obs_dim 76 | ) 77 | 78 | self.z_q_0 = nn.Parameter(torch.zeros(config.z_dim)) 79 | self.emit_log_sigma = nn.Parameter(config.emit_log_sigma * torch.ones(config.obs_dim)) 80 | 81 | self.config = config 82 | 83 | @staticmethod 84 | def reparametrization(mu, sig): 85 | return mu + torch.randn_like(sig) * sig 86 | 87 | @staticmethod 88 | def kl_div(mu0, sig0, mu1, sig1): 89 | return -0.5 * torch.sum(1 - 2 * sig1.log() + 2 * sig0.log() 90 | - (mu1 - mu0).pow(2) / sig1.pow(2) - (sig0 / sig1).pow(2)) 91 | 92 | def loss(self, obs): 93 | 94 | time_step = obs.size(1) 95 | batch_size = obs.size(0) 96 | overshoot_len = self.config.overshooting 97 | 98 | kl = torch.Tensor([0]).to(self.config.device) 99 | reconstruction = torch.Tensor([0]).to(self.config.device) 100 | 101 | emit_sig = self.emit_log_sigma.exp() 102 | 103 | for s in range(self.config.sampling_num): 104 | z_q_t = self.z_q_0.expand((batch_size, self.config.z_dim)) 105 | 106 | for t in range(time_step): 107 | trans_loc, trans_sig = self.transition(z_q_t) 108 | 109 | post_loc, post_sig = self.posterior(trans_loc, trans_sig, obs[:, t]) 110 | 111 | z_q_t = self.reparametrization(post_loc, post_sig) 112 | emit_loc = self.emitter(z_q_t) 113 | 114 | reconstruction += ((emit_loc - obs[:, t]).pow(2).sum(dim=0) / 2 / emit_sig 115 | + self.emit_log_sigma * batch_size / 2).sum() 116 | if t > 0: 117 | over_loc, over_sig = self.transition(overshooting[:overshoot_len - 1]) 118 | over_loc = torch.cat([trans_loc.unsqueeze(0), over_loc], dim=0) 119 | over_sig = torch.cat([trans_sig.unsqueeze(0), over_sig], dim=0) 120 | else: 121 | over_loc = trans_loc.unsqueeze(0) 122 | over_sig = trans_sig.unsqueeze(0) 123 | 124 | overshooting = self.reparametrization(over_loc, over_sig) 125 | kl = kl + self.kl_div(post_loc.expand_as(over_loc), post_sig.expand_as(over_sig), over_loc, 126 | over_sig) / min(t + 1, self.config.overshooting) 127 | 128 | reconstruction = reconstruction / self.config.sampling_num 129 | kl = kl / self.config.sampling_num 130 | return reconstruction, kl 131 | -------------------------------------------------------------------------------- /model/kalman_filter.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | import scipy.stats 4 | 5 | class KalmanFilter: 6 | def __init__(self, dim, init_transition, init_observe, init_trans_noise, init_obs_noise): 7 | self.dim = dim 8 | self.transition_matrix = init_transition 9 | self.observe_matrix = init_observe 10 | self.trans_noise = init_trans_noise 11 | self.obs_noise = init_obs_noise 12 | 13 | def forward(self, data, mu_zero, p_zero): 14 | time = len(data) 15 | 16 | mu = [mu_zero] 17 | covar = [] 18 | P = [p_zero] 19 | c = [] 20 | for t in range(time): 21 | estimated_noise = self.observe_matrix @ P[-1] @ self.observe_matrix.T + self.obs_noise 22 | gain = P[-1] @ self.observe_matrix.T @ np.linalg.inv(estimated_noise) 23 | 24 | if t == 0: 25 | mu.append(mu[0] + gain @ (data[t] - self.observe_matrix @ mu[0])) 26 | c.append(scipy.stats.multivariate_normal.pdf(data[0], self.observe_matrix@mu[0], estimated_noise)) 27 | else: 28 | mu.append(self.transition_matrix @ mu[-1] 29 | + gain @ (data[t] - self.observe_matrix @ self.transition_matrix @ mu[-1])) 30 | c.append(scipy.stats.multivariate_normal.pdf(data[t], self.observe_matrix@self.transition_matrix@mu[-2], 31 | estimated_noise)) 32 | 33 | covar.append((np.identity(self.dim) - gain @ self.observe_matrix) @ P[-1]) 34 | P.append(self.transition_matrix@covar[-1]@self.transition_matrix.T + self.trans_noise) 35 | 36 | return np.stack(mu), np.stack(covar), np.array(c) 37 | 38 | 39 | 40 | --------------------------------------------------------------------------------