Skip to content

Instantly share code, notes, and snippets.

@Radi4
Created April 14, 2018 20:31
Show Gist options
  • Save Radi4/373f6b447717d10acf3f8c534a32c6c4 to your computer and use it in GitHub Desktop.
Save Radi4/373f6b447717d10acf3f8c534a32c6c4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Importing"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import mne\n",
"import os\n",
"from sklearn.model_selection import train_test_split\n",
"import h5py\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sb\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"import torch\n",
"from keras.models import load_model"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from ipyparallel import Client\n",
"c = Client()\n",
"# lview = c.load_balanced_view()\n",
"lview = c[:]\n",
"lview.block = True"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%px\n",
"import numpy as np\n",
"from sklearn.metrics import mean_squared_error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Metric"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Физический смысл - метрика соответствует соотношению энергий: \n",
" а) объясненной y_pred \n",
" б) общей энергии y_true (энергия пропорциональна L2-норме вектора)\n",
"С точки зрения оптимизиации, минимизация mse ведет к минимизации l2, поэтому сети можно учить на mse"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def metric(y_true, y_pred):\n",
" l2ratio = np.sum((y_true - y_pred)**2) / np.sum(y_true**2)\n",
" return np.sqrt(l2ratio) * 100"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"@lview.parallel()\n",
"def load_file(fnames):\n",
" import h5py\n",
" try:\n",
" h5_file = h5py.File(fnames, 'r')\n",
" a_group_key = list(h5_file.keys())[0]\n",
" eeg_data = np.array(h5_file[a_group_key]).T\n",
" except FileNotFoundError:\n",
" return None\n",
" return [eeg_data, eeg_data.shape[0], fnames.split('/')[-1]]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def find_bad_channels(X, X_size):\n",
" X_delete_channels = []\n",
" start = 0\n",
" for finish in X_size:\n",
" part_data = X[start : finish]\n",
" X_delete_channels.append([])\n",
" for i in range(X.shape[1]):\n",
" if (np.array_equal(part_data[:, i], np.zeros(finish - start))):\n",
" X_delete_channels[-1].append(i)\n",
" start = finish\n",
" return X_delete_channels "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load train data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train_dir = \"/mnt/radi4/data/train/\"\n",
"train_names = [x for x in os.listdir(train_dir) \n",
" if x[-3:] == \".h5\"]\n",
"data = [x for x in load_file.map([train_dir + f for f in train_names]) if x is not None]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_train = np.concatenate([x[0] for x in data], axis = 0)\n",
"X_train_size = np.cumsum(np.array([x[1] for x in data]))\n",
"X_train_names = np.array([x[2] for x in data])\n",
"X_train_delete_channels = find_bad_channels(X_train, X_train_size)\n",
"del data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load test data"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def load_new_data():\n",
" eeg_dir = \"/mnt/radi4/data/test/\"\n",
" eeg_names = [x for x in os.listdir(eeg_dir) \n",
" if x[-3:] == \".h5\"]\n",
" data = [x for x in load_file.map([eeg_dir + f for f in eeg_names]) if x is not None]\n",
" return np.concatenate([x[0] for x in data], axis = 0), np.cumsum(np.array([x[1] for x in data])), np.array([x[2] for x in data])"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_test, X_test_size, X_test_names = load_new_data()\n",
"X_test_delete_channels = find_bad_channels(X_test, X_test_size)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# PCA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Метод главныx компонент - бейзлайн, который в идеале надо побить с помощью NN"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class L2RatioTester(object):\n",
" def metric(self, y_true, y_pred):\n",
" l2ratio = np.sum((y_true - y_pred)**2) / np.sum(y_true**2)\n",
" return np.sqrt(l2ratio) * 100"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"components_count = [1, 2, 4, 8, 12, 29, 40, 45, 50, 55, 58]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"@lview.parallel()\n",
"def calc_metric(n_components):\n",
" from sklearn.decomposition import PCA\n",
" pca = PCA(n_components=n_components)\n",
" pca.fit(X_train)\n",
" return (tester.metric(X_test, pca.inverse_transform(pca.transform(X_test)))\n",
" , tester.metric(X_train, pca.inverse_transform(pca.transform(X_train))))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"lview['X_train'] = X_train[:200000]\n",
"lview['X_test'] = X_test[:200000]\n",
"lview['L2RatioTester'] = L2RatioTester"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## L2Ratio On PCA"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 44 ms, sys: 12 ms, total: 56 ms\n",
"Wall time: 11.5 s\n"
]
}
],
"source": [
"%%time \n",
"lview['tester'] = L2RatioTester()\n",
"l2_ratio = calc_metric.map(components_count)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "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\niKwaZ04jIiKyIgxuIiIiK8LgJiIisiIMbiIiIivC4CYiIrIiDG4iIiIrwuAmIiKyIgxuIiIiKyLQ\narVacxdBRERE+uERNxERkRVhcBMREVkRBjcREZEVYXATERFZEQY3ERGRFWFwExERWRGrD+6DBw9i\n0aJFWLhwIZKSkq55XKvV4tVXX8XChQuxdOlSZGdnm6FKyzdUH7du3YqlS5di6dKluOuuu5CTk2OG\nKq3DUL3slZWVhSlTpuDnn382YXXWRZ9epqen47bbbkNcXBzuu+8+E1doHYbqY0NDAx5++GHceuut\niIuLw/fff2+GKi3fc889h+joaCxZsqTfx02WN1or1tHRoV2wYIG2sLBQ29raql26dKn2woULfZ6z\nf/9+7YMPPqjt6urSnjhxQrt8+XIzVWu59OljZmamtra2VqvVdveUfeyfPr3sfd6KFSu0q1at0v70\n009mqNTy6dPLuro67eLFi7UlJSVarVarraqqMkepFk2fPr7//vva119/XavVarUajUYbERGhbW1t\nNUe5Fu3o0aPa06dPa+Pi4vp93FR5Y9VH3FlZWfD19cW4ceNgZ2eHuLg47Nmzp89z9uzZg/j4eAgE\nAsyYMQP19fVQq9Vmqtgy6dPHmTNnQiqVAgBmzJiB8vJyc5Rq8fTpJQB88cUXWLRoETw8PMxQpXXQ\np5fbtm3DwoULoVKpAID97Ic+fRQIBGhqaoJWq0VTUxOkUilEIpGZKrZcERERut+D/TFV3lh1cFdU\nVECpVOq+VygUqKioGPQ5SqXymueMdfr08WqbNm3CvHnzTFGa1dH3Z3L37t24++67TV2eVdGnl/n5\n+aivr8eKFStw++23Izk52dRlWjx9+njvvfciNzcXN9xwA2699VasW7cOQqFVx4NZmCpv+CcVDcuR\nI0ewadMmfPXVV+YuxWqtX78eTz31FH8xGkBnZyeys7Px2WefoaWlBXfddRdCQ0MxYcIEc5dmVX75\n5RcEBwfj888/R2FhIRISEhAeHg5nZ2dzl0b9sOrgVigUfU7ZVlRUQKFQDPqc8vLya54z1unTRwDI\nycnBn//8Z3z44Ydwc3MzZYlWQ59enj59Gk888QQAoKamBgcOHIBIJMLNN99s0lotnT69VCqVcHV1\nhVgshlgsRnh4OHJychjcV9Gnj5s3b0ZiYiIEAgF8fX3h4+ODvLw8TJ8+3dTlWjVT5Y1V/8k/bdo0\n5Ofno6ioCG1tbUhJSUFMTEyf58TExCA5ORlarRYnT56ERCKBXC43U8WWSZ8+lpaW4rHHHsPrr7/O\nX54SajkAAAOhSURBVIqD0KeXe/fu1X0tWrQIL730EkO7H/r0csGCBcjMzERHRwcuX76MrKwsBAQE\nmKliy6RPH728vJCWlgYAqKqqwqVLl+Dj42OOcq2aqfLGqo+4RSIRXnzxRaxatQqdnZ1YtmwZgoKC\n8PXXXwMA7r77bsyfPx8HDhzAwoUL4ejoiL/+9a9mrtry6NPH9957D7W1tXj55ZcBADY2Nti8ebM5\ny7ZI+vSS9KNPLwMCAnTjskKhEMuXL8fEiRPNXLll0aePjzzyCJ577jksXboUWq0WTz31FNzd3c1c\nueV54okncPToUdTU1GDevHl47LHH0NHRAcC0ecNlPYmIiKyIVZ8qJyIiGmsY3ERERFaEwU1ERGRF\nGNxERERWhMFNRERkRRjcRGNEXV0dpk+fjldffVW37d1338Xf/va3IV+7efNmrFmzxpjlEZGeGNxE\nY8T27dsRGhqKlJQUtLW1mbscIhohBjfRGPH999/jkUcewaRJk/pdsWzz5s1ISEjAww8/jN/85jdY\nuXJlnwUSGhsb8fjjjyMuLg533XUXKisrAQDnzp3DPffcg//+7//Gb37zG3z22Wem+khEYxKDm2gM\nyMnJQW1tLWbPno3bb78d33//fb/Py8zMxDPPPIMff/wRkZGRWL9+ve6xX3/9FX/605+QkpKCwMBA\nfPnllwAAb29vfPbZZ/jhhx/w3Xff4dtvv0Vubq5JPhfRWMTgJhoDNm3ahNtuuw0CgQCxsbHIysrq\nd7nBWbNmwd/fHwBwxx134MiRI7rHZs6cCS8vLwBAaGgoCgsLAQAtLS14/vnnsXTpUtx9991Qq9XI\nyckxwaciGpuseq5yIhpaW1sbtm/fDjs7O2zZsgUA0N7ePuy55u3t7XX/trGxQWdnJwDgrbfegkwm\nw//+7/9CJBLh/7d3xyYSAmEYhr/AEgxMJzdREGzCJsxswB7EzAKsQLECQQxFLMBIazAykQsW9m45\nuE2EY5b3CYdhmD/6+GcGJk1Tned5XwEAXtBxAx+u73sZYzSO4/NXsrqu1XXdr7nLsmjbNkmPO/E4\njt+ufxyHPM+T4zha11XzPN9dAoAf6LiBD9e2rZIkeRkLgkDXdWmaJvm+/xwPw1BFUWjfd7muq7Is\n366fZZnyPFfTNDLGKIqi22sA8I3fwQBIerwqH4ZBVVX991YA/IGjcgAALELHDQCARei4AQCwCMEN\nAIBFCG4AACxCcAMAYBGCGwAAixDcAABY5AvEPPdu3QXlzwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f4615177128>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(components_count) / 58.\n",
"y = np.array([i[0] for i in l2_ratio])\n",
"plt.plot(x, y, label = \"PCA on Test\", marker='o')\n",
"plt.title(\"L2Ratio vs Alpha Test\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"L2Ratio\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "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\na9YsfPHFF/Dz88P8+fOxZs0aREREDPgaBrd1sS1Ng+1oOmxL02A7Dk1TexknzlciK7cKucW16EnM\nQKUMKm9XHD/fd8b6b+4Yd83hbVNLnmZnZyM4OBhBQUEAgOTkZGRmZg4a3ERERNag8nJF0uTRSJo8\nGvXNbTiZq19+9dSlapT0c80c0G+sYs5bzCwe3BUVFfD39zc89vPzQ3Z29qCv8fZ2g0Qy/NVvBvuL\nhYaHbWkabEfTYVuaBtvReEoA4cEK3HVbNC63duDel7eivzHrMm2TWdvVLian1dQ0D/s1HAIyHbal\nabAdTYdtaRpsx2sT6Cvrd6Z6gEJ2ze06WPBb/D5uPz8/lJeXGx5XVFTAz8++Vq0hIiJKTggZ4Hiw\nWT/X4sF9/fXXIz8/H0VFRWhra8PWrVuRmJho6TKIiIiuSfxYP/zmjnEYpXSHWCRglNLdJBPThmLx\noXKJRIJXX30VixcvRmdnJ+6++25ERkZaugwiIqJrFj/WD/Fj/Sx62cEq17inTZuGadOmWeOjiYiI\n7BrXKiciIrIjDG4iIiI7wuAmIiKyIwxuIiIiO8LgJiIisiMMbiIiIjvC4CYiIrIjDG4iIiI7YvH9\nuImIiOjqscdNRERkRxjcREREdoTBTUREZEcY3ERERHaEwU1ERGRHGNxERER2xO6De9++fZg1axZm\nzpyJtLS0Ps/rdDq8+eabmDlzJubNm4fTp09boUrbN1Q7btq0CfPmzcO8efNw3333IScnxwpV2oeh\n2rJHdnY2xo4dix9++MGC1dkXY9ry0KFDuPPOO5GcnIyHHnrIwhXah6HasaGhAU888QTuuOMOJCcn\n49tvv7VClbbvxRdfREJCAubOndvv8xbLG50d6+jo0M2YMUNXWFioa21t1c2bN0+Xm5vb65w9e/bo\nFi1apOvq6tIdP35cN3/+fCtVa7uMacdjx47pamtrdTqdvk3Zjv0zpi17zlu4cKFu8eLFuu+//94K\nldo+Y9qyrq5ON2fOHF1JSYlOp9PpqqqqrFGqTTOmHT/55BPdu+++q9PpdDqtVqubNGmSrrW11Rrl\n2rTDhw/rTp06pUtOTu73eUvljV33uLOzsxEcHIygoCBIpVIkJycjMzOz1zmZmZlISUmBIAgYP348\n6uvrodForFSxbTKmHSdMmAC5XA4AGD9+PMrLy61Rqs0zpi0B4Ouvv8asWbOgUCisUKV9MKYtN2/e\njJkzZ0KtVgMA27MfxrSjIAhoamqCTqdDU1MT5HI5JBKJlSq2XZMmTTL8HuyPpfLGroO7oqIC/v7+\nhsd+fn6oqKgY9Bx/f/8+5zg6Y9rxSunp6Zg6daolSrM7xv5M7ty5E/fff7+ly7MrxrRlfn4+6uvr\nsXDhQtx1113IyMiwdJk2z5h2fPDBB3Hx4kXccsstuOOOO/Dyyy9DJLLreLAKS+UN/6SiYfn555+R\nnp6Ov//979YuxW6tXr0aK1eu5C9GE+js7MTp06fx5ZdfoqWlBffddx9iY2MRGhpq7dLsyo8//oiY\nmBh89dVXKCwsRGpqKiZOnAh3d3drl0b9sOvg9vPz6zVkW1FRAT8/v0HPKS8v73OOozOmHQEgJycH\nv//97/HXv/4V3t7elizRbhjTlqdOncKzzz4LAKipqcHevXshkUhw2223WbRWW2dMW/r7+8PLywtu\nbm5wc3PDxIkTkZOTw+C+gjHtuGHDBixZsgSCICA4OBijRo1CXl4ebrjhBkuXa9cslTd2/Sf/9ddf\nj/z8fBQVFaGtrQ1bt25FYmJir3MSExORkZEBnU6HEydOwMPDAyqVykoV2yZj2rG0tBTPPPMM3n33\nXf5SHIQxbblr1y7Dv1mzZuG1115jaPfDmLacMWMGjh07ho6ODly+fBnZ2dkIDw+3UsW2yZh2DAgI\nwMGDBwEAVVVVuHTpEkaNGmWNcu2apfLGrnvcEokEr776KhYvXozOzk7cfffdiIyMxD/+8Q8AwP33\n349p06Zh7969mDlzJlxdXfHWW29ZuWrbY0w7fvzxx6itrcXrr78OABCLxdiwYYM1y7ZJxrQlGceY\ntgwPDzdclxWJRJg/fz6ioqKsXLltMaYdly5dihdffBHz5s2DTqfDypUr4ePjY+XKbc+zzz6Lw4cP\no6amBlOnTsUzzzyDjo4OAJbNG27rSUREZEfseqiciIjI0TC4iYiI7AiDm4iIyI4wuImIiOwIg5uI\niMiOMLiJHERdXR1uuOEGvPnmm4ZjH330Ed55550hX7thwwYsW7bMnOURkZEY3EQOYsuWLYiNjcXW\nrVvR1tZm7XKI6CoxuIkcxLfffoulS5ciOjq63x3LNmzYgNTUVDzxxBO4/fbb8fDDD/faIKGxsRHL\nly9HcnIy7rvvPlRWVgIAzp07hwceeAD/9V//hdtvvx1ffvmlpb4lIofE4CZyADk5OaitrcWUKVNw\n11134dtvv+33vGPHjuGFF17Atm3bMHnyZKxevdrw3C+//ILf/e532Lp1KyIiIvC3v/0NABAYGIgv\nv+BQzYgAAAGVSURBVPwS3333Hf71r3/hm2++wcWLFy3yfRE5IgY3kQNIT0/HnXfeCUEQkJSUhOzs\n7H63G7zxxhsRFhYGAFiwYAF+/vlnw3MTJkxAQEAAACA2NhaFhYUAgJaWFrz00kuYN28e7r//fmg0\nGuTk5FjguyJyTHa9VjkRDa2trQ1btmyBVCrFxo0bAQDt7e3DXmve2dnZ8LVYLEZnZycAYM2aNVAq\nlfjjH/8IiUSCxx57DK2trab7BoioF/a4iUa4zMxMhIaGYt++fYZdyT7//HN89913fc7NyspCfn4+\nAP018SlTpgz5/g0NDfD394dEIsH58+dx9OhRU38LRHQF9riJRrhvv/0W8+bN63UsLi4OXV1dOHz4\nMK677jrD8QkTJuCdd95BQUEBfH198d577w35/k8++SReeOEFpKenIzQ0FJMmTTL590BEv+LuYEQE\nQD+rfM+ePfjwww+tXQoRDYJD5URERHaEPW4iIiI7wh43ERGRHWFwExER2REGNxERkR1hcBMREdkR\nBjcREZEdYXATERHZkf8fVJC+kc7TIroAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f4616a2cda0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(components_count) / 58.\n",
"y = np.array([i[1] for i in l2_ratio])\n",
"plt.plot(x, y, label = \"PCA on Train\", marker='o')\n",
"plt.title(\"L2Ratio vs Alpha Train\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"L2Ratio\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dense NN Students"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Команда Девушек"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calc L2Ratio on Train"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def predict(autoencoder, X, scaler):\n",
" X_predict = scaler.inverse_transform(autoencoder.predict(X))\n",
" return X_predict"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"scaler_train = StandardScaler()\n",
"X_train_scaled = scaler_train.fit_transform(X_train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"enc_dims = [1, 2, 4, 8, 12, 29, 40, 45, 50, 55, 58]\n",
"l2_loss_by_files = []\n",
"for enc_dim in enc_dims:\n",
" adds = []\n",
" name = \"model/Girls_model_\"\n",
" autoencoder = load_model(name + str(enc_dim) + \".h5\")\n",
" start = 0\n",
" for i in range(X_train_size.shape[0]):\n",
" finish = X_train_size[i]\n",
" part_data = X_train[start : finish]\n",
" part_data_scaled = X_train_scaled[start : finish]\n",
" part_data_pred = predict(autoencoder, part_data_scaled, scaler_train)\n",
" add = np.sum((np.delete(part_data_pred, X_train_delete_channels[i])-\n",
" np.delete(part_data, X_train_delete_channels[i]))**2)\n",
" print(i, add, X_train_names[i])\n",
" adds.append(add)\n",
" start = finish\n",
" \n",
" l2_loss_by_files.append(adds.copy()) \n",
" print(enc_dim)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"bad_files = [7, 26]"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"iters = []\n",
"start = 0\n",
"for finish in X_train_size:\n",
" iters.append((start, finish))\n",
" start = finish"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"all_files_data = [X_train[itter[0] : itter[1]] for itter in iters]"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 94.54468009, 92.4829269 , 102.41038048, 102.94439192,\n",
" 93.75631101, 91.13478819, 89.85311427, 89.30573459,\n",
" 88.31085371, 88.43064245, 88.1744697 ])"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"div = np.sum(np.sum(all_files_data[i]**2)\n",
" for i in np.delete(np.arange(len(all_files_data)), bad_files))\n",
"l2_train = np.sum(np.delete(l2_loss_by_files, bad_files, axis = 1), axis = 1) / div\n",
"l2_train = np.sqrt(l2_train) * 100\n",
"l2_train"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAG5CAYAAAA3ci11AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8nGWd///3Pcd7JplDMpmk54KlpWC3UqTQIuJSBBZa\npBaLuCwiUuqCoH7xhysoVAqKCFtxXQ/UylIV5NdKKXJYt4BABTlVUPS7IAVKaWmb88wkmfPh+8ck\n0wZ6SNPMTGbm9Xw8eNjcM7nvq81lmTfX9bk+Ri6XywkAAAAAUFUs5R4AAAAAAGDkEfYAAAAAoAoR\n9gAAAACgChH2AAAAAKAKEfYAAAAAoAoR9gAAAACgChH2AACHZN68efrjH/9Ysuddf/31+tGPflSy\n5+3LkiVLdP/995d7GPv0/PPP6+STTx7x9wIAKgdhDwAwYu6//34tWrRIxx57rE4++WR973vfUzqd\nHvb91q1bp8985jODri1fvlxf/OIXD2mcRx55pLZu3XpI91i1apU++clPHtI9RsK6det05JFH6pFH\nHin3UAAAowxhDwAwYmKxmK699lo999xzWrt2rZ577jndeeede33voYTAYhvNY3uv+++/X36/X+vX\nry/3UAAAowxhDwAwYv75n/9Zxx13nBwOh1paWnT22WfrpZdeKrw+b948rVy5UmeffbaOOeYYpdNp\nrVy5Uh//+Mc1a9YsnXXWWXr00UclSW+++aaWLVumP//5z5o1a5aOO+44SdLXv/51ff/73y/cc82a\nNTrttNN0/PHH61//9V/V2tq63zFecMEFkqRzzjlHs2bN0iOPPFLYxrhy5Up95CMf0TXXXKNwOKwv\nfOELmjNnjmbPnq0vfOEL2rVrV+E+F154odauXStp9wrkLbfcotmzZ2vevHl66qmn9vr8lStX6ktf\n+tKgazfddJNuuummwr1OPfVUzZo1S/PmzdNvf/vbff5e3n33Xb344otavny5nn76abW3t+/zvfPm\nzdMdd9yhs846S7Nnz9Y111yjRCIx6D133nmn5s6dq5NOOkn33Xdf4fqTTz6phQsX6thjj9XHPvYx\n/fCHP9zncwAAowdhDwBQNC+++KKOOOKIQdcefvhhrVy5Ups2bZLNZtPEiRN19913609/+pOuuOIK\nXX311Wpra9OUKVN0ww036JhjjtHLL7+sTZs2ve/+zz77rP793/9dt99+u55++mmNHz9eV1111X7H\ndPfdd0uSHnjgAb388ss666yzJEkdHR0Kh8N64okndOONNyqbzWrRokV64okn9MQTT8jpdGr58uX7\nvO8rr7yiww8/XM8995yWLFmib3zjG8rlcu973/z58/XUU0+pt7dXkpTJZPS73/1OCxYsUDQa1U03\n3aSf/exnevnll3XvvffqqKOO2ucz169frxkzZuiMM87QlClT9OCDD+739/7ggw/q5z//uR599FFt\n2bJFP/7xjwuvdXR0qKenRxs3btS3v/1tLV++XOFwWJLkcrl0yy23aNOmTbrjjjv061//Wo899th+\nnwUAKD/CHgCgKH7zm9/ob3/7mz7/+c8Pun7hhRdq7NixMk1TknTmmWeqpaVFFotFZ511liZPnqxX\nXnllSM948MEHde655+qDH/ygHA6HrrrqKv35z3/W9u3bD3q8FotFX/rSl+RwOGSaphoaGnTGGWfI\n5XKpvr5el112mV588cV9fv+4ceN03nnnyWq16pOf/KTa29vV0dHxvveNHz9eRx99dCEsPffcczJN\nU8ccc0xhHJs3b1Y8Hldzc7OmTp26z2c+8MADWrBggSRpwYIFB9zKecEFF2js2LHy+/267LLL9PDD\nDxdes9ls+uIXvyi73a6Pfexjcrvd2rJliyTphBNO0JFHHimLxaLp06dr/vz5euGFF/b7LABA+RH2\nAAAj7rHHHtOKFSv0s5/9TI2NjYNeGzt27KCv169fr3POOUfHHXecjjvuOG3evFnd3d1Dek5bW5vG\njx9f+Lqurk5+v/+AWzn3pqGhQU6ns/B1LBbT9ddfr1NOOUXHHnusLrjgAkUiEWUymb1+f1NTU+HX\nLpdLkhSNRvf63gULFuihhx6SJD300EOFwOZ2u/X9739f9957r0466SQtXbpUb7755l7v8ac//Unb\nt2/X/PnzC/d8/fXX9eqrr+7z97jnn/24cePU1tZW+Nrv98tmsw36PQyM/y9/+YsuvPBCzZkzRx/+\n8Id17733DvlnBAAoH8IeAGBEbdy4Ud/85jf105/+VEceeeT7XjcMo/Drd999V9/85jd13XXX6fnn\nn9emTZsGrWTt+d69aW5u1rvvvlv4OhqNKhQKqaWl5aDH/d5n3XnnndqyZYvWrFmjl156qbD9c29b\nMw/WmWeeqRdeeEG7du3So48+qrPPPrvw2kc/+lH913/9l55++ml94AMf0HXXXbfXe6xfv165XE4L\nFy7URz7yEZ133nmStN92EDt37iz8eseOHWpubh7SeL/61a/q1FNP1VNPPaU//elPOv/880fkzwEA\nUFyEPQDAiHn22Wd19dVX64c//KFmzpx5wPfHYjEZhlFY/bvvvvu0efPmwuuBQECtra1KJpN7/f4F\nCxZo3bp1evXVV5VMJrVixQrNnDlTEyZM2O9zm5qatG3btv2+p6+vT06nU16vV6FQSP/5n/95wN/P\nUDU2Nur444/XNddcowkTJmjKlCmS8nVzjz32mKLRqBwOh9xutyyW9/+rOpFI6L//+7+1fPlyrV+/\nvvDPddddp4ceemifp4nec8892rVrl0KhkH76058W6hUPpK+vTz6fT06nU6+88kphVRIAMLoR9gAA\nI+bHP/6xenp6tHTpUs2aNUuzZs3SkiVL9vn+I444Qp///Od1/vnn68QTT9Trr7+uY489tvD6nDlz\ndMQRR+ikk07SCSec8L7vP/HEE/XlL39ZV155pU466SRt27Zt0Emd+3LFFVfo61//uo477rh99qe7\n6KKLlEgkNGfOHH3605/WRz/60SH8CQzdggUL9Mc//rGwhVOSstms7rrrLn30ox/V8ccfrxdffFHf\n+ta33ve9jz32mEzT1MKFCxUMBgv/nHvuucpkMvrDH/6wz2d+/vOf18c//nFNmjRJl1122ZDGumzZ\nMv3Hf/yHZs2apR/96Ec688wzh/V7BgCUlpFjHwYAAFVv3rx5uummm3TiiSeWeygAgBJhZQ8AAAAA\nqpDtwG8BAKCybNq0SZdeeuleX3v55ZdLPBoAAMqDbZwAAAAAUIXYxgkAAAAAVaiit3G2t/cU/RkN\nDW51d++9KS4wkphrKBXmGkqFuYZSYJ6hVEbrXAsGPft8jZW9A7DZrOUeAmoEcw2lwlxDqTDXUArM\nM5RKJc41wh4AAAAAVCHCHgAAAABUIcIeAAAAAFQhwh4AAAAAVCHCHgAAAABUIcIeAAAAAFQhwh4A\nAAAAVCHCHgAAAABUIcIeAAAAAFQhwh4AAACAotje3qsnXtqu3z69RU+8tF3b23sP+Z6nnfZRSdLm\nzX/XF75wsf7lX87TRRedr8cf33DQ99q48Ult2fJW4etVq36qF198/qDvs2bNPYrH4wf9fcN93lDZ\ninZnAAAAADVre3uvNr3WVvg63JcsfD0hWH/I93c6TX3zmzdo4sRJ6uho1yWX/IuOP36uPB7PoPdl\nMhlZrda93uMPf3hSJ554kg4//AOSpCVL/nVYY1mz5tc6/fSzZJrm+17b3/OH+7yhIuwBAAAAOGh/\n29KpHR3Rfb6+eXtI8WTmfdff7ejT1An+vX7PuCa3ZhweGNLzJ02aXPh1U1NQfn+jQqFueTwefepT\nZ2vevNO0adPz+ud//qyi0ah++9v7lUqlNGHCBF133Y3avPnvevrpjfrzn1/S6tV36tvf/p7uumuV\nTjzxJJ1yyse1adML+tGPblcmk9H06Ufrllu+s9dxrF17rzo62vWlL31BPp9fP/zhHTrttI/qE59Y\npE2bXtBVV/2bXnrpRT3zzB+USMQ1Y8aH9LWvXSvDMPTtb3+r8LxPfepsnXnmAj3zzEal02ndeOMt\nmjz5sCH9WewL2zgBAAAAjLjEXoLe/q4fiv/9378pnU5p/PgJhWs+n0933nm3Pv7xM/Sxj52iVat+\nodWrf63Jkw/XQw+t1z/8w4d00kkn6/LLv6S77rpn0PcmEgl95zs36IYbbtYvfvH/K5PJ6J577tnr\nsxcvPl9NTUH9x3/coR/+8A5JUiwW09FHz9Dq1b/Whz50jM499zytWvUL/fKXa5RMxvXMM3/Y670G\nxrxw4af061//8pD/XFjZQ8Xb3t6rzdtC6omm5HHbNXWif0S2BgAAAGDfZhwe2O8qnN1qKNyXfN91\nX51Dpxw7YS/fMTwdHR268cbr9Y1v3CCLZfda1qmnnl749Vtvvamf/ewn6u3tUSwW0/HHz9nvPd95\nZ6vGjh1XWD0888wFevjh+zV//rlDGpPVatU//uO8wtcvvbRJd9/9CyUScUUiER122BSddNLJ7/u+\nj30s/z1HHnmUnnrqiSE9a38Ie6ho29t79cKrrUokM3LYrSO+FxwAAADDM3Wif1DN3p7XR0pfX6++\n9rUva+nSyzVjxj8Mes00XYVff+c7N+g737lNU6dO0yOPPKiXX/7TiI1hbxwOR6FOL5FI6N///Rat\nWvULtbSM0c9/foeSycRev89ud0iSrFaLMpn0IY+DbZyoOIlkRjs6+vS3tzr18LNva/O2sLa29qi1\na/ee8c3bQuUbIAAAADQhWK/jpjfLV+eQxTDkq3PouOnNI/Yf5FOplK699mr90z/N1ymnfHy/741G\n+9TU1KR0Oq0NG/67cN3tdisafX/d4aRJk7Vz5w5t375NkvQ///OIZs+evc/75+/Tt9fXksn86qbf\n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\nzjtPN998s4rFoqTmzASG4zhOowcBAAAAADi+2MYJAAAAAC2IsAcAAAAALYiwBwAAAAAtiLAHAAAA\nAC2IsAcAAAAALYiwBwCApFgspiVLlujuu++uXfvFL36h++677z2fu3HjRn3zm988kcMDAOCYEfYA\nAJD01FNPaenSpXr66aeVz+cbPRwAAD4wwh4AAJI2bNigm266Saeeeqo2bdp02OMbN27Utddeqxtv\nvFEXX3yxvvKVr2hgYKD2eDKZ1K233qqVK1fqqquu0tDQkCTpzTff1Be/+EVdfvnluvjii7V27dp6\nvSUAwAxH2AMAzHjbtm1TNBrVOeecoyuuuEIbNmw44n2vvvqq7rjjDj3zzDP6xCc+oXvuuaf22Ouv\nv67vfOc7evrpp3XKKafot7/9rSSpt7dXa9eu1eOPP65169bpscce044dO+ryvgAAMxthDwAw461f\nv16XXnqpDMPQhRdeqC1btkxatRvz8Y9/XCeffLIkafXq1Xr55Zdrj5111lmaM2eOJGnp0qXavXu3\nJCmbzeq73/2uVq1apauvvlqDg4Patm1bHd4VAGCmsxs9AAAAGimfz+upp56S2+3Wk08+KUkqFAra\nuHHjMb2Ox+OpfW5ZlkqlkiTpgQceUHd3t37605/Ktm197WtfUy6XO35vAACAo2BlDwAwo23atEkL\nFizQiy++qOeee07PPfecfvOb3+jxxx8/7N5//vOf2rVrl6TKGb9zzjnnPV8/kUho9uzZsm1bb731\nll555ZXj/RYAADgiVvYAADPahg0btGrVqknXPvaxj6lcLmvz5s0644wzatfPOuss3XfffXrnnXfU\n1dWl+++//z1f/+tf/7ruuOMOrV+/XgsWLNCyZcuO+3sAAOBIDMdxnEYPAgCA6W7jxo16/vnn9fOf\n/7zRQwEAYErYxgkAAAAALYiVPQAAAABoQazsAQAAAEALIuwBAAAAQAsi7AEAAABACyLsAQAAAEAL\nIuwBAAAAQAv6/wHG63QKbZYVAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f4c369a1cf8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(enc_dims) / 58.\n",
"plt.figure(figsize=(15, 7))\n",
"\n",
"y = np.array(l2_train)\n",
"plt.plot(x, y, marker='o', alpha = 0.5, label = \"l2ratio_train\")\n",
"\n",
"plt.title(\"l2ratio_train vs Alpha\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"l2ratio\")\n",
"plt.legend(loc = 'best')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calc L2Ratio on Test"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"scaler_test = StandardScaler()\n",
"X_test_scaled = scaler_test.fit_transform(X_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"enc_dims = [1, 2, 4, 8, 12, 29, 40, 45, 50, 55, 58]\n",
"l2_loss_by_files = []\n",
"for enc_dim in enc_dims:\n",
" adds = []\n",
" name = \"model/Girls_model_\"\n",
" autoencoder = load_model(name + str(enc_dim) + \".h5\")\n",
" start = 0\n",
" for i in range(X_test_size.shape[0]):\n",
" finish = X_test_size[i]\n",
" part_data = X_test[start : finish]\n",
" part_data_scaled = X_test_scaled[start : finish]\n",
" part_data_pred = predict(autoencoder, part_data_scaled, scaler_test)\n",
" add = np.sum((np.delete(part_data_pred, X_test_delete_channels[i])-\n",
" np.delete(part_data, X_test_delete_channels[i]))**2)\n",
" print(i, add, X_test_names[i])\n",
" adds.append(add)\n",
" start = finish\n",
" \n",
" l2_loss_by_files.append(adds.copy()) \n",
" print(enc_dim)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"bad_files = []"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"iters = []\n",
"start = 0\n",
"for finish in X_test_size:\n",
" iters.append((start, finish))\n",
" start = finish"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"all_files_data = [X_test[itter[0] : itter[1]] for itter in iters]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 107.00392903, 106.99001904, 106.36494733, 106.66164466,\n",
" 105.45698409, 103.46001248, 100.55542331, 99.78294302,\n",
" 97.97161861, 97.9765601 , 98.00451304])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"div = np.sum(np.sum(all_files_data[i]**2)\n",
" for i in np.delete(np.arange(len(all_files_data)), bad_files))\n",
"l2_test = np.sum(np.delete(l2_loss_by_files, bad_files, axis = 1), axis = 1) / div\n",
"l2_test = np.sqrt(l2_test) * 100\n",
"l2_test"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAG5CAYAAAA3ci11AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8XHW9//H3mX1LZjJL9raUrnQPdqct0CpeoUgFBa5c\nF1z6k6vcq6g/QcUFuXpFRC7ovVoF9T68XlTAXi/gTy1SoKWlLdCVLumePZNlJslMMplM5vdH2kCF\ntmmbmcnyej4eeTw658yc80n4MpN3vp/zPUY6nU4LAAAAADCimHJdAAAAAABg8BH2AAAAAGAEIuwB\nAAAAwAhE2AMAAACAEYiwBwAAAAAjEGEPAAAAAEYgwh4AYNAsX75cL730UtbO97WvfU0/+tGPsna+\n4eDll1/WsmXLBv25AIDhh7AHAMiI3//+97r++ut16aWXatmyZbrvvvvU09Nz3sd78skn9fd///en\nbLvnnnv06U9/+oLqnDJlio4dO3ZBx5Ckhx9+WF/4whcu+DgD9eSTT2rKlCl65plnsnZOAMDwQtgD\nAGREZ2envvzlL2vz5s363e9+p82bN+vRRx992+deSAgcrX7/+9/L5/Np7dq1uS4FADBEEfYAABnx\nwQ9+UHPnzpXNZlNRUZGuvfZavfrqq/37ly9frjVr1ujaa6/VnDlz1NPTozVr1uid73ynKioqdPXV\nV+svf/mLJOnQoUP6+te/ru3bt6uiokJz586VJN155536wQ9+0H/M3/72t3rXu96l+fPn61Of+pQa\nGhrOWOMtt9wiSbruuutUUVHRP0v23HPP6brrrtPcuXN18803a9++ff2vWbNmjZYuXaqKigq9+93v\n1qZNm/TCCy/oJz/5if74xz+qoqJC733ve99yrjVr1uif/umfTtl277336t5775XUN1O3YsUKVVRU\naPny5frDH/5w2rpramq0detW3XPPPdqwYYPC4fBpn7t8+XL95Cc/0dVXX6158+bprrvuUiKROOU5\njz76qBYtWqQlS5boiSee6N++fv16rVq1Spdeeqkuv/xyPfzww6c9DwBgCEoDADBIrrzyyvTGjRvf\ndt9tt92W/t73vnfKc9/73vema2tr052dnel0Op1+5pln0vX19elUKpV++umn07Nnz043NDSk0+l0\n+oknnkjffPPNpxzzS1/6UvqBBx5Ip9Pp9EsvvZSeP39+evfu3elEIpG+55570h/84AfPWvPkyZPT\nR48e7X+8Z8+e9MKFC9Pbt29P9/T0pJ988sn0lVdemU4kEulDhw6lly1blq6vr0+n0+l0VVVV+tix\nY+l0Op1+6KGH0p///OdPe57q6ur0rFmz0u3t7el0Op3u6elJX3bZZenXXnstHYvF0hUVFelDhw6l\n0+l0uqGhIX3gwIHTHuuHP/xh+oYbbkin0+n0ypUr04888kj/vs2bN6eXLl3a//jKK69MX3PNNena\n2tp0a2tr+qabbur/mW3evDl9ySWXpB988MF0d3d3ev369elZs2alI5FI//59+/alU6lUeu/evelF\nixal//KXv5z1ZwoAGBqY2QMAZNzjjz+u3bt362Mf+9gp2z/0oQ+ppKREDodDkvSe97xHRUVFMplM\nuvrqqzVu3Djt3LlzQOf43//9X91www2aPn26bDab7rjjDm3fvl3V1dXnVOtvfvMb3XTTTZo9e7bM\nZrPe9773yWq1avv27TKbzeru7tahQ4eUTCZVXl6usWPHDui4ZWVlmjZtmtatWydJ2rx5sxwOh+bM\nmSNJMplMqqysVFdXlwoLCzVp0qTTHut//ud/tHLlSknSypUrz9rKecstt6ikpEQ+n0+33Xabnn76\n6f59FotFn/70p2W1WnX55ZfL5XLpyJEjkqQFCxZoypQpMplMmjp1qq655hpt2bJlQN8vACD3CHsA\ngIxat26dHnjgAf30pz+V3+8/ZV9JSckpj9euXdvfPjl37lxVVlaqtbV1QOdpbGxUWVlZ/2O32y2f\nz3fWVs6/VVtbq5///Of9NcydO1f19fVqbGzUuHHj9OUvf1kPP/ywFi9erM997nPndPyVK1fqqaee\nkiQ99dRT/YHN5XLpBz/4gR577DEtWbJEq1ev1qFDh972GK+88oqqq6t1zTXX9B/zwIED2rt372nP\n++afc2lpqRobG/sf+3w+WSyW/sdOp1PxeFyStGPHDn3oQx/SwoUL9Y53vEOPPfbYgP97AAByj7AH\nAMiYF154QV/96lf14x//WFOmTHnLfsMw+v9dU1Ojr371q7r77rv18ssva9u2bafMbr35uW+nsLBQ\nNTU1/Y/j8bgikYiKiorOqeaSkhJ96lOf0rZt2/q/duzY0R/Mrr32Wv33f/+3nnvuORmGofvvv39A\n9Ul9M5dbtmxRfX29/vKXv+jaa6/t37d06VL9/Oc/14YNG3TxxRfr7rvvfttjrF27Vul0WqtWrdJl\n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\nKz8//7zb+Hy+L20DnM9o5kySampq9Mtf/lJ//vOflZWVFcuISBCjmbWqqio98sgjkqSOjg5t3bpV\nDodD3/nOd2KaFfFtNLNWUFCgzMxMpaWlKS0tTYsXL1ZNTQ1lD1/JaGZtw4YNeuCBB2QYhqZOnaqS\nkhLV1dVpwYIFsY6LBBZvnYC3dCXNnz9fx44dU319vSKRiDZt2qRrr732rG2uvfZabdy4UaZpau/e\nvcrIyFBeXp5FiRGPRjNnjY2NWr16tZ5//nleCOGijWbW3n333eH/li9frieffJKih69sNLN23XXX\naffu3RoYGFBPT4/27dunsrIyixIjXo1m1goLC7V9+3ZJUmtrqz777DOVlJRYERcJLN46AUf2JDkc\nDj3xxBO6//77NTg4qO9973sqLy/Xa6+9Jkm66667dM0112jr1q1atmyZUlNT9eyzz1qcGvFmNHP2\nhz/8QYFAQE899ZQkyW63a8OGDVbGRhwazawBY2E0s1ZWVja8hspms+n222/XrFmzLE6OeDOaWXvo\noYf0+OOPa+XKlTJNU48++qiys7MtTo5488gjj2jnzp3q6OjQ0qVLtXr1ag0MDEiKz05gmKZpWh0C\nAAAAADC2OI0TAAAAABIQZQ8AAAAAEhBlDwAAAAASEGUPAAAAABIQZQ8AAAAAEhBlDwAAScFgUAsW\nLNDTTz89fN3vf/97Pffccxe874YNG/TTn/50POMBAPCVUfYAAJD01ltvqaKiQps2bVIkErE6DgAA\nXxtlDwAASevXr9dDDz2k2bNna8uWLV+6fcOGDVq1apUefPBB3XjjjfrhD38ov98/fHtXV5cefvhh\nrVixQnfeeadaWlokSYcOHdLdd9+t7373u7rxxhu1Zs2aWD0lAMAkR9kDAEx6NTU1CgQCuvLKK3Xb\nbbdp/fr1I263e/duPfbYY3r77bf1jW98Q88888zwbfv379fPfvYzbdq0STNnztSrr74qSSouLtaa\nNWv05ptvau3atXrjjTdUW1sbk+cFAJjcKHsAgElv3bp1uuWWW2QYhq6//nrt27fvrKN2p11++eWa\nMWOGJOmOO+7Qjh07hm9btGiRCgsLJUkVFRU6ceKEJKm3t1c///nPtXLlSt11111qbm5WTU1NDJ4V\nAGCyc1gdAAAAK0UiEb311ltKSkrSP/7xD0lSf3+/NmzY8JX2k5ycPHzZbrdrcHBQkvTiiy/K6/Xq\nf/7nf+RwOPSjH/1IfX19Y/cEAAA4B47sAQAmtS1btmj69Ol6//339e677+rdd9/VX/7yF7355ptf\n2nbPnj06duyYpKE1fldeeeUF99/Z2amCggI5HA4dPnxYu3btGuunAADAiDiyBwCY1NavX6+VK1ee\ndd1ll12maDSqnTt3at68ecPXL1q0SM8995yOHz+u3NxcvfDCCxfc/49//GM99thjWrdunaZPn67K\nysoxfw4AAIzEME3TtDoEAAAT3YYNG/Tee+/pd7/7ndVRAAAYFU7jBAAAAIAExJE9AAAAAEhAHNkD\nAAAAgARE2QMAAACABETZAwAAAIAERNkDAAAAgARE2QMAAACABPT/Adm3CQdixba9AAAAAElFTkSu\nQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fee74d1ac18>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(enc_dims) / 58.\n",
"plt.figure(figsize=(15, 7))\n",
"\n",
"y = np.array(l2_test)\n",
"plt.plot(x, y, marker='o', alpha = 0.5, label = \"l2ratio_test\")\n",
"\n",
"plt.title(\"l2ratio_test vs Alpha\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"l2ratio\")\n",
"plt.legend(loc = 'best')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Петр"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Model"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"SAMPLES_COUNT_DEFAULT = 1000"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def predict(eeg_data_batch, autoencoder):\n",
" batch_mean = eeg_data_batch.mean(axis=2)\n",
" batch_std = eeg_data_batch.std(axis=2)\n",
" for i in range(batch_std.shape[0]):\n",
" for j in range(batch_std.shape[1]):\n",
" if (batch_std[i][j] == 0):\n",
" batch_std[i][j] = 1\n",
" \n",
" eeg_data_batch_norm = (eeg_data_batch - batch_mean.reshape(\n",
" eeg_data_batch.shape[0], eeg_data_batch.shape[1], 1\n",
" )) / batch_std.reshape(eeg_data_batch.shape[0], eeg_data_batch.shape[1], 1)\n",
" \n",
" eeg_data_batch_norm = torch.autograd.Variable(torch.FloatTensor(eeg_data_batch_norm)).cuda()\n",
" samples_len = eeg_data_batch_norm.size(2)\n",
" centered_samples_pos = samples_len // 2\n",
" centered_samples_from_batch = eeg_data_batch_norm[:, :, centered_samples_pos]\n",
" \n",
" autoencoded_batch = autoencoder(centered_samples_from_batch)\n",
" \n",
" \n",
" numpy_val = autoencoded_batch.data.cpu().numpy()\n",
" numpy_val = numpy_val * batch_std + batch_mean\n",
" return numpy_val"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def make_batch(eeg_data_file, channels_count, batch_size, batch_start, samples_count=SAMPLES_COUNT_DEFAULT):\n",
" result = np.zeros((batch_size, channels_count, samples_count))\n",
" for i in range(batch_size):\n",
" eeg_data = eeg_data_file\n",
" result[i] = eeg_data[:, batch_start - samples_count // 2: batch_start+samples_count // 2]\n",
" batch_start += 1\n",
" return np.array(result)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import torch.nn.functional as F\n",
"class PlainEncoderEEG(torch.nn.Module):\n",
" def __init__(self, input_channels, target_channels):\n",
" super().__init__()\n",
" self.dense1 = torch.nn.Linear(input_channels, 100)\n",
" self.dense2 = torch.nn.Linear(100, 80)\n",
" self.dense3 = torch.nn.Linear(80, 50)\n",
" self.dense4 = torch.nn.Linear(50, 40)\n",
" self.dense5 = torch.nn.Linear(40, target_channels)\n",
" \n",
" def forward(self, x):\n",
" x = x.cuda()\n",
" x = F.tanh(self.dense1(x))\n",
" x = F.tanh(self.dense2(x))\n",
" x = F.tanh(self.dense3(x))\n",
" x = F.tanh(self.dense4(x))\n",
" x = F.tanh(self.dense5(x))\n",
" return x\n",
" \n",
"class PlainDecoderEEG(torch.nn.Module):\n",
" def __init__(self, input_channels, target_channels):\n",
" super().__init__()\n",
" self.dense1 = torch.nn.Linear(input_channels, 30)\n",
" self.dense2 = torch.nn.Linear(30, 40)\n",
" self.dense3 = torch.nn.Linear(40, 50)\n",
" self.dense4 = torch.nn.Linear(50, 70)\n",
" self.dense5 = torch.nn.Linear(70, target_channels)\n",
" \n",
" \n",
" def forward(self, x):\n",
" x = x.cuda()\n",
" x = F.tanh(self.dense1(x))\n",
" x = F.tanh(self.dense2(x))\n",
" x = F.tanh(self.dense3(x))\n",
" x = F.tanh(self.dense4(x))\n",
" x = self.dense5(x)\n",
" return x\n",
" \n",
"class PlainAutoencoderEEG(torch.nn.Module):\n",
" def __init__(self, input_channels, target_channels):\n",
" super().__init__()\n",
" self.encoder = PlainEncoderEEG(input_channels, target_channels)\n",
" self.decoder = PlainDecoderEEG(target_channels, input_channels)\n",
" \n",
" def forward(self, x):\n",
" x = x.cuda()\n",
" x = self.encoder(x)\n",
" x = self.decoder(x)\n",
" return x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### L2Ratio on Train"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load_data"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import torch\n",
"import mne\n",
"import pathlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import h5py\n",
"\n",
"SAMPLES_COUNT_DEFAULT = 1000"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def read_eeg_file(file_path):\n",
" h5_file = h5py.File(file_path, 'r')\n",
" a_group_key = list(h5_file.keys())[0]\n",
" raw = np.array(h5_file[a_group_key])\n",
" return raw"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def find_bad_channels(part_data):\n",
" res = []\n",
" for i in range(part_data.shape[0]):\n",
" if (np.array_equal(part_data[i], np.zeros(part_data.shape[1]))):\n",
" res.append(i)\n",
" return res"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from typing import List\n",
"def pad_all_eeg_files(eeg_files, samples_count=SAMPLES_COUNT_DEFAULT) -> List[np.array]:\n",
" half_samples_count = samples_count // 2\n",
" result = []\n",
" for eeg_file in eeg_files:\n",
" eeg_data = eeg_file\n",
" eeg_data_padded = np.pad(eeg_data,\n",
" pad_width=[(0, 0), (half_samples_count, half_samples_count)],\n",
" mode='mean', stat_length=samples_count)\n",
" result.append(eeg_data_padded)\n",
" return result"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load Train data"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"DATA_FOLDER = pathlib.Path('/home/radi4/data/data/train')\n",
"all_files_data = []\n",
"all_files_names = []\n",
"bad_channels = []\n",
"for eeg_file_path in DATA_FOLDER.glob('*.h5'):\n",
" all_files_names.append(str(eeg_file_path))\n",
" all_files_data.append(read_eeg_file(str(eeg_file_path)))\n",
" bad_channels.append(find_bad_channels(all_files_data[-1]).copy())\n",
"channels_count = all_files_data[0].shape[0]\n",
"all_padded_data = pad_all_eeg_files(all_files_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Подсчет Loss L2Ratio on Train"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"enc_dims = [1, 2, 6, 29, 58]\n",
"l2_loss_by_files = []\n",
"for enc_dim in enc_dims:\n",
" autoencoder = torch.load(\"./Petr/Petr_dense_{}.pt\".format(str(enc_dim)))\n",
" autoencoder = autoencoder.cuda()\n",
" adds = []\n",
" for i in range(len(all_files_data)):\n",
" start = 0\n",
" res = np.zeros((0, 58))\n",
" while (start < all_files_data[i].shape[1]):\n",
" size = min(500, all_files_data[i].shape[1] - start)\n",
" batch = make_batch(all_padded_data[i], channels_count, size, start + SAMPLES_COUNT_DEFAULT // 2)\n",
" start += size\n",
" res = np.concatenate([res, predict(batch, autoencoder)], axis = 0)\n",
" res = res.T\n",
" add = np.sum((np.delete(res, bad_channels[i]) - np.delete(all_files_data[i], bad_channels[i]))**2)\n",
" print(i, add, all_files_names[i])\n",
" adds.append(add)\n",
" \n",
" l2_loss_by_files.append(adds.copy()) \n",
" print(enc_dim)"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"bad_files = [1, 7, 10, 12, 13, 16, 17, 25, 26, 29, 30]"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 100.26013812, 106.79863351, 94.02220921, 24.57817598,\n",
" 25.05194769])"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"div = np.sum(np.sum(all_files_data[i]**2)\n",
" for i in np.delete(np.arange(len(all_files_data)), bad_files))\n",
"l2_train = np.sum(np.delete(l2_loss_by_files, bad_files, axis = 1), axis = 1) / div\n",
"l2_train = np.sqrt(l2_train) * 100\n",
"l2_train"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAG5CAYAAAA3ci11AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0XPVh/v/nzq59HY1GlvfdkmxsvMkWUOxgApjGCZSQ\nUkLNl5iShaQkaUMSIBBIDmlKaNPkGxxCE3qS8CMsJmCaL7FZ5d3YIHnD+yJ7Rvs+0kiz/P4wKHaw\nZdnWzB2N3q9zfI7m3jv3PhIfhB8+n7nXiEajUQEAAAAAkorF7AAAAAAAgMFH2QMAAACAJETZAwAA\nAIAkRNkDAAAAgCRE2QMAAACAJETZAwAAAIAkRNkDAFyURYsWaf369XG73v3336+f/exncbve2dxx\nxx168cUXzY5xVps2bdLll18+6McCAIYOyh4AYNC8+OKL+sxnPqNZs2bp8ssv149+9COFQqELPt8L\nL7ygz33uc6dte+ihh/SlL33ponJOnjxZR44cuahzPPnkk/r0pz99UecYDC+88IImT56sV1991ewo\nAIAEQ9kDAAyarq4uffvb39bGjRv1hz/8QRs3btRTTz11xmMvpgTGWiJn+2svvviisrOztWrVKrOj\nAAASDGUPADBo/v7v/16zZ8+Ww+GQx+PR9ddfr23btvXtX7RokVauXKnrr79el1xyiUKhkFauXKlP\nfOITmjlzpq699lr9+c9/liQdOHBADzzwgN577z3NnDlTs2fPliR961vf0k9+8pO+cz777LO66qqr\nNHfuXP3TP/2Tamtr+814yy23SJI+9alPaebMmXr11Vf7ljGuXLlSCxcu1L333qvW1lbdeeedmj9/\nvubMmaM777xTfr+/7zy33nqr/vCHP0j6ywzko48+qjlz5mjRokV66623znj9lStX6u677z5t28MP\nP6yHH36471yLFy/WzJkztWjRIv3xj3886/dy/PhxbdmyRQ899JAqKytVX19/1mMXLVqkJ554Qtde\ne63mzJmje++9V8Fg8LRjnnrqKZWXl6uiokLPP/983/Y333xTy5Yt06xZs3TFFVfopz/96VmvAwBI\nHJQ9AEDMbNmyRRMmTDht2+rVq7Vy5Upt3bpVNptNI0eO1G9/+1u9++67+vKXv6xvfvObqqur0/jx\n4/Xggw/qkksu0fbt27V169aPnX/Dhg3693//dz3++OOqrKzUiBEjdM899/Sb6be//a0k6aWXXtL2\n7dt17bXXSpIaGhrU2tqqN954Q9///vcViUT0mc98Rm+88YbeeOMNOZ1OPfTQQ2c9b1VVlcaOHauN\nGzfqjjvu0He+8x1Fo9GPHXfdddfprbfeUkdHhyQpHA7rT3/6k5YuXapAIKCHH35Yv/zlL7V9+3Y9\n88wzmjp16lmvuWrVKpWWlurqq6/W+PHj9fLLL/f7vb/88sv61a9+pT//+c86dOiQfv7zn/fta2ho\nUHt7u95++2098sgjeuihh9Ta2ipJSklJ0aOPPqqtW7fqiSee0O9//3utWbOm32sBAMxH2QMAxMRz\nzz2nHTt26Pbbbz9t+6233iqv1yuXyyVJuuaaa+TxeGSxWHTttddq9OjRqqqqGtA1Xn75Zd1www0q\nKSmRw+HQPffco/fee081NTXnnddisejuu++Ww+GQy+VSTk6Orr76aqWkpCg9PV133XWXtmzZctb3\nFxUV6aabbpLVatWnP/1p1dfXq6Gh4WPHjRgxQtOmTesrSxs3bpTL5dIll1zSl2Pfvn3q7u5WQUGB\nJk6ceNZrvvTSS1q6dKkkaenSpedcynnLLbfI6/UqOztbd911l1avXt23z2az6Utf+pLsdruuuOIK\npaam6tChQ5KkefPmafLkybJYLJoyZYquu+46bd68ud9rAQDMR9kDAAy6NWvW6LHHHtMvf/lL5ebm\nnrbP6/We9nrVqlX61Kc+pdmzZ2v27Nnat2+fmpubB3Sduro6jRgxou91WlqasrOzz7mU80xycnLk\ndDr7Xnd1den+++/XlVdeqVmzZumWW25RW1ubwuHwGd+fn5/f93VKSookKRAInPHYpUuX6pVXXpEk\nvfLKK32FLTU1VT/5yU/0zDPPqKKiQitWrNCBAwfOeI53331XNTU1uu666/rOuXfvXu3evfus3+Op\nP/uioiLV1dX1vc7OzpbNZjvte/go//vvv69bb71V8+fP16WXXqpnnnlmwP+MAADmoewBAAbV22+/\nre9+97v6xS9+ocmTJ39sv2EYfV8fP35c3/3ud3Xfffdp06ZN2rp162kzWaceeyYFBQU6fvx43+tA\nIKCWlhZ5PJ7zzv3X13rqqad06NAhPfvss9q2bVvf8s8zLc08X9dcc402b94sv9+vP//5z7r++uv7\n9l122WX67//+b1VWVmrcuHG67777zniOVatWKRqNatmyZVq4cKFuuukmSer3cRA+n6/v6xMnTqig\noGBAeb/+9a9r8eLFeuutt/Tuu+/q5ptvHpSfAwAgtih7AIBBs2HDBn3zm9/UT3/6U02fPv2cx3d1\ndckwjL7Zv+eff1779u3r25+Xl6fa2lr19PSc8f1Lly7VCy+8oN27d6unp0ePPfaYpk+fruLi4n6v\nm5+fr2PHjvV7TGdnp5xOpzIzM9XS0qL/+q//Ouf3M1C5ubmaO3eu7r33XhUXF2v8+PGSTn5ubs2a\nNQoEAnI4HEpNTZXF8vH/VAeDQf3v//6vHnroIa1atarvz3333adXXnnlrHcT/d3vfie/36+Wlhb9\n4he/6Pu84rl0dnYqKytLTqdTVVVVfbOSAIDERtkDAAyan//852pvb9eKFSs0c+ZMzZw5U3fcccdZ\nj58wYYJuv/123XzzzVqwYIH27t2rWbNm9e2fP3++JkyYoIqKCs2bN+9j71+wYIG++tWv6itf+Yoq\nKip07Nix0+7UeTZf/vKX9a1vfUuzZ88+6/PpbrvtNgWDQc2fP1+f/exnddlllw3gJzBwS5cu1fr1\n6/uWcEpSJBLRr3/9a1122WWaO3eutmzZou9973sfe++aNWvkcrm0bNkyud3uvj833HCDwuGw3nnn\nnbNe8/bbb9cnPvEJjRo1SnfdddeAsj7wwAP6z//8T82cOVM/+9nPdM0111zQ9wwAiC8jyjoMAACS\n3qJFi/Twww9rwYIFZkcBAMQJM3sAAAAAkIRs5z4EAIChZevWrfrCF75wxn3bt2+PcxoAAMzBMk4A\nAAAASEIs4wQAAACAJDSkl3HW17fH/Bo5Oalqbj7zQ3GBwcRYQ7ww1hAvjDXEA+MM8ZKoY83tzjjr\nPmb2zsFms5odAcMEYw3xwlhDvDDWEA+MM8TLUBxrlD0AAAAASEKUPQAAAABIQpQ9AAAAAEhClD0A\nAAAASEKUPQAAAABIQpQ9AAAAAEhClD0AAAAASEKUPQAAAABIQpQ9AAAAAEhClD0AAAAAMVFT36E3\nttXoj5WH9Ma2GtXUd1z0Oa+66jJJ0r59H+jOO5frH/7hJt12281au/a18z7X22+/qUOHDva9fvLJ\nX2jLlk3nfZ5nn/2duru7z/t9F3q9gbLF7MwAAAAAhq2a+g5t3VPX97q1s6fvdbE7/aLP73S69N3v\nPqiRI0epoaFe/+f//IPmzi1XRkbGaceFw2FZrdYznuOdd97UggUVGjt2nCTpjjv+6YKyPPvs77Vk\nybVyuVwf29ff9S/0egNF2QMAAABw3nYcatSJhsBZ9++raVF3T/hj2483dGpicfYZ31OUn6rSsXkD\nuv6oUaP7vs7Pdys7O1ctLc3KyMjQjTder0WLrtLWrZv093//eQUCAf3xjy+qt7dXxcXFuu++72vf\nvg9UWfm23ntvm37zm6f0yCM/0q9//aQWLKjQlVd+Qlu3btbPfva4wuGwpkyZpkcf/cEZc/zhD8+o\noaFed999p7KysvXTnz6hq666TH/7t5/R1q2bdc89/6pt27Zo3bp3FAx2q7R0hv7lX74twzD0yCPf\n67vejTder2uuWap1695WKBTS97//qEaPHjOgn8XZsIwTAAAAwKALnqHo9bf9YuzatUOhUK9GjCju\n25aVlaWnnvqtPvGJq3XFFVfqySef1m9+83uNHj1Wr7yySmVlM1RRcbm++MW79etf/+609waDQf3g\nBw/qwQd/qKef/v8UDof1u9/97ozX/ru/u1n5+W79538+oZ/+9AlJUldXl6ZNK9VvfvN7zZhxiW64\n4SY9+eTT+p//eVY9Pd1at+6dM57ro8zLlt2o3//+fy7658LMXgKoqe/QvmMtag/0KiPVrokjswdl\nahsAAACIldKxef3Owtmthlo7ez62PSvNoStnFZ/hHRemoaFB3//+/frOdx6UxfKXuazFi5f0fX3w\n4AH98pf/Vx0d7erq6tLcufP7PefRo0fk9Rb1zR5ec81SrV79oq677oYBZbJarfqbv1nU93rbtq36\n7W+fVjDYrba2No0ZM14VFZd/7H1XXHHyPZMnT9Vbb70xoGv1h7Jnso/WMveEIrJ9+C/EYK5lBgAA\nAMwwcWT2aZ/ZO3X7YOns7NC//MtXtWLFF1VaWnbaPpcrpe/rH/zgQf3gBz/WxImT9OqrL2v79ncH\nLcOZOByOvs/pBYNB/fu/P6onn3xaHk+hfvWrJ9TTEzzj++x2hyTJarUoHA5ddA6WcZps37EWdQVD\nOnSiTUdrOxSORPu2AwAAAENVsTtds6cUKCvNIYthKCvNodlTCgZtQqO3t1ff/vY39clPXqcrr/xE\nv8cGAp3Kz89XKBTSa6/9b9/21NRUBQIf/9zhqFGj5fOdUE3NMUnS//t/r2rOnDlnPf/J83SecV9P\nz8nZzezsbAUCAb355tpzfm+DhZk9k7UHetXY1q2oouruCelYXYdGFqSrPdBrdjQAAADgohS702O2\n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\nfbu++eYbff311zp9+nSPnBcAoG+j7AEA+rzs7GwtWrRIhmHo4YcfVn5+frtX7a666667NGLECEnS\nk08+qYMHD7bty8jIUGpqqiRpypQpKikpkSQ1NTXp1VdfVVZWlpYtW6by8nIVFRX1wFkBAPo6p9UB\nAACwktfr1c6dOxUREaFvv/1WktTc3KycnJybOk6/fv3aboeFhamlpUWS9N577ykpKUnvvPOOnE6n\nnnvuOXk8nu47AQAAusArewCAPi03N1fp6enat2+fdu/erd27d+vTTz/V9u3bO409duyYiouLJV1+\nj9+sWbNuePza2lq5XC45nU6dPHlSR44c6e5TAAAgIF7ZAwD0adu2bVNWVla7bdOmTVNra6sOHz6s\niRMntm3PyMjQ5s2bdfbsWQ0aNEjvvvvuDY//4osvav369crOzlZ6erpmzJjR7ecAAEAghmmaptUh\nAADo7XJycrRnzx69//77VkcBACAo/BgnAAAAANgQr+wBAAAAgA3xyh4AAAAA2BBlDwAAAABsiLIH\nAAAAADZE2QMAAAAAG6LsAQAAAIAN/R8pPLekSDO5NQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb02925ada0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(enc_dims) / 58.\n",
"plt.figure(figsize=(15, 7))\n",
"\n",
"y = np.array(l2_train)\n",
"plt.plot(x, y, marker='o', alpha = 0.5, label = \"l2ratio_train\")\n",
"\n",
"plt.title(\"l2ratio_train vs Alpha\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"l2ratio\")\n",
"plt.legend(loc = 'best')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load Test data"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"DATA_FOLDER = pathlib.Path('/home/radi4/data/data/test')\n",
"all_files_data = []\n",
"all_files_names = []\n",
"bad_channels = []\n",
"for eeg_file_path in DATA_FOLDER.glob('*.h5'):\n",
" all_files_names.append(str(eeg_file_path))\n",
" all_files_data.append(read_eeg_file(str(eeg_file_path)))\n",
" bad_channels.append(find_bad_channels(all_files_data[-1]).copy())\n",
"channels_count = all_files_data[0].shape[0]\n",
"all_padded_data = pad_all_eeg_files(all_files_data)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"enc_dims = [1, 2, 6, 29, 58]\n",
"l2_loss_by_files = []\n",
"for enc_dim in enc_dims:\n",
" autoencoder = torch.load(\"./Petr/Petr_dense_{}.pt\".format(str(enc_dim)))\n",
" autoencoder = autoencoder.cuda()\n",
" adds = []\n",
" for i in range(len(all_files_data)):\n",
" start = 0\n",
" res = np.zeros((0, 58))\n",
" while (start < all_files_data[i].shape[1]):\n",
" size = min(500, all_files_data[i].shape[1] - start)\n",
" batch = make_batch(all_padded_data[i], channels_count, size, start + SAMPLES_COUNT_DEFAULT // 2)\n",
" start += size\n",
" res = np.concatenate([res, predict(batch, autoencoder)], axis = 0)\n",
" res = res.T\n",
" add = np.sum((np.delete(res, bad_channels[i]) - np.delete(all_files_data[i], bad_channels[i]))**2)\n",
" print(i, add, all_files_names[i])\n",
" adds.append(add)\n",
" \n",
" l2_loss_by_files.append(adds.copy()) \n",
" print(enc_dim)"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"bad_files = [4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 24, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40]"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 78.13261871, 71.37701274, 63.47289019, 50.53598067, 50.57000687])"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"div = np.sum(np.sum(all_files_data[i]**2)\n",
" for i in np.delete(np.arange(len(all_files_data)), bad_files))\n",
"l2_test = np.sum(np.delete(l2_loss_by_files, bad_files, axis = 1), axis = 1) / div\n",
"l2_test = np.sqrt(l2_test) * 100\n",
"l2_test"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb029109b00>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.array(enc_dims) / 58.\n",
"plt.figure(figsize=(15, 7))\n",
"\n",
"y = np.array(l2_test)\n",
"plt.plot(x, y, marker='o', alpha = 0.5, label = \"l2ratio_test\")\n",
"\n",
"plt.title(\"l2ratio_test vs Alpha\")\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"l2ratio\")\n",
"plt.legend(loc = 'best')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment