TF-Keras
English
markub3327 commited on
Commit
942627f
1 Parent(s): 7d91da8
.gitattributes CHANGED
@@ -32,3 +32,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
+ save/model-best/variables/variables.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
DataAugmentation.ipynb ADDED
@@ -0,0 +1,1898 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 8,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import numpy as np\n",
10
+ "import pandas as pd\n",
11
+ "import matplotlib.pyplot as plt\n"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "markdown",
16
+ "metadata": {},
17
+ "source": [
18
+ "## Display signals"
19
+ ]
20
+ },
21
+ {
22
+ "cell_type": "code",
23
+ "execution_count": 9,
24
+ "metadata": {},
25
+ "outputs": [],
26
+ "source": [
27
+ "def show_signals(data):\n",
28
+ " Accelerometer_X_axis_data = data[:, 0]\n",
29
+ " Accelerometer_Y_axis_data = data[:, 1]\n",
30
+ " Accelerometer_Z_axis_data = data[:, 2]\n",
31
+ " Gyroscope_X_axis_data = data[:, 3]\n",
32
+ " Gyroscope_Y_axis_data = data[:, 4]\n",
33
+ " Gyroscope_Z_axis_data = data[:, 5]\n",
34
+ " time = np.linspace(0.01, data.shape[0] / 100, data.shape[0])\n",
35
+ "\n",
36
+ " plt.figure(figsize=(20, 10), dpi=80)\n",
37
+ "\n",
38
+ " ax1 = plt.subplot(231)\n",
39
+ " ax1.plot(time, Accelerometer_X_axis_data, \"b\")\n",
40
+ " ax1.title.set_text(f\"Accelerometer X axis\")\n",
41
+ " ax1.set_xlabel(\"time (s) ->\")\n",
42
+ " ax1.set_ylabel(\"Acceleration (m/s^2)\")\n",
43
+ " ax1.grid(True)\n",
44
+ "\n",
45
+ " ax2 = plt.subplot(232)\n",
46
+ " ax2.plot(time, Accelerometer_Y_axis_data, \"g\")\n",
47
+ " ax2.title.set_text(f\"Accelerometer Y axis\")\n",
48
+ " ax2.set_xlabel(\"time (s) ->\")\n",
49
+ " ax2.set_ylabel(\"Acceleration (m/s^2)\")\n",
50
+ " ax2.grid(True)\n",
51
+ "\n",
52
+ " ax3 = plt.subplot(233)\n",
53
+ " ax3.plot(time, Accelerometer_Z_axis_data, \"r\")\n",
54
+ " ax3.title.set_text(f\"Accelerometer Z axis\")\n",
55
+ " ax3.set_xlabel(\"time (s) ->\")\n",
56
+ " ax3.set_ylabel(\"Acceleration (m/s^2)\")\n",
57
+ " ax3.grid(True)\n",
58
+ "\n",
59
+ " ax4 = plt.subplot(234)\n",
60
+ " ax4.plot(time, Gyroscope_X_axis_data, \"b\")\n",
61
+ " ax4.title.set_text(f\"Gyroscope X axis\")\n",
62
+ " ax4.set_xlabel(\"time (s) ->\")\n",
63
+ " ax4.set_ylabel(\"Angular rotation (rad/s)\")\n",
64
+ " ax4.grid(True)\n",
65
+ "\n",
66
+ " ax5 = plt.subplot(235)\n",
67
+ " ax5.plot(time, Gyroscope_Y_axis_data, \"g\")\n",
68
+ " ax5.title.set_text(f\"Gyroscope Y axis\")\n",
69
+ " ax5.set_xlabel(\"time (s) ->\")\n",
70
+ " ax5.set_ylabel(\"Angular rotation (rad/s)\")\n",
71
+ " ax5.grid(True)\n",
72
+ "\n",
73
+ " ax6 = plt.subplot(236)\n",
74
+ " ax6.plot(time, Gyroscope_Z_axis_data, \"r\")\n",
75
+ " ax6.title.set_text(f\"Gyroscope Z axis\")\n",
76
+ " ax6.set_xlabel(\"time (s) ->\")\n",
77
+ " ax6.set_ylabel(\"Angular rotation (rad/s)\")\n",
78
+ " ax6.grid(True)\n",
79
+ "\n",
80
+ " plt.show()\n"
81
+ ]
82
+ },
83
+ {
84
+ "cell_type": "markdown",
85
+ "metadata": {},
86
+ "source": [
87
+ "## New pairs of activities"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": 10,
93
+ "metadata": {},
94
+ "outputs": [
95
+ {
96
+ "name": "stdout",
97
+ "output_type": "stream",
98
+ "text": [
99
+ "[['Stand', 'Talk-stand'], ['Stand', 'Pick'], ['Stand', 'Jump'], ['Stand', 'Walk'], ['Stand', 'Walk-backward'], ['Stand', 'Walk-circle'], ['Stand', 'Run'], ['Stand', 'Stair-up'], ['Stand', 'Stair-down'], ['Stand', 'Table-tennis'], ['Sit', 'Talk-sit'], ['Talk-sit', 'Sit'], ['Talk-stand', 'Stand'], ['Talk-stand', 'Pick'], ['Talk-stand', 'Jump'], ['Talk-stand', 'Walk'], ['Talk-stand', 'Walk-backward'], ['Talk-stand', 'Walk-circle'], ['Talk-stand', 'Run'], ['Talk-stand', 'Stair-up'], ['Talk-stand', 'Stair-down'], ['Talk-stand', 'Table-tennis'], ['Lay', 'Sit-up'], ['Pick', 'Stand'], ['Pick', 'Talk-stand'], ['Pick', 'Jump'], ['Pick', 'Walk'], ['Pick', 'Walk-backward'], ['Pick', 'Walk-circle'], ['Pick', 'Run'], ['Pick', 'Stair-up'], ['Pick', 'Stair-down'], ['Pick', 'Table-tennis'], ['Jump', 'Stand'], ['Jump', 'Talk-stand'], ['Jump', 'Pick'], ['Jump', 'Walk'], ['Jump', 'Walk-backward'], ['Jump', 'Walk-circle'], ['Jump', 'Run'], ['Jump', 'Stair-up'], ['Jump', 'Stair-down'], ['Jump', 'Table-tennis'], ['Sit-up', 'Lay'], ['Walk', 'Stand'], ['Walk', 'Talk-stand'], ['Walk', 'Pick'], ['Walk', 'Jump'], ['Walk', 'Walk-circle'], ['Walk', 'Run'], ['Walk', 'Stair-up'], ['Walk', 'Stair-down'], ['Walk', 'Table-tennis'], ['Walk-backward', 'Stand'], ['Walk-backward', 'Talk-stand'], ['Walk-backward', 'Pick'], ['Walk-backward', 'Jump'], ['Walk-backward', 'Table-tennis'], ['Walk-circle', 'Stand'], ['Walk-circle', 'Talk-stand'], ['Walk-circle', 'Pick'], ['Walk-circle', 'Jump'], ['Walk-circle', 'Walk'], ['Walk-circle', 'Run'], ['Walk-circle', 'Stair-up'], ['Walk-circle', 'Stair-down'], ['Walk-circle', 'Table-tennis'], ['Run', 'Stand'], ['Run', 'Talk-stand'], ['Run', 'Pick'], ['Run', 'Jump'], ['Run', 'Walk'], ['Run', 'Walk-circle'], ['Run', 'Stair-up'], ['Run', 'Stair-down'], ['Run', 'Table-tennis'], ['Stair-up', 'Stand'], ['Stair-up', 'Talk-stand'], ['Stair-up', 'Pick'], ['Stair-up', 'Jump'], ['Stair-up', 'Walk'], ['Stair-up', 'Walk-circle'], ['Stair-up', 'Run'], ['Stair-up', 'Stair-down'], ['Stair-down', 'Stand'], ['Stair-down', 'Talk-stand'], ['Stair-down', 'Pick'], ['Stair-down', 'Jump'], ['Stair-down', 'Walk'], ['Stair-down', 'Walk-circle'], ['Stair-down', 'Run'], ['Stair-down', 'Stair-up'], ['Table-tennis', 'Stand'], ['Table-tennis', 'Talk-stand'], ['Table-tennis', 'Pick'], ['Table-tennis', 'Jump'], ['Table-tennis', 'Walk'], ['Table-tennis', 'Walk-backward'], ['Table-tennis', 'Walk-circle'], ['Table-tennis', 'Run']] \n",
100
+ "\n",
101
+ "Num. of samples: 100\n"
102
+ ]
103
+ }
104
+ ],
105
+ "source": [
106
+ "f = open(\"dataset/data_augmentation_KU-HAR.txt\", \"r\")\n",
107
+ "all_lines = f.readlines()\n",
108
+ "\n",
109
+ "pairs = []\n",
110
+ "\n",
111
+ "for line in all_lines:\n",
112
+ " line = line.rstrip().split(\" \")\n",
113
+ "\n",
114
+ " # store pairs\n",
115
+ " pairs.append([line[0], line[-1]])\n",
116
+ "\n",
117
+ "print(pairs, \"\\n\")\n",
118
+ "print(\"Num. of samples: \", len(pairs))\n"
119
+ ]
120
+ },
121
+ {
122
+ "cell_type": "markdown",
123
+ "metadata": {},
124
+ "source": [
125
+ "## Dataset"
126
+ ]
127
+ },
128
+ {
129
+ "cell_type": "code",
130
+ "execution_count": 11,
131
+ "metadata": {},
132
+ "outputs": [
133
+ {
134
+ "name": "stdout",
135
+ "output_type": "stream",
136
+ "text": [
137
+ "(20750, 1800) (20750,) \n",
138
+ "\n",
139
+ "Mean: [ 0.04835381 -0.04000019 -0.06103219 0.01185658 0.00415822 0.00092788]\n",
140
+ "Std: [3.6388602 2.1443195 2.8478932 1.309968 1.0470778 1.0666409]\n",
141
+ "Max: [194.52 91.779 340.59 97.376 79.272 78.783]\n",
142
+ "Min: [-172.74 -143.17 -315.89 -113.8 -85.757 -78.866] \n",
143
+ "\n",
144
+ "(20655, 300, 6) (20655, 300) \n",
145
+ "\n"
146
+ ]
147
+ }
148
+ ],
149
+ "source": [
150
+ "CLASS_LABELS = np.array(\n",
151
+ " [\n",
152
+ " \"Stand\",\n",
153
+ " \"Sit\",\n",
154
+ " \"Talk-sit\",\n",
155
+ " \"Talk-stand\",\n",
156
+ " \"Stand-sit\",\n",
157
+ " \"Lay\",\n",
158
+ " \"Lay-stand\",\n",
159
+ " \"Pick\",\n",
160
+ " \"Jump\",\n",
161
+ " \"Push-up\",\n",
162
+ " \"Sit-up\",\n",
163
+ " \"Walk\",\n",
164
+ " \"Walk-backward\",\n",
165
+ " \"Walk-circle\",\n",
166
+ " \"Run\",\n",
167
+ " \"Stair-up\",\n",
168
+ " \"Stair-down\",\n",
169
+ " \"Table-tennis\",\n",
170
+ " ]\n",
171
+ ")\n",
172
+ "\n",
173
+ "df = pd.read_csv(\"./dataset/KU-HAR_time_domain_subsamples_20750x300.csv\", header=None)\n",
174
+ "\n",
175
+ "signals = df.values[:, 0:1800]\n",
176
+ "signals = np.array(signals, dtype=np.float32)\n",
177
+ "labels = df.values[:, 1800]\n",
178
+ "labels = np.array(labels, dtype=np.int64)\n",
179
+ "\n",
180
+ "print(signals.shape, labels.shape, \"\\n\")\n",
181
+ "\n",
182
+ "# indexes = []\n",
183
+ "# for i in range(signals.shape[0]):\n",
184
+ "# for j in range(signals.shape[1]):\n",
185
+ "# if (np.abs(signals[i, j]) > 350.0):\n",
186
+ "# indexes.append(i)\n",
187
+ "# break\n",
188
+ "# print(indexes)\n",
189
+ "# print(f\"Remove {len(indexes)} elements !\")\n",
190
+ "\n",
191
+ "# for i in indexes:\n",
192
+ "# print(f\"Label: {labels[i]}\")\n",
193
+ "# plt.plot(signals[i, 0:300])\n",
194
+ "# plt.show()\n",
195
+ "\n",
196
+ "# broken samples in original dataset\n",
197
+ "indexes = [\n",
198
+ " 6587,\n",
199
+ " 6588,\n",
200
+ " 6589,\n",
201
+ " 6590,\n",
202
+ " 6591,\n",
203
+ " 6592,\n",
204
+ " 6593,\n",
205
+ " 6594,\n",
206
+ " 6595,\n",
207
+ " 6596,\n",
208
+ " 6597,\n",
209
+ " 6598,\n",
210
+ " 6599,\n",
211
+ " 6600,\n",
212
+ " 6601,\n",
213
+ " 6602,\n",
214
+ " 6603,\n",
215
+ " 6604,\n",
216
+ " 6605,\n",
217
+ " 6606,\n",
218
+ " 6607,\n",
219
+ " 6660,\n",
220
+ " 6661,\n",
221
+ " 6662,\n",
222
+ " 6663,\n",
223
+ " 6664,\n",
224
+ " 6665,\n",
225
+ " 6666,\n",
226
+ " 6667,\n",
227
+ " 6668,\n",
228
+ " 6669,\n",
229
+ " 6670,\n",
230
+ " 6671,\n",
231
+ " 6672,\n",
232
+ " 6673,\n",
233
+ " 6674,\n",
234
+ " 6675,\n",
235
+ " 6676,\n",
236
+ " 6677,\n",
237
+ " 6678,\n",
238
+ " 6679,\n",
239
+ " 6680,\n",
240
+ " 6681,\n",
241
+ " 6682,\n",
242
+ " 6683,\n",
243
+ " 6684,\n",
244
+ " 6685,\n",
245
+ " 6686,\n",
246
+ " 6687,\n",
247
+ " 6716,\n",
248
+ " 6717,\n",
249
+ " 6718,\n",
250
+ " 6719,\n",
251
+ " 6720,\n",
252
+ " 6721,\n",
253
+ " 6722,\n",
254
+ " 6723,\n",
255
+ " 6724,\n",
256
+ " 6725,\n",
257
+ " 6726,\n",
258
+ " 6727,\n",
259
+ " 6728,\n",
260
+ " 6729,\n",
261
+ " 6730,\n",
262
+ " 6731,\n",
263
+ " 6732,\n",
264
+ " 6733,\n",
265
+ " 6734,\n",
266
+ " 6735,\n",
267
+ " 6736,\n",
268
+ " 6737,\n",
269
+ " 6738,\n",
270
+ " 6739,\n",
271
+ " 6740,\n",
272
+ " 6741,\n",
273
+ " 6742,\n",
274
+ " 6743,\n",
275
+ " 6750,\n",
276
+ " 6751,\n",
277
+ " 6752,\n",
278
+ " 6753,\n",
279
+ " 6754,\n",
280
+ " 6755,\n",
281
+ " 6756,\n",
282
+ " 6757,\n",
283
+ " 6758,\n",
284
+ " 6759,\n",
285
+ " 6760,\n",
286
+ " 6761,\n",
287
+ " 6762,\n",
288
+ " 6763,\n",
289
+ " 6764,\n",
290
+ " 6765,\n",
291
+ " 6766,\n",
292
+ " 6767,\n",
293
+ "]\n",
294
+ "\n",
295
+ "# delete the bad samples\n",
296
+ "signals = np.delete(signals, indexes, 0)\n",
297
+ "labels = np.delete(labels, indexes, 0)\n",
298
+ "\n",
299
+ "signals = np.stack(\n",
300
+ " [\n",
301
+ " signals[:, 0:300], # ACC X\n",
302
+ " signals[:, 300:600], # ACC Y\n",
303
+ " signals[:, 600:900], # ACC Z\n",
304
+ " signals[:, 900:1200], # GYRO X\n",
305
+ " signals[:, 1200:1500], # GYRO Y\n",
306
+ " signals[:, 1500:1800], # GYRO Z\n",
307
+ " ],\n",
308
+ " axis=-1,\n",
309
+ ")\n",
310
+ "labels = np.repeat(labels.reshape(labels.shape[0], 1), signals.shape[1], axis=1)\n",
311
+ "\n",
312
+ "print(\"Mean:\", np.mean(signals, axis=(0, 1)))\n",
313
+ "print(\"Std:\", np.std(signals, axis=(0, 1)))\n",
314
+ "print(\"Max:\", np.max(signals, axis=(0, 1)))\n",
315
+ "print(\"Min:\", np.min(signals, axis=(0, 1)), \"\\n\")\n",
316
+ "\n",
317
+ "print(signals.shape, labels.shape, \"\\n\")\n"
318
+ ]
319
+ },
320
+ {
321
+ "cell_type": "code",
322
+ "execution_count": 12,
323
+ "metadata": {},
324
+ "outputs": [
325
+ {
326
+ "name": "stdout",
327
+ "output_type": "stream",
328
+ "text": [
329
+ "Working on 0 sample\n",
330
+ "[0]\n",
331
+ "[3] \n",
332
+ "\n",
333
+ "(1886,)\n",
334
+ "(1866,) \n",
335
+ "\n",
336
+ "(1866, 600, 6)\n",
337
+ "(1866, 600) \n",
338
+ "\n",
339
+ "(1866, 300, 6)\n",
340
+ "(1866, 300) \n",
341
+ "\n",
342
+ "Working on 1 sample\n",
343
+ "[0]\n",
344
+ "[7] \n",
345
+ "\n",
346
+ "(1886,)\n",
347
+ "(1333,) \n",
348
+ "\n",
349
+ "(1333, 600, 6)\n",
350
+ "(1333, 600) \n",
351
+ "\n",
352
+ "(1333, 300, 6)\n",
353
+ "(1333, 300) \n",
354
+ "\n",
355
+ "Working on 2 sample\n",
356
+ "[0]\n",
357
+ "[8] \n",
358
+ "\n",
359
+ "(1886,)\n",
360
+ "(666,) \n",
361
+ "\n",
362
+ "(666, 600, 6)\n",
363
+ "(666, 600) \n",
364
+ "\n",
365
+ "(666, 300, 6)\n",
366
+ "(666, 300) \n",
367
+ "\n",
368
+ "Working on 3 sample\n",
369
+ "[0]\n",
370
+ "[11] \n",
371
+ "\n",
372
+ "(1886,)\n",
373
+ "(882,) \n",
374
+ "\n",
375
+ "(882, 600, 6)\n",
376
+ "(882, 600) \n",
377
+ "\n",
378
+ "(882, 300, 6)\n",
379
+ "(882, 300) \n",
380
+ "\n",
381
+ "Working on 4 sample\n",
382
+ "[0]\n",
383
+ "[12] \n",
384
+ "\n",
385
+ "(1886,)\n",
386
+ "(317,) \n",
387
+ "\n",
388
+ "(317, 600, 6)\n",
389
+ "(317, 600) \n",
390
+ "\n",
391
+ "(317, 300, 6)\n",
392
+ "(317, 300) \n",
393
+ "\n",
394
+ "Working on 5 sample\n",
395
+ "[0]\n",
396
+ "[13] \n",
397
+ "\n",
398
+ "(1886,)\n",
399
+ "(259,) \n",
400
+ "\n",
401
+ "(259, 600, 6)\n",
402
+ "(259, 600) \n",
403
+ "\n",
404
+ "(259, 300, 6)\n",
405
+ "(259, 300) \n",
406
+ "\n",
407
+ "Working on 6 sample\n",
408
+ "[0]\n",
409
+ "[14] \n",
410
+ "\n",
411
+ "(1886,)\n",
412
+ "(500,) \n",
413
+ "\n",
414
+ "(500, 600, 6)\n",
415
+ "(500, 600) \n",
416
+ "\n",
417
+ "(500, 300, 6)\n",
418
+ "(500, 300) \n",
419
+ "\n",
420
+ "Working on 7 sample\n",
421
+ "[0]\n",
422
+ "[15] \n",
423
+ "\n",
424
+ "(1886,)\n",
425
+ "(798,) \n",
426
+ "\n",
427
+ "(798, 600, 6)\n",
428
+ "(798, 600) \n",
429
+ "\n",
430
+ "(798, 300, 6)\n",
431
+ "(798, 300) \n",
432
+ "\n",
433
+ "Working on 8 sample\n",
434
+ "[0]\n",
435
+ "[16] \n",
436
+ "\n",
437
+ "(1886,)\n",
438
+ "(781,) \n",
439
+ "\n",
440
+ "(781, 600, 6)\n",
441
+ "(781, 600) \n",
442
+ "\n",
443
+ "(781, 300, 6)\n",
444
+ "(781, 300) \n",
445
+ "\n",
446
+ "Working on 9 sample\n",
447
+ "[0]\n",
448
+ "[17] \n",
449
+ "\n",
450
+ "(1886,)\n",
451
+ "(458,) \n",
452
+ "\n",
453
+ "(458, 600, 6)\n",
454
+ "(458, 600) \n",
455
+ "\n",
456
+ "(458, 300, 6)\n",
457
+ "(458, 300) \n",
458
+ "\n",
459
+ "Working on 10 sample\n",
460
+ "[1]\n",
461
+ "[2] \n",
462
+ "\n",
463
+ "(1874,)\n",
464
+ "(1797,) \n",
465
+ "\n",
466
+ "(1797, 600, 6)\n",
467
+ "(1797, 600) \n",
468
+ "\n",
469
+ "(1797, 300, 6)\n",
470
+ "(1797, 300) \n",
471
+ "\n",
472
+ "Working on 11 sample\n",
473
+ "[2]\n",
474
+ "[1] \n",
475
+ "\n",
476
+ "(1797,)\n",
477
+ "(1874,) \n",
478
+ "\n",
479
+ "(1797, 600, 6)\n",
480
+ "(1797, 600) \n",
481
+ "\n",
482
+ "(1797, 300, 6)\n",
483
+ "(1797, 300) \n",
484
+ "\n",
485
+ "Working on 12 sample\n",
486
+ "[3]\n",
487
+ "[0] \n",
488
+ "\n",
489
+ "(1866,)\n",
490
+ "(1886,) \n",
491
+ "\n",
492
+ "(1866, 600, 6)\n",
493
+ "(1866, 600) \n",
494
+ "\n",
495
+ "(1866, 300, 6)\n",
496
+ "(1866, 300) \n",
497
+ "\n",
498
+ "Working on 13 sample\n",
499
+ "[3]\n",
500
+ "[7] \n",
501
+ "\n",
502
+ "(1866,)\n",
503
+ "(1333,) \n",
504
+ "\n",
505
+ "(1333, 600, 6)\n",
506
+ "(1333, 600) \n",
507
+ "\n",
508
+ "(1333, 300, 6)\n",
509
+ "(1333, 300) \n",
510
+ "\n",
511
+ "Working on 14 sample\n",
512
+ "[3]\n",
513
+ "[8] \n",
514
+ "\n",
515
+ "(1866,)\n",
516
+ "(666,) \n",
517
+ "\n",
518
+ "(666, 600, 6)\n",
519
+ "(666, 600) \n",
520
+ "\n",
521
+ "(666, 300, 6)\n",
522
+ "(666, 300) \n",
523
+ "\n",
524
+ "Working on 15 sample\n",
525
+ "[3]\n",
526
+ "[11] \n",
527
+ "\n",
528
+ "(1866,)\n",
529
+ "(882,) \n",
530
+ "\n",
531
+ "(882, 600, 6)\n",
532
+ "(882, 600) \n",
533
+ "\n",
534
+ "(882, 300, 6)\n",
535
+ "(882, 300) \n",
536
+ "\n",
537
+ "Working on 16 sample\n",
538
+ "[3]\n",
539
+ "[12] \n",
540
+ "\n",
541
+ "(1866,)\n",
542
+ "(317,) \n",
543
+ "\n",
544
+ "(317, 600, 6)\n",
545
+ "(317, 600) \n",
546
+ "\n",
547
+ "(317, 300, 6)\n",
548
+ "(317, 300) \n",
549
+ "\n",
550
+ "Working on 17 sample\n",
551
+ "[3]\n",
552
+ "[13] \n",
553
+ "\n",
554
+ "(1866,)\n",
555
+ "(259,) \n",
556
+ "\n",
557
+ "(259, 600, 6)\n",
558
+ "(259, 600) \n",
559
+ "\n",
560
+ "(259, 300, 6)\n",
561
+ "(259, 300) \n",
562
+ "\n",
563
+ "Working on 18 sample\n",
564
+ "[3]\n",
565
+ "[14] \n",
566
+ "\n",
567
+ "(1866,)\n",
568
+ "(500,) \n",
569
+ "\n",
570
+ "(500, 600, 6)\n",
571
+ "(500, 600) \n",
572
+ "\n",
573
+ "(500, 300, 6)\n",
574
+ "(500, 300) \n",
575
+ "\n",
576
+ "Working on 19 sample\n",
577
+ "[3]\n",
578
+ "[15] \n",
579
+ "\n",
580
+ "(1866,)\n",
581
+ "(798,) \n",
582
+ "\n",
583
+ "(798, 600, 6)\n",
584
+ "(798, 600) \n",
585
+ "\n",
586
+ "(798, 300, 6)\n",
587
+ "(798, 300) \n",
588
+ "\n",
589
+ "Working on 20 sample\n",
590
+ "[3]\n",
591
+ "[16] \n",
592
+ "\n",
593
+ "(1866,)\n",
594
+ "(781,) \n",
595
+ "\n",
596
+ "(781, 600, 6)\n",
597
+ "(781, 600) \n",
598
+ "\n",
599
+ "(781, 300, 6)\n",
600
+ "(781, 300) \n",
601
+ "\n",
602
+ "Working on 21 sample\n",
603
+ "[3]\n",
604
+ "[17] \n",
605
+ "\n",
606
+ "(1866,)\n",
607
+ "(458,) \n",
608
+ "\n",
609
+ "(458, 600, 6)\n",
610
+ "(458, 600) \n",
611
+ "\n",
612
+ "(458, 300, 6)\n",
613
+ "(458, 300) \n",
614
+ "\n",
615
+ "Working on 22 sample\n",
616
+ "[5]\n",
617
+ "[10] \n",
618
+ "\n",
619
+ "(1813,)\n",
620
+ "(1005,) \n",
621
+ "\n",
622
+ "(1005, 600, 6)\n",
623
+ "(1005, 600) \n",
624
+ "\n",
625
+ "(1005, 300, 6)\n",
626
+ "(1005, 300) \n",
627
+ "\n",
628
+ "Working on 23 sample\n",
629
+ "[7]\n",
630
+ "[0] \n",
631
+ "\n",
632
+ "(1333,)\n",
633
+ "(1886,) \n",
634
+ "\n",
635
+ "(1333, 600, 6)\n",
636
+ "(1333, 600) \n",
637
+ "\n",
638
+ "(1333, 300, 6)\n",
639
+ "(1333, 300) \n",
640
+ "\n",
641
+ "Working on 24 sample\n",
642
+ "[7]\n",
643
+ "[3] \n",
644
+ "\n",
645
+ "(1333,)\n",
646
+ "(1866,) \n",
647
+ "\n",
648
+ "(1333, 600, 6)\n",
649
+ "(1333, 600) \n",
650
+ "\n",
651
+ "(1333, 300, 6)\n",
652
+ "(1333, 300) \n",
653
+ "\n",
654
+ "Working on 25 sample\n",
655
+ "[7]\n",
656
+ "[8] \n",
657
+ "\n",
658
+ "(1333,)\n",
659
+ "(666,) \n",
660
+ "\n",
661
+ "(666, 600, 6)\n",
662
+ "(666, 600) \n",
663
+ "\n",
664
+ "(666, 300, 6)\n",
665
+ "(666, 300) \n",
666
+ "\n",
667
+ "Working on 26 sample\n",
668
+ "[7]\n",
669
+ "[11] \n",
670
+ "\n",
671
+ "(1333,)\n",
672
+ "(882,) \n",
673
+ "\n",
674
+ "(882, 600, 6)\n",
675
+ "(882, 600) \n",
676
+ "\n",
677
+ "(882, 300, 6)\n",
678
+ "(882, 300) \n",
679
+ "\n",
680
+ "Working on 27 sample\n",
681
+ "[7]\n",
682
+ "[12] \n",
683
+ "\n",
684
+ "(1333,)\n",
685
+ "(317,) \n",
686
+ "\n",
687
+ "(317, 600, 6)\n",
688
+ "(317, 600) \n",
689
+ "\n",
690
+ "(317, 300, 6)\n",
691
+ "(317, 300) \n",
692
+ "\n",
693
+ "Working on 28 sample\n",
694
+ "[7]\n",
695
+ "[13] \n",
696
+ "\n",
697
+ "(1333,)\n",
698
+ "(259,) \n",
699
+ "\n",
700
+ "(259, 600, 6)\n",
701
+ "(259, 600) \n",
702
+ "\n",
703
+ "(259, 300, 6)\n",
704
+ "(259, 300) \n",
705
+ "\n",
706
+ "Working on 29 sample\n",
707
+ "[7]\n",
708
+ "[14] \n",
709
+ "\n",
710
+ "(1333,)\n",
711
+ "(500,) \n",
712
+ "\n",
713
+ "(500, 600, 6)\n",
714
+ "(500, 600) \n",
715
+ "\n",
716
+ "(500, 300, 6)\n",
717
+ "(500, 300) \n",
718
+ "\n",
719
+ "Working on 30 sample\n",
720
+ "[7]\n",
721
+ "[15] \n",
722
+ "\n",
723
+ "(1333,)\n",
724
+ "(798,) \n",
725
+ "\n",
726
+ "(798, 600, 6)\n",
727
+ "(798, 600) \n",
728
+ "\n",
729
+ "(798, 300, 6)\n",
730
+ "(798, 300) \n",
731
+ "\n",
732
+ "Working on 31 sample\n",
733
+ "[7]\n",
734
+ "[16] \n",
735
+ "\n",
736
+ "(1333,)\n",
737
+ "(781,) \n",
738
+ "\n",
739
+ "(781, 600, 6)\n",
740
+ "(781, 600) \n",
741
+ "\n",
742
+ "(781, 300, 6)\n",
743
+ "(781, 300) \n",
744
+ "\n",
745
+ "Working on 32 sample\n",
746
+ "[7]\n",
747
+ "[17] \n",
748
+ "\n",
749
+ "(1333,)\n",
750
+ "(458,) \n",
751
+ "\n",
752
+ "(458, 600, 6)\n",
753
+ "(458, 600) \n",
754
+ "\n",
755
+ "(458, 300, 6)\n",
756
+ "(458, 300) \n",
757
+ "\n",
758
+ "Working on 33 sample\n",
759
+ "[8]\n",
760
+ "[0] \n",
761
+ "\n",
762
+ "(666,)\n",
763
+ "(1886,) \n",
764
+ "\n",
765
+ "(666, 600, 6)\n",
766
+ "(666, 600) \n",
767
+ "\n",
768
+ "(666, 300, 6)\n",
769
+ "(666, 300) \n",
770
+ "\n",
771
+ "Working on 34 sample\n",
772
+ "[8]\n",
773
+ "[3] \n",
774
+ "\n",
775
+ "(666,)\n",
776
+ "(1866,) \n",
777
+ "\n",
778
+ "(666, 600, 6)\n",
779
+ "(666, 600) \n",
780
+ "\n",
781
+ "(666, 300, 6)\n",
782
+ "(666, 300) \n",
783
+ "\n",
784
+ "Working on 35 sample\n",
785
+ "[8]\n",
786
+ "[7] \n",
787
+ "\n",
788
+ "(666,)\n",
789
+ "(1333,) \n",
790
+ "\n",
791
+ "(666, 600, 6)\n",
792
+ "(666, 600) \n",
793
+ "\n",
794
+ "(666, 300, 6)\n",
795
+ "(666, 300) \n",
796
+ "\n",
797
+ "Working on 36 sample\n",
798
+ "[8]\n",
799
+ "[11] \n",
800
+ "\n",
801
+ "(666,)\n",
802
+ "(882,) \n",
803
+ "\n",
804
+ "(666, 600, 6)\n",
805
+ "(666, 600) \n",
806
+ "\n",
807
+ "(666, 300, 6)\n",
808
+ "(666, 300) \n",
809
+ "\n",
810
+ "Working on 37 sample\n",
811
+ "[8]\n",
812
+ "[12] \n",
813
+ "\n",
814
+ "(666,)\n",
815
+ "(317,) \n",
816
+ "\n",
817
+ "(317, 600, 6)\n",
818
+ "(317, 600) \n",
819
+ "\n",
820
+ "(317, 300, 6)\n",
821
+ "(317, 300) \n",
822
+ "\n",
823
+ "Working on 38 sample\n",
824
+ "[8]\n",
825
+ "[13] \n",
826
+ "\n",
827
+ "(666,)\n",
828
+ "(259,) \n",
829
+ "\n",
830
+ "(259, 600, 6)\n",
831
+ "(259, 600) \n",
832
+ "\n",
833
+ "(259, 300, 6)\n",
834
+ "(259, 300) \n",
835
+ "\n",
836
+ "Working on 39 sample\n",
837
+ "[8]\n",
838
+ "[14] \n",
839
+ "\n",
840
+ "(666,)\n",
841
+ "(500,) \n",
842
+ "\n",
843
+ "(500, 600, 6)\n",
844
+ "(500, 600) \n",
845
+ "\n",
846
+ "(500, 300, 6)\n",
847
+ "(500, 300) \n",
848
+ "\n",
849
+ "Working on 40 sample\n",
850
+ "[8]\n",
851
+ "[15] \n",
852
+ "\n",
853
+ "(666,)\n",
854
+ "(798,) \n",
855
+ "\n",
856
+ "(666, 600, 6)\n",
857
+ "(666, 600) \n",
858
+ "\n",
859
+ "(666, 300, 6)\n",
860
+ "(666, 300) \n",
861
+ "\n",
862
+ "Working on 41 sample\n",
863
+ "[8]\n",
864
+ "[16] \n",
865
+ "\n",
866
+ "(666,)\n",
867
+ "(781,) \n",
868
+ "\n",
869
+ "(666, 600, 6)\n",
870
+ "(666, 600) \n",
871
+ "\n",
872
+ "(666, 300, 6)\n",
873
+ "(666, 300) \n",
874
+ "\n",
875
+ "Working on 42 sample\n",
876
+ "[8]\n",
877
+ "[17] \n",
878
+ "\n",
879
+ "(666,)\n",
880
+ "(458,) \n",
881
+ "\n",
882
+ "(458, 600, 6)\n",
883
+ "(458, 600) \n",
884
+ "\n",
885
+ "(458, 300, 6)\n",
886
+ "(458, 300) \n",
887
+ "\n",
888
+ "Working on 43 sample\n",
889
+ "[10]\n",
890
+ "[5] \n",
891
+ "\n",
892
+ "(1005,)\n",
893
+ "(1813,) \n",
894
+ "\n",
895
+ "(1005, 600, 6)\n",
896
+ "(1005, 600) \n",
897
+ "\n",
898
+ "(1005, 300, 6)\n",
899
+ "(1005, 300) \n",
900
+ "\n",
901
+ "Working on 44 sample\n",
902
+ "[11]\n",
903
+ "[0] \n",
904
+ "\n",
905
+ "(882,)\n",
906
+ "(1886,) \n",
907
+ "\n",
908
+ "(882, 600, 6)\n",
909
+ "(882, 600) \n",
910
+ "\n",
911
+ "(882, 300, 6)\n",
912
+ "(882, 300) \n",
913
+ "\n",
914
+ "Working on 45 sample\n",
915
+ "[11]\n",
916
+ "[3] \n",
917
+ "\n",
918
+ "(882,)\n",
919
+ "(1866,) \n",
920
+ "\n",
921
+ "(882, 600, 6)\n",
922
+ "(882, 600) \n",
923
+ "\n",
924
+ "(882, 300, 6)\n",
925
+ "(882, 300) \n",
926
+ "\n",
927
+ "Working on 46 sample\n",
928
+ "[11]\n",
929
+ "[7] \n",
930
+ "\n",
931
+ "(882,)\n",
932
+ "(1333,) \n",
933
+ "\n",
934
+ "(882, 600, 6)\n",
935
+ "(882, 600) \n",
936
+ "\n",
937
+ "(882, 300, 6)\n",
938
+ "(882, 300) \n",
939
+ "\n",
940
+ "Working on 47 sample\n",
941
+ "[11]\n",
942
+ "[8] \n",
943
+ "\n",
944
+ "(882,)\n",
945
+ "(666,) \n",
946
+ "\n",
947
+ "(666, 600, 6)\n",
948
+ "(666, 600) \n",
949
+ "\n",
950
+ "(666, 300, 6)\n",
951
+ "(666, 300) \n",
952
+ "\n",
953
+ "Working on 48 sample\n",
954
+ "[11]\n",
955
+ "[13] \n",
956
+ "\n",
957
+ "(882,)\n",
958
+ "(259,) \n",
959
+ "\n",
960
+ "(259, 600, 6)\n",
961
+ "(259, 600) \n",
962
+ "\n",
963
+ "(259, 300, 6)\n",
964
+ "(259, 300) \n",
965
+ "\n",
966
+ "Working on 49 sample\n",
967
+ "[11]\n",
968
+ "[14] \n",
969
+ "\n",
970
+ "(882,)\n",
971
+ "(500,) \n",
972
+ "\n",
973
+ "(500, 600, 6)\n",
974
+ "(500, 600) \n",
975
+ "\n",
976
+ "(500, 300, 6)\n",
977
+ "(500, 300) \n",
978
+ "\n",
979
+ "Working on 50 sample\n",
980
+ "[11]\n",
981
+ "[15] \n",
982
+ "\n",
983
+ "(882,)\n",
984
+ "(798,) \n",
985
+ "\n",
986
+ "(798, 600, 6)\n",
987
+ "(798, 600) \n",
988
+ "\n",
989
+ "(798, 300, 6)\n",
990
+ "(798, 300) \n",
991
+ "\n",
992
+ "Working on 51 sample\n",
993
+ "[11]\n",
994
+ "[16] \n",
995
+ "\n",
996
+ "(882,)\n",
997
+ "(781,) \n",
998
+ "\n",
999
+ "(781, 600, 6)\n",
1000
+ "(781, 600) \n",
1001
+ "\n",
1002
+ "(781, 300, 6)\n",
1003
+ "(781, 300) \n",
1004
+ "\n",
1005
+ "Working on 52 sample\n",
1006
+ "[11]\n",
1007
+ "[17] \n",
1008
+ "\n",
1009
+ "(882,)\n",
1010
+ "(458,) \n",
1011
+ "\n",
1012
+ "(458, 600, 6)\n",
1013
+ "(458, 600) \n",
1014
+ "\n",
1015
+ "(458, 300, 6)\n",
1016
+ "(458, 300) \n",
1017
+ "\n",
1018
+ "Working on 53 sample\n",
1019
+ "[12]\n",
1020
+ "[0] \n",
1021
+ "\n",
1022
+ "(317,)\n",
1023
+ "(1886,) \n",
1024
+ "\n",
1025
+ "(317, 600, 6)\n",
1026
+ "(317, 600) \n",
1027
+ "\n",
1028
+ "(317, 300, 6)\n",
1029
+ "(317, 300) \n",
1030
+ "\n",
1031
+ "Working on 54 sample\n",
1032
+ "[12]\n",
1033
+ "[3] \n",
1034
+ "\n",
1035
+ "(317,)\n",
1036
+ "(1866,) \n",
1037
+ "\n",
1038
+ "(317, 600, 6)\n",
1039
+ "(317, 600) \n",
1040
+ "\n",
1041
+ "(317, 300, 6)\n",
1042
+ "(317, 300) \n",
1043
+ "\n",
1044
+ "Working on 55 sample\n",
1045
+ "[12]\n",
1046
+ "[7] \n",
1047
+ "\n",
1048
+ "(317,)\n",
1049
+ "(1333,) \n",
1050
+ "\n",
1051
+ "(317, 600, 6)\n",
1052
+ "(317, 600) \n",
1053
+ "\n",
1054
+ "(317, 300, 6)\n",
1055
+ "(317, 300) \n",
1056
+ "\n",
1057
+ "Working on 56 sample\n",
1058
+ "[12]\n",
1059
+ "[8] \n",
1060
+ "\n",
1061
+ "(317,)\n",
1062
+ "(666,) \n",
1063
+ "\n",
1064
+ "(317, 600, 6)\n",
1065
+ "(317, 600) \n",
1066
+ "\n",
1067
+ "(317, 300, 6)\n",
1068
+ "(317, 300) \n",
1069
+ "\n",
1070
+ "Working on 57 sample\n",
1071
+ "[12]\n",
1072
+ "[17] \n",
1073
+ "\n",
1074
+ "(317,)\n",
1075
+ "(458,) \n",
1076
+ "\n",
1077
+ "(317, 600, 6)\n",
1078
+ "(317, 600) \n",
1079
+ "\n",
1080
+ "(317, 300, 6)\n",
1081
+ "(317, 300) \n",
1082
+ "\n",
1083
+ "Working on 58 sample\n",
1084
+ "[13]\n",
1085
+ "[0] \n",
1086
+ "\n",
1087
+ "(259,)\n",
1088
+ "(1886,) \n",
1089
+ "\n",
1090
+ "(259, 600, 6)\n",
1091
+ "(259, 600) \n",
1092
+ "\n",
1093
+ "(259, 300, 6)\n",
1094
+ "(259, 300) \n",
1095
+ "\n",
1096
+ "Working on 59 sample\n",
1097
+ "[13]\n",
1098
+ "[3] \n",
1099
+ "\n",
1100
+ "(259,)\n",
1101
+ "(1866,) \n",
1102
+ "\n",
1103
+ "(259, 600, 6)\n",
1104
+ "(259, 600) \n",
1105
+ "\n",
1106
+ "(259, 300, 6)\n",
1107
+ "(259, 300) \n",
1108
+ "\n",
1109
+ "Working on 60 sample\n",
1110
+ "[13]\n",
1111
+ "[7] \n",
1112
+ "\n",
1113
+ "(259,)\n",
1114
+ "(1333,) \n",
1115
+ "\n",
1116
+ "(259, 600, 6)\n",
1117
+ "(259, 600) \n",
1118
+ "\n",
1119
+ "(259, 300, 6)\n",
1120
+ "(259, 300) \n",
1121
+ "\n",
1122
+ "Working on 61 sample\n",
1123
+ "[13]\n",
1124
+ "[8] \n",
1125
+ "\n",
1126
+ "(259,)\n",
1127
+ "(666,) \n",
1128
+ "\n",
1129
+ "(259, 600, 6)\n",
1130
+ "(259, 600) \n",
1131
+ "\n",
1132
+ "(259, 300, 6)\n",
1133
+ "(259, 300) \n",
1134
+ "\n",
1135
+ "Working on 62 sample\n",
1136
+ "[13]\n",
1137
+ "[11] \n",
1138
+ "\n",
1139
+ "(259,)\n",
1140
+ "(882,) \n",
1141
+ "\n",
1142
+ "(259, 600, 6)\n",
1143
+ "(259, 600) \n",
1144
+ "\n",
1145
+ "(259, 300, 6)\n",
1146
+ "(259, 300) \n",
1147
+ "\n",
1148
+ "Working on 63 sample\n",
1149
+ "[13]\n",
1150
+ "[14] \n",
1151
+ "\n",
1152
+ "(259,)\n",
1153
+ "(500,) \n",
1154
+ "\n",
1155
+ "(259, 600, 6)\n",
1156
+ "(259, 600) \n",
1157
+ "\n",
1158
+ "(259, 300, 6)\n",
1159
+ "(259, 300) \n",
1160
+ "\n",
1161
+ "Working on 64 sample\n",
1162
+ "[13]\n",
1163
+ "[15] \n",
1164
+ "\n",
1165
+ "(259,)\n",
1166
+ "(798,) \n",
1167
+ "\n",
1168
+ "(259, 600, 6)\n",
1169
+ "(259, 600) \n",
1170
+ "\n",
1171
+ "(259, 300, 6)\n",
1172
+ "(259, 300) \n",
1173
+ "\n",
1174
+ "Working on 65 sample\n",
1175
+ "[13]\n",
1176
+ "[16] \n",
1177
+ "\n",
1178
+ "(259,)\n",
1179
+ "(781,) \n",
1180
+ "\n",
1181
+ "(259, 600, 6)\n",
1182
+ "(259, 600) \n",
1183
+ "\n",
1184
+ "(259, 300, 6)\n",
1185
+ "(259, 300) \n",
1186
+ "\n",
1187
+ "Working on 66 sample\n",
1188
+ "[13]\n",
1189
+ "[17] \n",
1190
+ "\n",
1191
+ "(259,)\n",
1192
+ "(458,) \n",
1193
+ "\n",
1194
+ "(259, 600, 6)\n",
1195
+ "(259, 600) \n",
1196
+ "\n",
1197
+ "(259, 300, 6)\n",
1198
+ "(259, 300) \n",
1199
+ "\n",
1200
+ "Working on 67 sample\n",
1201
+ "[14]\n",
1202
+ "[0] \n",
1203
+ "\n",
1204
+ "(500,)\n",
1205
+ "(1886,) \n",
1206
+ "\n",
1207
+ "(500, 600, 6)\n",
1208
+ "(500, 600) \n",
1209
+ "\n",
1210
+ "(500, 300, 6)\n",
1211
+ "(500, 300) \n",
1212
+ "\n",
1213
+ "Working on 68 sample\n",
1214
+ "[14]\n",
1215
+ "[3] \n",
1216
+ "\n",
1217
+ "(500,)\n",
1218
+ "(1866,) \n",
1219
+ "\n",
1220
+ "(500, 600, 6)\n",
1221
+ "(500, 600) \n",
1222
+ "\n",
1223
+ "(500, 300, 6)\n",
1224
+ "(500, 300) \n",
1225
+ "\n",
1226
+ "Working on 69 sample\n",
1227
+ "[14]\n",
1228
+ "[7] \n",
1229
+ "\n",
1230
+ "(500,)\n",
1231
+ "(1333,) \n",
1232
+ "\n",
1233
+ "(500, 600, 6)\n",
1234
+ "(500, 600) \n",
1235
+ "\n",
1236
+ "(500, 300, 6)\n",
1237
+ "(500, 300) \n",
1238
+ "\n",
1239
+ "Working on 70 sample\n",
1240
+ "[14]\n",
1241
+ "[8] \n",
1242
+ "\n",
1243
+ "(500,)\n",
1244
+ "(666,) \n",
1245
+ "\n",
1246
+ "(500, 600, 6)\n",
1247
+ "(500, 600) \n",
1248
+ "\n",
1249
+ "(500, 300, 6)\n",
1250
+ "(500, 300) \n",
1251
+ "\n",
1252
+ "Working on 71 sample\n",
1253
+ "[14]\n",
1254
+ "[11] \n",
1255
+ "\n",
1256
+ "(500,)\n",
1257
+ "(882,) \n",
1258
+ "\n",
1259
+ "(500, 600, 6)\n",
1260
+ "(500, 600) \n",
1261
+ "\n",
1262
+ "(500, 300, 6)\n",
1263
+ "(500, 300) \n",
1264
+ "\n",
1265
+ "Working on 72 sample\n",
1266
+ "[14]\n",
1267
+ "[13] \n",
1268
+ "\n",
1269
+ "(500,)\n",
1270
+ "(259,) \n",
1271
+ "\n",
1272
+ "(259, 600, 6)\n",
1273
+ "(259, 600) \n",
1274
+ "\n",
1275
+ "(259, 300, 6)\n",
1276
+ "(259, 300) \n",
1277
+ "\n",
1278
+ "Working on 73 sample\n",
1279
+ "[14]\n",
1280
+ "[15] \n",
1281
+ "\n",
1282
+ "(500,)\n",
1283
+ "(798,) \n",
1284
+ "\n",
1285
+ "(500, 600, 6)\n",
1286
+ "(500, 600) \n",
1287
+ "\n",
1288
+ "(500, 300, 6)\n",
1289
+ "(500, 300) \n",
1290
+ "\n",
1291
+ "Working on 74 sample\n",
1292
+ "[14]\n",
1293
+ "[16] \n",
1294
+ "\n",
1295
+ "(500,)\n",
1296
+ "(781,) \n",
1297
+ "\n",
1298
+ "(500, 600, 6)\n",
1299
+ "(500, 600) \n",
1300
+ "\n",
1301
+ "(500, 300, 6)\n",
1302
+ "(500, 300) \n",
1303
+ "\n",
1304
+ "Working on 75 sample\n",
1305
+ "[14]\n",
1306
+ "[17] \n",
1307
+ "\n",
1308
+ "(500,)\n",
1309
+ "(458,) \n",
1310
+ "\n",
1311
+ "(458, 600, 6)\n",
1312
+ "(458, 600) \n",
1313
+ "\n",
1314
+ "(458, 300, 6)\n",
1315
+ "(458, 300) \n",
1316
+ "\n",
1317
+ "Working on 76 sample\n",
1318
+ "[15]\n",
1319
+ "[0] \n",
1320
+ "\n",
1321
+ "(798,)\n",
1322
+ "(1886,) \n",
1323
+ "\n",
1324
+ "(798, 600, 6)\n",
1325
+ "(798, 600) \n",
1326
+ "\n",
1327
+ "(798, 300, 6)\n",
1328
+ "(798, 300) \n",
1329
+ "\n",
1330
+ "Working on 77 sample\n",
1331
+ "[15]\n",
1332
+ "[3] \n",
1333
+ "\n",
1334
+ "(798,)\n",
1335
+ "(1866,) \n",
1336
+ "\n",
1337
+ "(798, 600, 6)\n",
1338
+ "(798, 600) \n",
1339
+ "\n",
1340
+ "(798, 300, 6)\n",
1341
+ "(798, 300) \n",
1342
+ "\n",
1343
+ "Working on 78 sample\n",
1344
+ "[15]\n",
1345
+ "[7] \n",
1346
+ "\n",
1347
+ "(798,)\n",
1348
+ "(1333,) \n",
1349
+ "\n",
1350
+ "(798, 600, 6)\n",
1351
+ "(798, 600) \n",
1352
+ "\n",
1353
+ "(798, 300, 6)\n",
1354
+ "(798, 300) \n",
1355
+ "\n",
1356
+ "Working on 79 sample\n",
1357
+ "[15]\n",
1358
+ "[8] \n",
1359
+ "\n",
1360
+ "(798,)\n",
1361
+ "(666,) \n",
1362
+ "\n",
1363
+ "(666, 600, 6)\n",
1364
+ "(666, 600) \n",
1365
+ "\n",
1366
+ "(666, 300, 6)\n",
1367
+ "(666, 300) \n",
1368
+ "\n",
1369
+ "Working on 80 sample\n",
1370
+ "[15]\n",
1371
+ "[11] \n",
1372
+ "\n",
1373
+ "(798,)\n",
1374
+ "(882,) \n",
1375
+ "\n",
1376
+ "(798, 600, 6)\n",
1377
+ "(798, 600) \n",
1378
+ "\n",
1379
+ "(798, 300, 6)\n",
1380
+ "(798, 300) \n",
1381
+ "\n",
1382
+ "Working on 81 sample\n",
1383
+ "[15]\n",
1384
+ "[13] \n",
1385
+ "\n",
1386
+ "(798,)\n",
1387
+ "(259,) \n",
1388
+ "\n",
1389
+ "(259, 600, 6)\n",
1390
+ "(259, 600) \n",
1391
+ "\n",
1392
+ "(259, 300, 6)\n",
1393
+ "(259, 300) \n",
1394
+ "\n",
1395
+ "Working on 82 sample\n",
1396
+ "[15]\n",
1397
+ "[14] \n",
1398
+ "\n",
1399
+ "(798,)\n",
1400
+ "(500,) \n",
1401
+ "\n",
1402
+ "(500, 600, 6)\n",
1403
+ "(500, 600) \n",
1404
+ "\n",
1405
+ "(500, 300, 6)\n",
1406
+ "(500, 300) \n",
1407
+ "\n",
1408
+ "Working on 83 sample\n",
1409
+ "[15]\n",
1410
+ "[16] \n",
1411
+ "\n",
1412
+ "(798,)\n",
1413
+ "(781,) \n",
1414
+ "\n",
1415
+ "(781, 600, 6)\n",
1416
+ "(781, 600) \n",
1417
+ "\n",
1418
+ "(781, 300, 6)\n",
1419
+ "(781, 300) \n",
1420
+ "\n",
1421
+ "Working on 84 sample\n",
1422
+ "[16]\n",
1423
+ "[0] \n",
1424
+ "\n",
1425
+ "(781,)\n",
1426
+ "(1886,) \n",
1427
+ "\n",
1428
+ "(781, 600, 6)\n",
1429
+ "(781, 600) \n",
1430
+ "\n",
1431
+ "(781, 300, 6)\n",
1432
+ "(781, 300) \n",
1433
+ "\n",
1434
+ "Working on 85 sample\n",
1435
+ "[16]\n",
1436
+ "[3] \n",
1437
+ "\n",
1438
+ "(781,)\n",
1439
+ "(1866,) \n",
1440
+ "\n",
1441
+ "(781, 600, 6)\n",
1442
+ "(781, 600) \n",
1443
+ "\n",
1444
+ "(781, 300, 6)\n",
1445
+ "(781, 300) \n",
1446
+ "\n",
1447
+ "Working on 86 sample\n",
1448
+ "[16]\n",
1449
+ "[7] \n",
1450
+ "\n",
1451
+ "(781,)\n",
1452
+ "(1333,) \n",
1453
+ "\n",
1454
+ "(781, 600, 6)\n",
1455
+ "(781, 600) \n",
1456
+ "\n",
1457
+ "(781, 300, 6)\n",
1458
+ "(781, 300) \n",
1459
+ "\n",
1460
+ "Working on 87 sample\n",
1461
+ "[16]\n",
1462
+ "[8] \n",
1463
+ "\n",
1464
+ "(781,)\n",
1465
+ "(666,) \n",
1466
+ "\n",
1467
+ "(666, 600, 6)\n",
1468
+ "(666, 600) \n",
1469
+ "\n",
1470
+ "(666, 300, 6)\n",
1471
+ "(666, 300) \n",
1472
+ "\n",
1473
+ "Working on 88 sample\n",
1474
+ "[16]\n",
1475
+ "[11] \n",
1476
+ "\n",
1477
+ "(781,)\n",
1478
+ "(882,) \n",
1479
+ "\n",
1480
+ "(781, 600, 6)\n",
1481
+ "(781, 600) \n",
1482
+ "\n",
1483
+ "(781, 300, 6)\n",
1484
+ "(781, 300) \n",
1485
+ "\n",
1486
+ "Working on 89 sample\n",
1487
+ "[16]\n",
1488
+ "[13] \n",
1489
+ "\n",
1490
+ "(781,)\n",
1491
+ "(259,) \n",
1492
+ "\n",
1493
+ "(259, 600, 6)\n",
1494
+ "(259, 600) \n",
1495
+ "\n",
1496
+ "(259, 300, 6)\n",
1497
+ "(259, 300) \n",
1498
+ "\n",
1499
+ "Working on 90 sample\n",
1500
+ "[16]\n",
1501
+ "[14] \n",
1502
+ "\n",
1503
+ "(781,)\n",
1504
+ "(500,) \n",
1505
+ "\n",
1506
+ "(500, 600, 6)\n",
1507
+ "(500, 600) \n",
1508
+ "\n",
1509
+ "(500, 300, 6)\n",
1510
+ "(500, 300) \n",
1511
+ "\n",
1512
+ "Working on 91 sample\n",
1513
+ "[16]\n",
1514
+ "[15] \n",
1515
+ "\n",
1516
+ "(781,)\n",
1517
+ "(798,) \n",
1518
+ "\n",
1519
+ "(781, 600, 6)\n",
1520
+ "(781, 600) \n",
1521
+ "\n",
1522
+ "(781, 300, 6)\n",
1523
+ "(781, 300) \n",
1524
+ "\n",
1525
+ "Working on 92 sample\n",
1526
+ "[17]\n",
1527
+ "[0] \n",
1528
+ "\n",
1529
+ "(458,)\n",
1530
+ "(1886,) \n",
1531
+ "\n",
1532
+ "(458, 600, 6)\n",
1533
+ "(458, 600) \n",
1534
+ "\n",
1535
+ "(458, 300, 6)\n",
1536
+ "(458, 300) \n",
1537
+ "\n",
1538
+ "Working on 93 sample\n",
1539
+ "[17]\n",
1540
+ "[3] \n",
1541
+ "\n",
1542
+ "(458,)\n",
1543
+ "(1866,) \n",
1544
+ "\n",
1545
+ "(458, 600, 6)\n",
1546
+ "(458, 600) \n",
1547
+ "\n",
1548
+ "(458, 300, 6)\n",
1549
+ "(458, 300) \n",
1550
+ "\n",
1551
+ "Working on 94 sample\n",
1552
+ "[17]\n",
1553
+ "[7] \n",
1554
+ "\n",
1555
+ "(458,)\n",
1556
+ "(1333,) \n",
1557
+ "\n",
1558
+ "(458, 600, 6)\n",
1559
+ "(458, 600) \n",
1560
+ "\n",
1561
+ "(458, 300, 6)\n",
1562
+ "(458, 300) \n",
1563
+ "\n",
1564
+ "Working on 95 sample\n",
1565
+ "[17]\n",
1566
+ "[8] \n",
1567
+ "\n",
1568
+ "(458,)\n",
1569
+ "(666,) \n",
1570
+ "\n",
1571
+ "(458, 600, 6)\n",
1572
+ "(458, 600) \n",
1573
+ "\n",
1574
+ "(458, 300, 6)\n",
1575
+ "(458, 300) \n",
1576
+ "\n",
1577
+ "Working on 96 sample\n",
1578
+ "[17]\n",
1579
+ "[11] \n",
1580
+ "\n",
1581
+ "(458,)\n",
1582
+ "(882,) \n",
1583
+ "\n",
1584
+ "(458, 600, 6)\n",
1585
+ "(458, 600) \n",
1586
+ "\n",
1587
+ "(458, 300, 6)\n",
1588
+ "(458, 300) \n",
1589
+ "\n",
1590
+ "Working on 97 sample\n",
1591
+ "[17]\n",
1592
+ "[12] \n",
1593
+ "\n",
1594
+ "(458,)\n",
1595
+ "(317,) \n",
1596
+ "\n",
1597
+ "(317, 600, 6)\n",
1598
+ "(317, 600) \n",
1599
+ "\n",
1600
+ "(317, 300, 6)\n",
1601
+ "(317, 300) \n",
1602
+ "\n",
1603
+ "Working on 98 sample\n",
1604
+ "[17]\n",
1605
+ "[13] \n",
1606
+ "\n",
1607
+ "(458,)\n",
1608
+ "(259,) \n",
1609
+ "\n",
1610
+ "(259, 600, 6)\n",
1611
+ "(259, 600) \n",
1612
+ "\n",
1613
+ "(259, 300, 6)\n",
1614
+ "(259, 300) \n",
1615
+ "\n",
1616
+ "Working on 99 sample\n",
1617
+ "[17]\n",
1618
+ "[14] \n",
1619
+ "\n",
1620
+ "(458,)\n",
1621
+ "(500,) \n",
1622
+ "\n",
1623
+ "(458, 600, 6)\n",
1624
+ "(458, 600) \n",
1625
+ "\n",
1626
+ "(458, 300, 6)\n",
1627
+ "(458, 300) \n",
1628
+ "\n",
1629
+ "[[[ 4.2305e-03 5.0337e-03 -2.0325e-02 -4.2764e-05 1.2474e-02\n",
1630
+ " -8.7965e-04]\n",
1631
+ " [-1.3906e-02 2.9063e-02 -2.0546e-02 -2.9549e-03 1.8303e-03\n",
1632
+ " -1.9847e-03]\n",
1633
+ " [ 2.7433e-02 4.5905e-02 -4.0888e-03 -7.7477e-03 6.2355e-03\n",
1634
+ " -1.5093e-03]\n",
1635
+ " ...\n",
1636
+ " [-3.0725e+00 -2.7911e+00 5.3162e-01 8.5135e-01 -1.3699e-01\n",
1637
+ " 5.6564e-01]\n",
1638
+ " [-1.9467e+00 -2.9414e+00 -1.4299e-02 9.9769e-01 -2.1398e-01\n",
1639
+ " 6.5887e-01]\n",
1640
+ " [-4.5537e-01 -2.6009e+00 -1.0866e+00 1.0066e+00 -2.5817e-01\n",
1641
+ " 5.4443e-01]]\n",
1642
+ "\n",
1643
+ " [[ 1.2482e-02 -8.1862e-02 7.5474e-03 -2.4319e-02 -1.0539e-02\n",
1644
+ " -7.9325e-03]\n",
1645
+ " [ 6.7856e-02 -5.4918e-02 7.1386e-02 -2.3936e-02 1.5593e-03\n",
1646
+ " -3.3457e-03]\n",
1647
+ " [ 7.8103e-02 -1.2147e-02 6.6126e-02 -2.1341e-02 2.0339e-02\n",
1648
+ " -5.5823e-03]\n",
1649
+ " ...\n",
1650
+ " [ 6.3593e-02 -5.2421e-01 8.8235e-01 -1.1490e+00 -1.7162e-01\n",
1651
+ " 3.3109e-03]\n",
1652
+ " [ 1.8897e-01 -4.6818e-01 6.4908e-01 -1.1930e+00 -1.9300e-01\n",
1653
+ " 8.1978e-03]\n",
1654
+ " [ 5.7390e-01 -3.5587e-01 1.0611e+00 -1.2946e+00 -9.8261e-02\n",
1655
+ " 8.4003e-03]]\n",
1656
+ "\n",
1657
+ " [[ 1.2127e-02 -1.4245e-02 5.9104e-02 -3.1197e-02 6.9761e-03\n",
1658
+ " -3.9340e-03]\n",
1659
+ " [ 6.2075e-02 2.1417e-02 7.1605e-02 -2.8208e-02 1.7098e-02\n",
1660
+ " -5.2953e-03]\n",
1661
+ " [ 2.2942e-02 3.8522e-02 1.1432e-02 -3.1241e-02 1.8490e-02\n",
1662
+ " -1.3736e-02]\n",
1663
+ " ...\n",
1664
+ " [-7.6039e-01 1.0858e+00 -1.1409e+00 -4.6425e-01 9.5936e-02\n",
1665
+ " -3.7481e-01]\n",
1666
+ " [-1.3449e+00 4.8127e-01 -1.0343e+00 -5.6259e-01 3.1796e-02\n",
1667
+ " -3.7481e-01]\n",
1668
+ " [-1.5980e+00 -3.5652e-01 -1.0850e+00 -5.5465e-01 -1.2798e-02\n",
1669
+ " -3.7481e-01]]\n",
1670
+ "\n",
1671
+ " ...\n",
1672
+ "\n",
1673
+ " [[-8.7649e+00 3.3890e+00 -7.2155e+00 -1.5611e+00 -1.1298e-01\n",
1674
+ " 1.3026e-01]\n",
1675
+ " [-8.7176e+00 2.6337e+00 -6.2457e+00 -1.3539e+00 2.8779e-01\n",
1676
+ " 1.9277e-01]\n",
1677
+ " [-5.6337e+00 -4.1883e-01 -3.6112e+00 -1.1712e+00 -1.3831e-01\n",
1678
+ " 3.3798e-01]\n",
1679
+ " ...\n",
1680
+ " [ 3.6760e+00 -6.8272e+00 -1.5986e+00 2.7165e-02 4.8450e+00\n",
1681
+ " -7.2727e+00]\n",
1682
+ " [ 5.6307e-01 2.5257e+00 -8.2712e+00 4.1453e-01 7.6321e+00\n",
1683
+ " -6.7581e+00]\n",
1684
+ " [ 6.1067e+00 -1.8245e+00 2.1541e+01 1.4560e-01 2.7643e+00\n",
1685
+ " -2.8827e+00]]\n",
1686
+ "\n",
1687
+ " [[-1.5986e+00 1.4603e+00 1.2430e+00 -5.6107e-01 -1.6788e-01\n",
1688
+ " 6.4394e-01]\n",
1689
+ " [-1.3621e+00 1.5820e+00 8.6106e-01 -5.9252e-01 -1.4356e-01\n",
1690
+ " 6.5254e-01]\n",
1691
+ " [-1.1157e+00 1.7275e+00 3.9126e-01 -6.2965e-01 -1.4410e-01\n",
1692
+ " 6.2080e-01]\n",
1693
+ " ...\n",
1694
+ " [ 2.7887e+00 -1.3365e+01 -2.9645e+00 -2.0780e+00 4.2581e-01\n",
1695
+ " -2.5164e+00]\n",
1696
+ " [ 2.3173e+00 -1.1248e+01 -2.6233e+00 -1.6051e+00 1.5487e-01\n",
1697
+ " -3.6662e+00]\n",
1698
+ " [ 3.2523e+00 -9.6261e+00 1.0537e+00 -8.0884e-01 6.5590e-02\n",
1699
+ " -8.1108e+00]]\n",
1700
+ "\n",
1701
+ " [[-4.0405e-01 -2.8000e+00 2.1178e-01 -1.5460e-01 -2.6517e-01\n",
1702
+ " -3.1268e-02]\n",
1703
+ " [-7.1249e-01 -1.8576e+00 -1.0162e-01 -2.4730e-01 -2.1622e-01\n",
1704
+ " 7.4453e-02]\n",
1705
+ " [-1.0638e+00 -1.6841e+00 -5.7405e-01 -3.0087e-01 -8.0685e-02\n",
1706
+ " 1.2186e-01]\n",
1707
+ " ...\n",
1708
+ " [-9.9416e+00 -4.3555e+00 -9.0631e+00 7.0102e-01 2.7498e+00\n",
1709
+ " -1.5001e+00]\n",
1710
+ " [-6.8988e+00 -6.8906e+00 -8.5498e+00 8.7395e-01 3.7620e+00\n",
1711
+ " -2.6726e+00]\n",
1712
+ " [-3.3552e+00 -1.0050e+01 -8.3921e+00 5.3061e-01 4.4602e+00\n",
1713
+ " -3.3041e+00]]]\n",
1714
+ "[[ 0 0 0 ... 3 3 3]\n",
1715
+ " [ 0 0 0 ... 3 3 3]\n",
1716
+ " [ 0 0 0 ... 3 3 3]\n",
1717
+ " ...\n",
1718
+ " [17 17 17 ... 14 14 14]\n",
1719
+ " [17 17 17 ... 14 14 14]\n",
1720
+ " [17 17 17 ... 14 14 14]]\n",
1721
+ "(62474, 300, 6) (62474, 300)\n"
1722
+ ]
1723
+ }
1724
+ ],
1725
+ "source": [
1726
+ "new_signals = []\n",
1727
+ "new_labels = []\n",
1728
+ "\n",
1729
+ "for i in range(len(pairs)):\n",
1730
+ " print(\"Working on \", i, \"sample\")\n",
1731
+ "\n",
1732
+ " first = np.where(CLASS_LABELS == pairs[i][0])[0]\n",
1733
+ " second = np.where(CLASS_LABELS == pairs[i][1])[0]\n",
1734
+ " print(first)\n",
1735
+ " print(second, \"\\n\")\n",
1736
+ "\n",
1737
+ " first_indexes = np.unique(np.where(labels == first)[0])\n",
1738
+ " second_indexes = np.unique(np.where(labels == second)[0])\n",
1739
+ " print(first_indexes.shape)\n",
1740
+ " print(second_indexes.shape, \"\\n\")\n",
1741
+ "\n",
1742
+ " # minimum pre vytvorenie absolutne neduplicitnych prikladov - zabranenie overfit\n",
1743
+ " count = min(first_indexes.shape[0], second_indexes.shape[0])\n",
1744
+ "\n",
1745
+ " merged_signals = np.concatenate(\n",
1746
+ " (signals[first_indexes[:count]], signals[second_indexes[:count]]), axis=1\n",
1747
+ " )\n",
1748
+ " print(merged_signals.shape)\n",
1749
+ "\n",
1750
+ " merged_labels = np.concatenate(\n",
1751
+ " (labels[first_indexes[:count]], labels[second_indexes[:count]]), axis=1\n",
1752
+ " )\n",
1753
+ " print(merged_labels.shape, \"\\n\")\n",
1754
+ "\n",
1755
+ " downsample_signals = merged_signals[:, ::2, :]\n",
1756
+ " print(downsample_signals.shape)\n",
1757
+ " new_signals.append(downsample_signals)\n",
1758
+ "\n",
1759
+ " downsample_labels = merged_labels[:, ::2]\n",
1760
+ " print(downsample_labels.shape, \"\\n\")\n",
1761
+ " new_labels.append(downsample_labels)\n",
1762
+ "\n",
1763
+ "# merge all pairs into batch axis\n",
1764
+ "new_signals = np.concatenate(new_signals, axis=0)\n",
1765
+ "new_labels = np.concatenate(new_labels, axis=0)\n",
1766
+ "\n",
1767
+ "print(new_signals)\n",
1768
+ "print(new_labels)\n",
1769
+ "print(new_signals.shape, new_labels.shape)\n"
1770
+ ]
1771
+ },
1772
+ {
1773
+ "cell_type": "code",
1774
+ "execution_count": 13,
1775
+ "metadata": {},
1776
+ "outputs": [
1777
+ {
1778
+ "name": "stdout",
1779
+ "output_type": "stream",
1780
+ "text": [
1781
+ "(20655, 300, 6) (20655, 300)\n",
1782
+ "(62474, 300, 6) (62474, 300)\n",
1783
+ "Mean: [ 0.10943159 -0.07794212 -0.0883355 0.0306053 0.00974582 0.00629569]\n",
1784
+ "Std: [5.192652 3.0467124 3.9461544 1.697749 1.36974 1.4093003]\n",
1785
+ "Max: [194.52 91.779 340.59 97.376 79.272 78.783]\n",
1786
+ "Min: [-172.74 -143.17 -315.89 -113.8 -85.757 -78.866] \n",
1787
+ "\n",
1788
+ "(83129, 300, 6) (83129, 300)\n"
1789
+ ]
1790
+ }
1791
+ ],
1792
+ "source": [
1793
+ "print(signals.shape, labels.shape)\n",
1794
+ "print(new_signals.shape, new_labels.shape)\n",
1795
+ "\n",
1796
+ "# merge all pairs into batch axis\n",
1797
+ "final_signals = np.concatenate([signals, new_signals], axis=0)\n",
1798
+ "final_labels = np.concatenate([labels, new_labels], axis=0)\n",
1799
+ "\n",
1800
+ "print(\"Mean:\", np.mean(final_signals, axis=(0, 1)))\n",
1801
+ "print(\"Std:\", np.std(final_signals, axis=(0, 1)))\n",
1802
+ "print(\"Max:\", np.max(final_signals, axis=(0, 1)))\n",
1803
+ "print(\"Min:\", np.min(final_signals, axis=(0, 1)), \"\\n\")\n",
1804
+ "\n",
1805
+ "print(final_signals.shape, final_labels.shape)\n"
1806
+ ]
1807
+ },
1808
+ {
1809
+ "cell_type": "code",
1810
+ "execution_count": 14,
1811
+ "metadata": {},
1812
+ "outputs": [
1813
+ {
1814
+ "data": {
1815
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAApUAAALSCAYAAACMDCpzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAxOAAAMTgF/d4wjAACFkklEQVR4nOzdebyWc/7H8denPUWoVFq0Ux2EyiBap0QaW7YmJRVKmGSYqGTJ8kNKtorKmMTYyTBImsk2UgpF0SKjNIk2LSef3x/f6xz3aXNy3cvpnPfz8TiPuq/7Ovf3e93nvq/rc32Xz9fcHRERERGROIplugIiIiIisvdTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERia1ABZVmNtrMlpiZm1nTfP7OAWb2NzP7wsw+NbPbU1xNEREREdlOgQoqgaeBlsDSPfidR4HZ7t7Q3ZsA96aiYiIiIiKyawUqqHT3Ge6+fPvtZtbczKaZ2YdmNtvMukbb6wPNgHsSXmNF+mosIiIiIgAlMl2BX2Nm+wNjgVPc/VszqwR8ZGbvAI2B5cCDZtYMWA1c6+6zM1ZhERERkSKowAeVwPFAXeAfZpa4/VBC/VsAg939EjPrBLxsZrXdfWv6qyoiIiJSNO0NQaUBn7r78Ts8EVonv3H3twDc/R9mVgo4BFiU3mqKiIiIFF0FakzlLrwD1DGz9jkbzKxpFDzOAtaa2RHR9haEIPTrjNRUREREpIgyd890HXKZ2cPAqUBVwvjIde5e38yOBu4CKgIlgWXA6e6+ycyOAR4AygKbgUHu/nZGDkBERESkiCpQQaWIiIiI7J32hu5vERERESngFFSKiIiISGwFZvZ36dKlvXLlypmuhoiIiIjswjfffLPF3Uvv7LkCE1RWrlyZ5ct3WExHRERERAoIM1u1q+fU/S0iIiIisSmoFBEREZHYFFSKiIiISGwFZkyliIiISFw///wzysH925kZxYr9tjZHBZUiIiKy19uyZQvLli1j69atma7KXq9kyZLUqlWLUqVK7dHvKagUERGRvd6yZcvYd999qVixImaW6erstdyd1atXs2zZMurXr79Hv6ugUkRERPZqP//8M1u3bqVixYqUKKHQJq6KFSvy/fff8/PPP+9RV7gm6oiIiMheLWcMpVookyPnfdzTsan5DufN7J9AVeBnYB1whbvP3sl+FwPXEQLWaUA/d9cABxEREUmr2tdNTcnrLrn91PyVX7s2pUuXpmzZsgCsXbuWP/zhD4wcOfI3lz19+nSuuuoq5syZ85tfI1X2pI34HHf/AcDMzgAmAkcm7mBmdYCbgaOBlcALQF/g/iTUVURERGSv8uSTT9K0adNMVyMt8t39nRNQRioAO2sTPRt40d1XeGgzfQg4P1YNRURERAqBiRMncvrppwOhxTErK4t+/fpx5JFH0qRJEz788EMAsrOz6dixI82aNaNJkyZccMEFbNiwIYM1z589GlNpZo+Z2deE1sjuO9mlFrA04fGSaJuIiIhIkXPuuefStGlTmjZtypo1a/I8t2DBAnr06MHHH3/MgAEDuP766wEoXrw4kydP5sMPP+STTz6hQoUK3HfffZmo/h7Zo6DS3S9095rADcAdcQo2s4FmtjznZ/369XFeTkRERKTAefLJJ5kzZw5z5szhgAMOyPNc/fr1OfbYYwE47rjj+PLLL4EwQWbkyJEcddRRHHHEEUydOrVAjqHc3m+a/e3uk4A2ZlZxu6eWAYckPK4dbdvZa9zj7jVyfsqXL/9bqvKr7rjjDho2bEixYsUwM6ZPn5773Lnnnku1atUws1+dMXbjjTfm7pf407NnTwDGjx9P1apVOfDAA7n11ltzf2/GjBnUr1+fn376KRWHJyIiInupMmXK5P6/ePHiZGdnAzB58mSmTZvG22+/zbx58xg0aBCbNm3KVDXzLV9BpZntb2YHJzw+HVgNfL/drs8AXcysqoUo7VJgSpLq+pts2rSJzp07U6vWjr3wZkavXr3y9Tpnn302TzzxRO7P4YcfDsCxxx7Lpk2b6NevHy1btqRr167ccMMNfPXVV2zevJm+ffty//335878EhEREdmdNWvWUKlSJfbbbz/WrVvHxIkTM12lfMlvS2UF4Hkzm2dmHwOXA53d3c1svJl1AXD3r4BhwExgEbAKeDgF9c63YcOGcc8991C1atUdnpsyZQpDhgzJ1+tkZWVx3nnncd5553H88cczf/58KlWqRM+ePdm0aRNbt27lmGOOoWXLlgCsW7eOW265hWOOOYaOHTsm9Zj2FmolFhER2XMXXnghGzdu5NBDD6VTp06ceOKJma5SvuQrpZC7LwVa7OK53ts9HgeMi1+1gmvUqFFkZ2fTv39/ypYtS9myZbnwwgsZPHgwAO3atcPMGDduHHPnzs1wbTMnp5X42WefZenSpXmey2klHjFixK++ztlnn81hhx2W+3jEiBHMmzcvTytxly5dqFixIjfccAPnn38+1atXVyuxiEgRl998kikrf8mSPI979uyZ2yDSunXrPOMks7KycvevUKECb7zxxk5fc/vfK0hsT7Olp0qNGjV8+fLlKXv93/3ud7z//vu89dZbtG7dOnf7pk2bcoOO/LwXa9eupWbNmmzdupWlS5dSuXLl3Oc++eQTtmzZwhFHHMGJJ55I7969qVatGn/+85/ZuHEjl1xyCddee23Sj62gS9Z7D2Ft13r16rH//vuzbNkyNm/ezAEHHMCIESOoUaMGF154IXPmzOHpp5/mq6++4m9/+1sqDklERAqQbdu28cUXX9CwYUOKFy+e6ers9Xb3fprZN+5eY2e/pwUyd2Hbtm1s3bqV4sWLU7JkydztY8eOZe3atVx66aV5AkoIdxkAY8aMoVSpUvTq1Su3xeykk06iXbt2nHnmmTRo0CCtx1KYqJVYRESkYCr0a3/PmDGD8ePHs2rVKgCmTp3K+PHjgTDNP3Hw6/jx45k6NSzp9Ne//pWyZcvSvfsv6Tizs7MZPXo0xYoVY+DAgTstb/ny5QwfPpyHH34YM2Pbtm3MmDGDp59+GgjBqvw2a9euZfz48ZQtW5b+/fvnbp80aRLz5s1j1qxZvPrqq1xyySXceuutfPjhh2RlZVG3bl3uuCNWBiwRERH5FYW+pfLRRx9l0qRJuY/vuusuAHr37s21116bZ6xfnz59aNWqFaeeuvMxGE899RRff/01Z5xxxi5bG/v160f//v1zxwCOGTOGq666ilmzZvGXv/wlz9hA2Tm1EouIiOx9isyYSkm/GTNm8MUXX3Dbbbfx1VdfMWjQIA499FB69+7Nk08+yZo1a7jssssAGDduHNWqVePUU09l4sSJXHTRRZx77rlMmRIyUmVnZ1O3bl2++eYbFixYsNPgcPny5Rx11FH861//4rDDDqNKlSo0adKEww47jAcffJD58+crqBcRKYQ0pjK5NKZSChy1EouIiBQdaqkUERGRvZpaKpNLLZUiIiIiiW6skKLX/TFfu9WuXZsyZcrwySefUKJECLmaNWvGXXfdlSfFXmFR6Gd/i4iIiGTK5s2beeSRRzJdjbRQUCkiIiKSIjfeeCM333wzGzduzLN93bp19OnThxYtWnDEEUfQt29ftmzZktvtDGFhkCpVquTmYp4xYwZt27ZN+zHkV5Ht/q593dSUl5Hp5aFEREQks4488kjatGnDyJEjuf7663O3X3311Zx44omMGzcOd6dPnz6MGjWKa665hs2bN7Ns2TLWrFlD3bp1efPNNwF4/fXXad++faYO5VcV2aBSMkcBvYiIFCU333wzLVq04NJLL83d9vzzz/Puu+9yzz33APDTTz/lTopp164db7zxBmvWrKF79+6MHTuWH374gTfeeIN77703E4eQLwoqRURERFKodu3aXHDBBdxyyy2529ydZ555JrerO1H79u15+eWXWbNmDaNGjWLhwoU899xzLFy4kGbNmqWz6ntEYypFREREUuyGG27g8ccf57///S8Ap59+OnfccQfZ2dkArFmzhkWLFgGhpfLNN99kyZIlNGzYkPbt2zN8+HBatmxZoFMmKagUERERSbFKlSpxxRVX8O233wIwcuRIypYtS9OmTTniiCNo164dS5YsAaBKlSpUqVKF4447DoBWrVrx3//+l3bt2mWq+vmi7m8REREpnPKZTzJVcoLEHEOGDGHIkCG5j8eMGbPL3507d27u/8uXL8+WLVuSXr9kU0uliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2pRQSERGRQunwSYen5HXn9ZiXr/22bNnCkCFDeOaZZyhZsiQlSpRg0KBB9OjRY6f7Dx06lEMPPZRu3brt9nVffPFF3nrrLUaOHLnHdc8xffp0rrrqKubMmfObX2N7CipFREREUqBnz55s3ryZjz/+mHLlyrFkyRI6depEdnY2F198cZ59s7Ozuemmm/L1ul26dKFLly6pqHIs6v4WERERSbKFCxfy/PPPM3bsWMqVKweENcDvvvtuhg8fzvTp02nSpAkXX3wxTZs25bnnnqNnz57ce++9AKxbt45zzz2Xww47jBNPPJFLLrmEnj17AjBx4kROP/10ILQ4ZmVl0a9fP4488kiaNGnChx9+CIRAtWPHjjRr1owmTZpwwQUXsGHDhpQds4JKERERkSSbPXs2DRo0oGLFinm2H3fccXz99desWrWK+fPnc+GFFzJnzhy6du2aZ7+bbrqJsmXLMn/+fF555RXeeeedXZa1YMECevTowccff8yAAQO4/vrrAShevDiTJ0/mww8/5JNPPqFChQrcd999yT/YiIJKERERkQyoW7curVq12ulzb775JhdddBFmxr777su55567y9epX78+xx57LBCC1i+//BIAd2fkyJEcddRRHHHEEUydOjWpYyi3p6BSREREJMmOOuooFi5cyOrVq/Nsf/fdd6lZsyaVK1emfPny+X49M9vlc2XKlMn9f/HixcnOzgZg8uTJTJs2jbfffpt58+YxaNAgNm3atIdHkn8KKkVERESSrEGDBpx22mn07duXjRs3ArBkyRKuvvpqhgwZ8qu/37ZtWyZNmoS7s379ep566qk9rsOaNWuoVKkS++23H+vWrWPixIl7/Bp7QkGliIiISAo89thj1K1bl8MPP5xGjRrRuXNnrrnmGvr06fOrvzt06FDWrVtHo0aNOPnkkznyyCPZf//996j8Cy+8kI0bN3LooYfSqVMnTjzxxN94JPlj7p7SAvKrRo0avnz58rSVV/u6qSkvY8ntp6a8jL2R3nsREUmmbdu28cUXX9CwYUOKFy+e6eokxdatW9m2bRtlypRhw4YNdOzYkQEDBux2bGWy7O79NLNv3L3Gzn5PeSpFRERECpg1a9bQqVMntm3bxqZNm/jDH/7AOeeck+lq7ZaCShEREZEC5qCDDmLWrFmZrsYe0ZhKEREREYlNQaWIiIjs1XaXbkd+uz19XxVUioiIyF7NzDAztm7dmumqFApbt27NfU/3hMZUioiIyF7NzNh///1ZuXIl1atXV8tlDO7OypUr2X///RVUioiISNFz0EEHsXTpUhYuXJjpquz1ypQpw0EHHbTHv6egUkRERPZ6xYoVo06dOvz8888UlBzceyMzo1ix3zY6UkGliIiIFBq/NSCS+PTOi4iIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkSS7o477qBhw4YUK1YMM2P69Om5z7344otkZWVRunRp6tSpw8MPP/yrr/fDDz9Qq1YtzIzf/e53udvHjx9P1apVOfDAA7n11ltzt8+YMYP69evz008/JfW4RERk1xRUikjSbdq0ic6dO1OrVq082xctWsRZZ53Fhg0bGDVqFJUrV+bSSy/ljTfe2O3r9e3blzVr1uxQRr9+/WjZsiVdu3blhhtu4KuvvmLz5s307duX+++/n7Jlyyb92EREZOcUVIpI0g0bNox77rmHqlWr5tn+8MMPk52dzcCBA7n00ku55ZZbALjvvvt2+VoTJkzg5Zdf5o477sizfdOmTWzdupVjjjmGli1bArBu3TpuueUWjjnmGDp27JjkoxIRkd0pkekKiEjRsXDhQoDcFsxDDjkEgC+++GKn+y9atIgrrriCu+++m0aNGuV5bv/99+fCCy9k8ODBALRr1w4zY9y4ccydOzdVhyAiIruglkoRyRh33+3zffr0ISsri9///vd88803AGzevJnFixcDMGnSJObNm8esWbN49dVXueSSS7j11lv58MMPycrKom7duju0cIqISGqopVJE0qZBgwYALF26FIBly5bl2Z6dnU12djYlSpSgRIkSLF68mKVLl+Y+DzBnzhyOOuoofvjhBwCysrIAGDNmDKVKlaJXr15Ur16dvn37ctJJJ9GuXTvOPPPMPK8hIiLJp6BSRJJuxowZfPHFF6xatQqAqVOnsmjRIvr27cvIkSMZOXIkpUuX5pFHHgFgwIABANxyyy0MHz6ca6+9lttvv50HH3yQDRs2APDpp59y44030qBBA+6666485S1fvpzhw4fzr3/9CzNj27ZtzJgxg++++w6Abdu2pevQRUSKLAWVIpJ0jz76KJMmTcp9nBMEujtPP/00119/PQMGDODggw/m/vvv5/e///1OX6dTp065/69UqRIABx54IF26dMmzX79+/ejfvz+HHXYYEFotr7rqKmbNmsVf/vKX3O0iIpI69mtjmtKlRo0avnz58rSVV/u6qSkvY8ntp6a8jL2R3nsREZG9k5l94+41dvacJuqIiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU2zv0UkLdIxQQs0SUtEJFPUUikiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiS1fQaWZlTGz583sCzP72MxeN7P6O9mvtpltM7M5CT/1kl9tERERESlISuzBvmOBf7i7m9nlwHig9U72W+fuTZNQNxERERHZS+SrpdLdN7n7K+7u0ab3gNopq5WIiIiI7FV+65jKK4EXdvFcOTP7j5l9ZGZDzaz4byxDRERERPYSexxUmtlgoD7wl508/S1Q3d2bA+2BE4Grd/E6A81sec7P+vXr97QqIiIiIlJA7FFQaWaDgDOBTu6+cfvn3X2zu38X/f974FFCYLkDd7/H3Wvk/JQvX37Pay8iIiIiBUK+g0ozGwicD/ze3X/YxT4HmVnJ6P+lCQHo7CTUU0REREQKsPymFKoB3A3sD7wVpQp6P3ruJjO7NNq1JTDbzD4GPgJWALcmvdYiIiIiUqDkK6WQuy8HbBfPDU34/7PAs8mpmoiIiIjsLbSijoiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhJbiUxXIFOWlLkgDaX8mIYy9j5670VERAoftVSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisZXIdAVEpGhYUuaCNJX0Y5rKERGRRGqpFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIikzYcIEmjRpQtmyZTnggANo3749c+fO3e3vDBgwADPDzFiwYAEACxcupEWLFpQrV4727duzevVqALZs2ULjxo157bXXUn4sIrJ7CipFRCQlvvrqK3r16sWyZcu45557OP3003nzzTe59NJLd/k7U6dO5aGHHqJMmTJ5tt98882sWLGCW2+9lffff5/Ro0cDMGLECJo2bUrHjh1Teiwi8usUVIqISEr8/PPPmBn77bcf7du357jjjgPgwAMP3On+K1eupFevXgwePJgqVarkeW7dunVUq1aNjh07sv/++7N27Vrmz5/PQw89xMiRI1N+LCLy6xRUiohIStSvX5+HH36YVatW0bBhQy655BIOP/xwJkyYsMO+7k7Pnj2pX78+Q4cO3eH5vn378vHHH9O4cWPWr19Pjx496NOnD7fccssOAaiIZIaCShERSYnvv/+e2267jX333ZcnnniCwYMHM2/evJ12fz/22GNMmzaNG2+8kcWLF5OdnQ3AsmXL2LBhA506dWLZsmXMnDmTxYsX8+6771KsWDG6dOnCaaedRs2aNTnttNNyx1qKSPopqBQRkZSYNm0aixcvpmXLlpx33nnccMMNALz44ou4O5s2bWLz5s0ALF68mC1bttChQwcaNGjAN998A0DHjh15/fXXATjooIM4/vjj2bhxI8OGDePhhx/m3nvv5fPPP2fBggXMnz9fXeEiGVQi0xUQEZHCqUGDBpgZb731FmPGjOHTTz8FICsri6VLl1KnTh2qVKnCihUrOOecc8jKysr93X79+rFq1SpGjRpFixYt8rxu//79ueyyy2jUqBHbtm1j5cqVjBs3jlWrVuW2cIpI+imoFBGRlDjyyCN55JFHuPvuu/nzn/9MmTJl6NSpE/fcc88O+zZu3JjGjRvnPh40aBAAHTp04OCDD87d/uyzz/LZZ58xZcoUAK688kpmzpzJ4MGDOeaYY7jyyitTfFQisivm7pmuAwA1atTw5cuXp6/AGyukoYwfU1/G3kjvfdGUjr876G8vIpJCZvaNu9fY2XMaUykiIiIisSmoFBEREZHYFFSKiIiISGyaqCMiIilV+7qpKS9jye2nprwMEdk9tVSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGLLV1BpZmXM7Hkz+8LMPjaz182s/i727WxmC8xsoZk9a2b7JbfKIiIiIlLQ7ElL5VjgUHc/EngBGL/9DmZWHngEON3dGwD/BYYko6IiIiIiUnDlK6h0903u/oq7e7TpPaD2TnbtBMx29wXR4weA82PXUkREREQKtN86pvJKQmvl9moBSxMeLwGqmVmJ31iOiIiIiOwF9jjYM7PBQH2gXZyCzWwgMDDncYUKFeK8nIiIiIhk0B61VJrZIOBMoJO7b9zJLsuAQxIe1wa+dffs7Xd093vcvUbOT/ny5fekKiIiIiJSgOQ7qIxaFs8Hfu/uP+xit1eBo83ssOhxP2BKrBqKiIiISIGXr+5vM6sB3A18BbxlZgCb3f1YM7sJ+K+7P+Tu68ysN/B8NI7yE6BHiuouIiIiIgVEvoJKd18O2C6eG7rd4xeBF+NXTURERET2FlpRR0RERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUikihNn36dMxsh5/atWvvdP/atWvvsO/zzz8PwMsvv0zt2rWpUKEC/fr1y/2dhQsXUq1aNVasWJGGIxIp+PS9K5pKZLoCIiKp1LhxY5544oncx88//zxPPvkkxx577C5/p1GjRgwdOjT3cfPmzQHo168f9erVo1u3bowYMYKuXbvSpk0b+vbty/Dhw6latWrqDkRkL6LvXdGkoFJECrWDDjqI8847DwB358YbbwTgmmuu2e3vnHrqqZQvXx4zy92+bt06GjduTPv27RkxYgRr167lkUceYevWrfTp0yelxyGyN9H3rmhS97eIFBkvv/wyn3/+Oa1ataJZs2a73G/GjBnst99+lC1bljPPPJNVq1YBcMUVV/DAAw/Qtm1bsrKyyMrK4vrrr2fs2LF5LoIi8gt974oOtVSKSJFx9913A7tvLenVqxcNGjSgXLly3H///Tz33HPss88+PP744wwfPpzu3bvz/fff07RpU7p3706fPn1Yv349zZs3Z9WqVZxxxhncc889utiJRPS9KzoUVIpIkTBr1izefvttGjduzCmnnAKEbrnNmzdjZpQuXRogz5iuqlWr8s9//pO5c+fmbqtfvz4QWl9mz57NpEmTaNu2LU2aNGHo0KHUq1ePU089lfbt26fx6EQKpkx876ZPn06bNm12qMshhxzCkiVLdlnXAQMGMGbMGADmz5/PYYcdxsKFC+nWrRuffvopxx13HE8++SQVK1Zky5YtNG3alJEjR9KxY8fY71NhoaBSRIqEu+66C4Crr746tzVj6dKl1KlThypVqrBixQrmzp3LoEGD6NSpExUqVOCRRx4BoGXLlnlea/369fTv358JEyZQpkwZtm3bxpw5c5gwYQIA2dnZaTwykYIrE9+73zJJaOrUqTz00EOUKVOGTZs25W6/+eabWbFiBbfeeitDhgxh9OjRDB8+nBEjRtC0aVMFlNvRmEoRKfSWLVvG008/TdWqVfnjH/+4y/0qV65MmTJluOOOO7jssstYvnw5V111Ve6FMcfgwYNp06YNbdu2BeDOO+9kw4YNjBw5kp49e9KhQ4eUHo/I3iBT37ucSULnnXce5557LnPmzAF23f2+cuVKevXqxeDBg6lSpUqe59atW0e1atXo2LEj+++/P2vXrmX+/Pk89NBDjBw58re+NYWWuXum6wBAjRo1fPny5ekr8MYKaSjjx9SXsTfSe180pePvDvrbF0C1r5ua8jKW3H5qysuQvc9LL71Ely5daNWqFdOnT9/heXfnlFNOYe3atcyYMYN69eqxdOnS3O7vf/zjH5xxxhls3ryZ/fffn7feeovLL7+cnj170rt37/QfUAFgZt+4e42dPaeWShERESmUfm2S0GOPPca0adO48cYbWbx4cW4X+rJly9iwYQOdOnVi2bJlzJw5k8WLF/Puu+9SrFgxunTpwmmnnUbNmjU57bTTWL16ddqOqSBTUCkiIiKFzq4mCW3atInNmzcDsHjxYrZs2UKHDh1o0KAB33zzDQAdO3bk9ddfB0J3+vHHH8/GjRsZNmwYDz/8MPfeey+ff/45CxYsYP78+eoKj2iijogUCeqCFUm/TH7v8jNJ6JxzziErKyv3d/r168eqVasYNWoULVq0yPN6/fv357LLLqNRo0Zs27aNlStXMm7cOFatWqXJeREFlSIiIlKo5HeSUOPGjWncuHHu40GDBgHQoUMHDj744Nztzz77LJ999hlTpkwB4Morr2TmzJkMHjyYY445hiuvvDJFR7J3UVApIiIihUqtWrXYunXrDttr167N7iYo7yqP5ZlnnsmZZ56Z+/jggw/m3//+d+x6FjYaUykiIiIisSmoFBEREZHY1P0tIiIihU46JgmBJuglUlApIiIptaTMBWkoRUnvRTJN3d8iIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEluJTFdARCQdlpS5IA2l/JiGMkRECia1VIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKU+liIiIpITywxYtaqkUERERkdgUVIqIiIhIbAoqRURERCQ2jakUERGRQic94zlBYzp/oZZKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhs+QoqzWy0mS0xMzezprvYp7WZ/WRmcxJ+yia1tiIiIiJSIJXI535PA3cC//6V/T5396axaiQiIiIie518BZXuPgPAzFJbGxERERHZKyV7TGU9M/vIzP5jZv2S/NoiIiIiUkDlt/s7Pz4Carj7j2ZWA3jFzP7n7k/tbGczGwgMzHlcoUKFJFZFRERERNIpaS2V7r7W3X+M/r8ceAI4cTf73+PuNXJ+ypcvn6yqiIiIiEiaJS2oNLNqZlYs+v++QGdgdrJeX0REREQKrvymFHrYzJYDNYDXzGxRtH28mXWJdjsLmGdmHwPvAa8DE1JQZxEREREpYPI7+/uSXWzvnfD/McCYJNVLRERERPYiWlFHRERERGJTUCkiIlII1a5dGzPL8/P888/vsN/EiRN32M/MaN26NQAvv/wytWvXpkKFCvTr90u2wIULF1KtWjVWrFiRpiOSgi6ZKYVERESkAGnUqBFDhw7Nfdy8efMd9mnVqhVPPPFE7uNx48Yxbdo0jj32WAD69etHvXr16NatGyNGjKBr1660adOGvn37Mnz4cKpWrZr6A5G9goJKERGRQuqggw7i1FNPpXz58rtcFa9OnTrUqVMHgA0bNtCvXz9KlSrFlVdeCcC6deto3Lgx7du3Z8SIEaxdu5ZHHnmErVu30qdPn7QdixR86v4WEREppGbMmMF+++1H2bJlOfPMM1m1atVu93/00UdZs2YN559/PgcffDAAV1xxBQ888ABt27YlKyuLrKwsrr/+esaOHavlmyUPtVSKiIgUQr169aJBgwaUK1eO+++/n+eee4599tmHxx9/fKf7//zzz9x7770ADBo0KHf78OHD6d69O99//z1Nmzale/fu9OnTh/Xr19O8eXNWrVrFGWecwT333KMgs4hTUCkiIlIIJY6lrFq1Kv/85z+ZO3cuP//8M1u2bKFYsWKUKlUqd59nn32Wr776ipNPPpmsrKw8r1W/fn0gTNqZPXs2kyZNom3btjRp0oShQ4dSr149Tj31VNq3b5+eg5MCSd3fIiIihczcuXPp0KEDI0eO5NFHH+VPf/oTAC1btmTGjBmULVuWk046Kc/v3H333QBcc801O33N9evX079/fx566CHKlCnDtm3bmDNnDhMmhHVOsrOzU3hEsjdQUCkiIlLIVK5cmTJlynDHHXdw2WWXsXz5cq666iruuuuune7/zjvv8N5773H00UfTtm3bne4zePBg2rRpk/v8nXfeyYYNGxg5ciQ9e/akQ4cOKTse2Tuo+1tERKSQqVatGi+++OJOn2vdujXunmfb8ccfv8O27Y0ePTrP41atWrFw4cJ4FZVCRS2VIiIiIhKbgkoRERERiU3d3yIiIoVU7eumpryMJbefmvIyZO+glkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisZXIdAVEREQkNZaUuSANpfyYhjJkb6CWShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiKTBgwADMDDNjwYIFO92ndevWufvk/Nx7770AvP/++zRu3Jjy5cvTtWtXNm/eDMDq1aupXr06n3zySboOJV9KZLoCIiIiIoXN1KlTeeihhyhTpgybNm3a7b6VKlXivvvuy3189NFHA3DNNddQsmRJhg0bxrXXXsspp5zCRRddxNVXX02PHj3IyspK6THsKQWVIiIiIkm0cuVKevXqxeDBg5k0aRJLly7d7f7lypWjc+fOlC1bluLFi+duX7duHXXq1KFDhw4MHTqUtWvX8sYbbzBz5kzmzp2b6sPYY+r+FhEREUkSd6dnz57Ur1+foUOH5ut3li1bxr777kuZMmVo164dixYtAqB///689NJLNG3alIoVK9K5c2cuvfRSHnzwQcqWLZvKw/hNFFSKiIiIJMljjz3GtGnTuPHGG1m8eDHZ2dlACBw3bNiww/5nnHEGEydO5KWXXuKcc85h2rRp9OzZE4DevXuzZMkS3n33XT7//HPGjh3LcccdR+3atWndujW1atWie/fuuWMtM03d3yIiIiJJsnjxYrZs2UKHDh3ybO/YsSPPPfccJ598MgBlypQB4Morr8zdp0WLFkyePDlP13bNmjWpWbMmc+bMYdKkScybN48rr7ySYsWKMW/ePKpXr06rVq3o3bt3Go5u99RSmSH5mRGW4+67787d99VXXwVg1apVtGvXjnLlynHsscfy5Zdf5u7fvn17Hn744ZTWX0RERHZ0zjnn8Pe//z33p3LlygCMGjWKFi1aULZsWcqWLcumTZv48ccfOf7447nzzjuZOHEivXr1AqBly5Z5XnPbtm306dOH2267jcqVK7Nt2zYWLVrE+PHj2bhxY25raKYpqMyAxBlhv2bOnDkMHjyYcuXK5dl+33338eGHHzJixAi++eYbbrrpJgAmTpzIpk2b6Nu3b0rqLiIiIrvWuHFjzj777NyfffbZB4AOHTpw8MEH59m3dOnS1KxZk9GjR3PJJZfw0UcfcdFFFzFp0qQ8+40aNYry5ctz0UUXATBkyBAOOOAAhg4dyimnnEL37t3Tc3C/Qt3fabYnM8I2btzI+eefz3nnncfSpUt5++23c59bt24dFSpUoEOHDjz++OOsXbuW7777jr/85S+88cYbmFk6DkdERER2Y8mSJXkeu3uex08++eSvvsbAgQMZOHBg7uOsrCw+/vjjpNQvmdRSmUZ7OiNs4MCBbN26lTFjxuzwXI8ePVi7di2NGzfmk08+4dJLL+Wqq67i4osvpkmTJqmovoiIiMguqaUyjXJmhL388ss7zAirWbNmni7u6dOnM3bsWB5//HFWrlzJTz/9BMC3337Ljz/+SNOmTVmyZAmfffYZ9evXZ9asWXz44Yfcf//9dOvWjX/961/Uq1ePRx55hLp162bkeEVERIqq2tdNTXkZS24/NeVl7Am1VKZR4oywBg0a8M033wBhRtjrr7/Opk2bcrPuL1myBHenW7duNGjQgA8++ACAXr16MWHCBAD2339/jj/+eMqVK8dll13Ggw8+yN///ndeeOGF3KWbdtUimp+JQt27d6dy5cqUKlWKKlWq0L17d3744Qdg71s6SkRERFJLQWUa7cmMsDZt2uTZt3HjxgBcf/31dO7cOc/r3nDDDbRq1Yp27dqxbds2Nm7cyLhx4/jyyy93OiMsvxOF6tWrx0033cTYsWOpW7cujz/+OLfeeiuQd+moZ555hsmTJwMU2KWjREREJLXU/Z1GjRs3zg0OAQYNGgTsfEbYIYccwiGHHJL7OGdcZcuWLalfv37u9v/85z9MnjyZTz/9FAitiy+//DJDhw6lQYMGO7RU7slEoRtvvJEff/yRtWvX8vbbb/Pee+/lTgDa25aOEhERkdRSUJlBvzYjLNH06dN3ur158+asXLky93H58uWZOnXn4zi2nyi0fcqCnWnXrh2zZs3K/f/1118PhKWjLrnkEl544QWqV69O586d6dixIw899FCBXDpKREREUkvd30XIni4dBfDAAw/w3HPP0aFDB958883c8Zx729JRIiIiklpqqcyAdMwIgx1nhe3p0lEQlowCOPjgg/nnP//JI488wlVXXQXsXUtHiYiISGopqCxCzjnnnDwTaPr168eqVavyTBQC+Omnn1i0aBFDhgyhffv2lClThkcffRSAI488Ms9r7i1LR4mIiEhqKagsQvZkotC+++7Lt99+y+DBg9m0aRNVq1alX79+3HbbbXn229nSUd26dStwS0eJiIhIaimoLMJ2N1HokEMO4b333vvV19hblo4SERGR1NJEHRERERGJTS2VRVBRXDpKREREUkstlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxJavoNLMRpvZEjNzM2u6m/0uNrOFZvalmY0zs5JJq6mIiIiIFFj5bal8GmgJLN3VDmZWB7gZOBGoD1QB+satoIiIiIgUfPkKKt19hrsv/5XdzgZedPcV7u7AQ8D5cSsoIiIiIgVfMsdU1iJvS+aSaNtOmdlAM1ue87N+/fokVkVERERE0qlEpgp293uAe3Ie16hRwzNVFxEREZFkWlLmgjSU8mMaysi/ZLZULgMOSXhcO9omIiIiIoVcMoPKZ4AuZlbVzAy4FJiSxNcXERERkQIqvymFHjaz5UAN4DUzWxRtH29mXQDc/StgGDATWASsAh5OSa1FREREpEDJ15hKd79kF9t7b/d4HDAuCfUSERERkb2IVtQRERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKZImbdq04YADDqBUqVLUqFGDAQMGsHnz5t3+TpcuXTAzzIxNmzYB8P7779O4cWPKly9P165dc19j9erVVK9enU8++STlxyIiIrI9BZUiadK0aVPuvPNOHnjgAfbdd1/GjBnD+PHjd7n/Aw88wFtvvbXD9muuuYaSJUsybNgwnnnmGSZPngzA1VdfTY8ePcjKykrZMYiIiOyKgkqRNBk5ciRnnXUWbdu25ZBDDgHAzHa672effcagQYMYPXr0Ds+tW7eOOnXq0KFDB0qXLs3atWt54403mDlzJkOGDEnpMYiIiOyKgkqRNGrYsCH16tXjtddeo1u3bvTu3XuHfTZv3swFF1zAaaedxkUXXbTD8/379+ell16iadOmVKxYkc6dO3PppZfy4IMPUrZs2XQchoiIyA4UVIqk0bPPPsuTTz5J8+bNmTJlCi+99NIO+9x+++0sW7aMa665hkWLFuVu/+qrr9iyZQu9e/dmyZIlvPvuu3z++eeMHTuW4447jtq1a9O6dWtq1apF9+7df3W8poiISDKVyHQFRIqSk046Kff/5557LhMnTuSMM85gy5YtFCtWjFKlSrF48WLWrFlD8+bN8/xukyZNmD17Nk2bNqVmzZrUrFmTOXPmMGnSJObNm8eVV15JsWLFmDdvHtWrV6dVq1Y7bQkVERFJBQWVImnw6quvMnnyZE444QTcnfvuuw+AI488khkzZtCmTRuOPfZY3nvvPS6//HI6d+6c+7tdu3YFYPLkydSpUyd3+7Zt2+jTpw+33XYblStXZtu2bSxatIjx48ezceNGsrOz03uQIiJSpCmoFEmDSpUqMW/ePJ577jmys7OpXr061113HcOGDWPmzJl59m3WrBnNmjXb4TXOOOMMypQpk/t41KhRlC9fPnfc5ZAhQ+jWrRtDhw7llFNOoXv37qk9KBERkQQKKkXSoFmzZsyePXunz7Vu3Rp33+Xv7uq5gQMHMnDgwNzHWVlZfPzxx/EqKiIi8htpoo6IiIiIxKaWSpE0qn3d1JSXseT2U1NehoiIyPbUUikiIiIisSmoFBEREZHYFFSKiIiISGwKKkVERFKgTZs2HHDAAZQqVYoaNWowYMCAXa509ac//YnatWtjZpgZS5YsyX3u5Zdfpnbt2lSoUIF+/frlbl+4cCHVqlVjxYoVqT4UkXxRUCkiIpICTZs25c477+SBBx5g3333ZcyYMYwfP36n+27dupXzzz+f/fbbb4fn+vXrR506dbj88st58MEHeeuttwDo27cvw4cPp2rVqik9DpH8UlApIiKSAiNHjuSss86ibdu2HHLIIQCY2U73HTNmDLfddhtly5bd4bl169bRuHFj2rdvD8DatWt55JFH2Lp1K3369EndAYjsIaUUEhERSZGGDRuyevVqALp160bv3r33+DWuuOIKbrrpJh544AGysrLIysrihBNOYNq0absMUkUyQS2VIiIiKfLss8/y5JNP0rx5c6ZMmcJLL720x68xfPhwFi5cyPvvv8+sWbMYPHgwffr0Yf369TRv3pzatWvzpz/9abcrc4mkg1oqRUREUuSkk07K/f+5557LxIkTOeOMM9iyZQvFihWjVKlS+Xqd+vXrA2HSzuzZs5k0aRJt27alSZMmDB06lHr16nHqqafmdpGLZIKCShERkSR79dVXmTx5MieccALuzn333QfAkUceyYwZM2jTpg3HHnss7733HgBTp07l22+/5aeffgLgySefpHbt2px77rm5r7l+/Xr69+/PhAkTKFOmDNu2bWPOnDlMmDABgOzs7DQfpUheCipFRESSrFKlSsybN4/nnnuO7OxsqlevznXXXcewYcOYOXPmDvv/3//9H2+//Xbu4+uuu45DDjkkT1A5ePBg2rRpQ9u2bQG488476d27NyNHjqRnz5506NAh9QcmshsKKkVERJKsWbNmzJ49e6fPtW7deofxj9OnT//V1xw9enSex61atWLhwoW/uY4iyaagUkREJEVqXzc1LeUsuf3UtJQjsjua/S0iIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEpqBSRERERGJTUCkiIiIisSmoFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpRQJa9as4Q9/+AM1a9akTJky1KpVi+uvv56ff/55p/u7O3fddRcNGjSgVKlSVKlSheuuuw6AhQsX0qJFC8qVK0f79u1ZvXo1AFu2bKFx48a89tpraTsuERGRgqJEpisgkg4//vgj8+fPp2/fvlSuXJnbbruNESNGULVqVQYMGLDD/jfccAMjRoygRYsWXHPNNWzYsIE1a9YAcPPNN7NixQpuvfVWhgwZwujRoxk+fDgjRoygadOmdOzYMd2HJyIF1JIyF6SppB/TVI7IrimolCKhRo0azJ8/n+LFiwOwefNmrrrqKubMmbPDvhs3bmTkyJGUL1+e1157jVKlSrHPPvvkPr9u3TqqVatGx44dufvuu1m7di3z58/noYce4uOPP07XIYmIiBQo6v6WIqFEiRK5AeXPP//M1KlTAWjfvv0O+3766af89NNPlC5dmqysLMqVK0fNmjV59tlnAejbty8ff/wxjRs3Zv369fTo0YM+ffpwyy23UKVKlfQdlIiISAGioFKKlM2bN3PBBRfw+uuvc8UVV3D++efvsE9O8Ll69Wp69+7NpEmTWLVqFRdccAGrV6+mU6dOLFu2jJkzZ7J48WLeffddihUrRpcuXTjttNOoWbMmp512Wu5YSxERkaJAQaUUGT/88AMdO3bkySefZNiwYYwaNQoIk3I2bdrE5s2bAahbty7FioWvxnXXXceFF17IYYcdxubNm1m2bBkABx10EMcffzwbN25k2LBhPPzww9x77718/vnnLFiwgPnz5zNy5MjMHKiIiEgGaEylFAnr16+nZcuWfPrpp5x88skcdthhTJkyhYMOOoi6detSp04dqlSpwooVK9h///3p1q0bf/3rX/nzn/9M7dq1+fTTTzn44INp1KhRntft378/l112GY0aNWLbtm2sXLmScePGsWrVKrKzszN0tCIiIumnoFKKhP/97398+umnALz66qu8+uqrALRq1YqJEyfusP99992HmfHYY4/h7rRp04a77rqLMmXK5O7z7LPP8tlnnzFlyhQArrzySmbOnMngwYM55phjuPLKK1N/YCIiIgWEgkopEmrXro277/L57Z+rUKECkyZN2u1rnnnmmZx55pm5jw8++GD+/e9/x6uoiIjIXkpjKkVEREQkNrVUSpFy+KTD01LOvB7z0lKOiIhIQaGWShGRQmpPlyfNMWDAAMwMM2PBggWAlicVkV+noFJEpJBKXJ703nvvxcwYMWIE999//y5/Z+rUqTz00EN5JqVB3uVJ33//fUaPHg2g5UlFJJe6v0VECqk9WZ4UYOXKlfTq1YvBgwczadIkli5dmvuclicVkV+jlkoRkUJqT5YndXd69uxJ/fr1GTp06A7Pa3lSEfk1CipFRAq5/CxP+thjjzFt2jRuvPFGFi9enJu8f9myZWzYsEHLk4rIr1JQKSJSiOV3edLFixezZcsWOnToQIMGDfjmm28A6NixI6+//jqg5UlFZPcUVIqIFFI5y5O+/fbbeZYnnTZtGkuXLqVs2bIccsghAJxzzjn8/e9/z/2pXLkyAKNGjaJFixZ5XndvWZ50T2e/t2nThgMOOIBSpUpRo0YNBgwYkBt0v/zyy9SuXZsKFSrQr1+/3N9ZuHAh1apVY8WKFWk5JpGCTBN1REQKqT1ZnrRx48Y0btw49/GgQYMA6NChAwcffHDu9r1pedLE2e+VK1fmtttuY8SIEVStWpUBAwbssH/Tpk254IILMDPuvvtuxowZw2GHHUb//v3p168f9erVo1u3bowYMYKuXbvSpk0b+vbty/Dhw6latWoGjlCkYFFQKSJSSO3p8qSJlixZstPte9PypHs6+33kyJF8//33/PDDDzz99NMsWLAAMwPC7PfGjRvTvn17RowYwdq1a3nkkUfYunUrffr0SdchiRRoCipFRAq52tdNTUs5S24/NS3l5FeJEr9c4n5t9nuOhg0b5k426tatG7179wbgiiuu4KabbuKBBx4gKyuLrKwsTjjhBKZNm5YbeIoUdRpTKSIihVp+Zr/nePbZZ3nyySdp3rw5U6ZM4aWXXgJg+PDhLFy4kPfff59Zs2YxePBg+vTpw/r162nevDm1a9fmT3/6025bf0UKO7VUiohIofXDDz9w+umn8/bbbzNs2DBuvPFGIHT9b968GTOjdOnSufufdNJJuf8/99xzmThxImeddRYA9evXB8KkndmzZzNp0iTatm1LkyZNGDp0KPXq1ePUU0/dbUuoSGGmoFJERAqlnNnvn376aZ7Z7wcddBB169alTp06VKlShRUrVvDqq68yefJkTjjhBNyd++67D4Ajjzxyh9fs378/EyZMoEyZMmzbto05c+YwYcIEgAI1+10k3RRUiohIobQns98rVarEvHnzeO6558jOzqZ69epcd911DBs2LM9+gwcPpk2bNrRt2xaAO++8k969ezNy5Eh69uxJhw4dUn9gIgWUxlSKFAF7mq/vjjvuoGHDhhQrVgwzY/r06bnPvf/++zRu3Jjy5cvTtWvX3Dx+q1evpnr16nzyySfpOCSRX5Uz+337n+nTp+c+l5NfslmzZsyePZt169bx008/sWjRIm677TZKliyZ5zVHjx6dJyBt1aoVCxcuZP369UyYMIFixXRZlaJLLZUiRcCe5uvbtGkTnTt35tlnn2Xp0qV5nrvmmmsoWbIkw4YN49prr+WUU07hoosu4uqrr6ZHjx5kZWWl67BE8iUds98L2sx3kUwoskHl4XVqpbyMeSkvQSR/9jRfX06X3zvvvLNDULlu3Trq1KlDhw4dGDp0KGvXruWNN95g5syZzJ07N6XHISIiBVeRDSozad9G16WppIJ556yAPv1+S76+Xenfvz+XXHIJL7zwAtWrV6dz58507NiRhx56iLJlyyatziIisnfR4A+RImRP8vXtSu/evVmyZAnvvvsun3/+OWPHjuW4446jdu3atG7dmlq1atG9e/fcsZYiIlI0qKVSpIjY03x9u1OzZk1q1qzJnDlzmDRpEvPmzePKK6+kWLFizJs3j+rVq9OqVavc1UhERKTwU1ApkkbpGfqw47CHPcnXBzBjxgy++OILVq1aBcDUqVNZtGhRniBx27Zt9OnTh9tuu43KlSuzbds2Fi1axPjx49m4caPy9YmIFDEKKougTAU2kjl7kq8P4NFHH2XSpEm5j++66y6APEHlqFGjKF++PBdddBEAQ4YMoVu3bgwdOpRTTjmF7t27p+pwRESkAFJQKVIE5OTk25Xtn5s4ceJOg81EAwcOZODAgbmPs7Ky+Pjjj2PVU0RE9l4KKkWKkMMnHZ7yMub10Nx7EZGiSLO/RURERCS2fAeVZtbAzN4xsy/M7D9m1mQn+7Q2s5/MbE7CjxLXiYiIiBRye9L9/TAw1t0nmtnZwESg+U72+9zdmyahbiIiIiKyl8hXS6WZHQQ0Ax6PNj0D1DSz+qmqmIiIiIjsPfLb/V0T+NbdswE8TBVdBuxsvb16ZvZR1EXeL0n1FBEREZECLNmzvz8Carj7j2ZWA3jFzP7n7k9tv6OZDQRy85FUqFAhyVURERERkXTJb0vl10A1MysBYGZGaKVclriTu6919x+j/y8HngBO3NkLuvs97l4j56d8+fK/9RhEREREJMPyFVS6+3eEVsg/RpvOApa7+6LE/cysmpkVi/6/L9AZmJ286oqIiIhIQbQneSovAS4xsy+A64CLAMxsvJl1ifY5C5hnZh8D7wGvAxOSWF8RERERKYDyPabS3T8HjtvJ9t4J/x8DjElO1URERERkb6FlGkVEpFBbUuaCNJTyYxrKECnYtEyjiIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbAoqRURERCQ2BZUiIiIiEpuCShERERGJTUGliIiIiMSmoFJEREREYlNQKSIiIiKxKagUERERkdgUVIqIiIhIbCUyXQERKRoOr1MrLeXMS0spIiKyPbVUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEpqBQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISW4lMV0BERFJr30bXpamkU9NUjogURGqpFBEREZHYFFSKiIiISGwKKkVEREQkNgWVIiIiIhKbgkoRERERiU1BpYiIiIjEppRCIiKSUofXqZXyMualvAQR+TVqqRQRERGR2BRUioiIiEhsCipFREREJDYFlSIiIiISmybqiIiISEpoklbRoqBSRERECp10BLSgoDaRur9FREREJDYFlSIiIiISm4JKEREREYlNQaWIiIiIxKagUkRERERiU1ApIiIiIrEppZCIFAnKlyciklpqqRQRERGR2BRUioiIiEhsCipFRFJo/vz5tGvXjrJly1KpUiWuuOIKtmzZstN9t2zZwl/+8hdq1apFqVKlqFGjBqNHjwbg/fffp3HjxpQvX56uXbuyefNmAFavXk316tX55JNP0nZMIiI7o6BSRCRFsrOz6dKlCzNnzuTmm2+mY8eO3Hfffdx000073f+iiy7i9ttvp3Hjxjz44IP0798fdwfgmmuuoWTJkgwbNoxnnnmGyZMnA3D11VfTo0cPsrKy0nZcIiI7o4k6IiIp8tprr7Fo0SLOPPNMBg0axIYNG3jqqae47777uOWWW/Ls+9VXXzF58mTq1KnDiy++yLZt2yhbtmzu8+vWraNOnTp06NCBoUOHsnbtWt544w1mzpzJ3Llz031oIiI7UEuliEiKLFy4EIBatcLM83LlylGpUiXWrl3LypUr8+w7a9YsALZu3Uq1atXYZ599OOyww5gxYwYA/fv356WXXqJp06ZUrFiRzp07c+mll/Lggw/mCT5FRDJFQaWISBrldGdvr3jx4gB888033Hzzzdx77718/vnndO3aFXend+/eLFmyhHfffZfPP/+csWPHctxxx1G7dm1at25NrVq16N69e+5YSxGRdFP3t4hIijRo0ACApUuXArBhwwZWr17NfvvtR+XKldm0aRPFihWjVKlSufsedNBB9OvXD4Bhw4bx3Xff8cMPP3DAAQdQs2ZNatasyZw5c5g0aRLz5s3jyiuvpFixYsybN4/q1avTqlUrevfunZkDFpEiTUGliEiKdOzYkXr16vHKK69w1113MWfOHLKzs7n88suZMWMGbdq04dhjj+W9997j8MMP58QTT+Rf//oXN910E9nZ2fz4448cffTRHHDAAbmvuW3bNvr06cNtt91G5cqV2bZtG4sWLWL8+PFs3LiR7OzsDB6xiBRlCipFRFKkRIkSvPDCCwwYMIAbbriBcuXK0b9/f4YOHcq77767w/5PPPEE/fv3584776R06dKcccYZjBw5Ms8+o0aNonz58lx0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",
1816
+ "text/plain": [
1817
+ "<Figure size 800x800 with 1 Axes>"
1818
+ ]
1819
+ },
1820
+ "metadata": {
1821
+ "needs_background": "light"
1822
+ },
1823
+ "output_type": "display_data"
1824
+ }
1825
+ ],
1826
+ "source": [
1827
+ "plt.figure(figsize=(10, 10), dpi=80)\n",
1828
+ "\n",
1829
+ "total_counts = final_labels.shape[0] * final_labels.shape[1]\n",
1830
+ "unique, final_counts = np.unique(final_labels, return_counts=True)\n",
1831
+ "chart = plt.bar(CLASS_LABELS[unique], final_counts)\n",
1832
+ "plt.xticks(rotation=70)\n",
1833
+ "\n",
1834
+ "unique, counts = np.unique(new_labels, return_counts=True)\n",
1835
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
1836
+ "plt.xticks(rotation=70)\n",
1837
+ "\n",
1838
+ "unique, counts = np.unique(labels, return_counts=True)\n",
1839
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
1840
+ "plt.xticks(rotation=70)\n",
1841
+ "\n",
1842
+ "for i, p in enumerate(chart):\n",
1843
+ " width = p.get_width()\n",
1844
+ " height = p.get_height()\n",
1845
+ " x, y = p.get_xy()\n",
1846
+ " plt.text(x+width/2,\n",
1847
+ " y+height*1.01,\n",
1848
+ " str(round((final_counts[i] * 100) / total_counts, 1))+'%',\n",
1849
+ " ha='center',\n",
1850
+ " weight='bold')\n",
1851
+ "\n",
1852
+ "plt.legend([\"Final\", \"New\", \"Original\"])\n",
1853
+ "plt.show()\n"
1854
+ ]
1855
+ },
1856
+ {
1857
+ "cell_type": "markdown",
1858
+ "metadata": {},
1859
+ "source": [
1860
+ "## Save new dataset"
1861
+ ]
1862
+ },
1863
+ {
1864
+ "cell_type": "code",
1865
+ "execution_count": 15,
1866
+ "metadata": {},
1867
+ "outputs": [],
1868
+ "source": [
1869
+ "np.savez_compressed(\"new_dataset\", signals=final_signals, labels=final_labels)\n"
1870
+ ]
1871
+ }
1872
+ ],
1873
+ "metadata": {
1874
+ "interpreter": {
1875
+ "hash": "9185113d2128201d66faecd4f34fb34e89a635073a034991399523e584519355"
1876
+ },
1877
+ "kernelspec": {
1878
+ "display_name": "Python 3.9.7 64-bit ('base': conda)",
1879
+ "language": "python",
1880
+ "name": "python3"
1881
+ },
1882
+ "language_info": {
1883
+ "codemirror_mode": {
1884
+ "name": "ipython",
1885
+ "version": 3
1886
+ },
1887
+ "file_extension": ".py",
1888
+ "mimetype": "text/x-python",
1889
+ "name": "python",
1890
+ "nbconvert_exporter": "python",
1891
+ "pygments_lexer": "ipython3",
1892
+ "version": "3.9.10"
1893
+ },
1894
+ "orig_nbformat": 4
1895
+ },
1896
+ "nbformat": 4,
1897
+ "nbformat_minor": 2
1898
+ }
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Bc. Martin Kubovčík
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.
README.md CHANGED
@@ -1,3 +1,45 @@
1
- ---
2
- license: mit
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HAR Transformer
2
+ Transformer for Human Activity Recognition
3
+
4
+ Please check our paper [Wearable Sensor-Based Human Activity Recognition with Transformer Model](https://www.mdpi.com/1424-8220/22/5/1911) for more details.
5
+
6
+ ![Tag](https://img.shields.io/github/v/tag/markub3327/HAR-Transformer)
7
+ [![Issues](https://img.shields.io/github/issues/markub3327/HAR-Transformer)](https://github.com/markub3327/HAR-Transformer/issues)
8
+ ![Commits](https://img.shields.io/github/commit-activity/w/markub3327/HAR-Transformer)
9
+ ![Size](https://img.shields.io/github/repo-size/markub3327/HAR-Transformer)
10
+
11
+ ## Papers
12
+ * Sikder, N.; Nahid, A.A.; KU-HAR: An open dataset for heterogeneous human activity recognition. Pattern Recognition Letters 2021, 146, 46-54, DOI: 10.1016/j.patrec.2021.02.024.
13
+ * Vaswani, A.; Shazeer, N.; Parmar, N.; Uszkoreit, J.; Jones, L.; Gomez, A.N.; Kaiser, Ł.; Polosukhin, I. Attention is all you need. Advances in neural information processing systems 2017, 30.
14
+ * Dosovitskiy, A.; Beyer, L.; Kolesnikov, A.; Weissenborn, D.; Zhai, X.; Unterthiner, T.; Dehghani, M.; Minderer, M.; Heigold, G.; Gelly, S.; Uszkoreit, J. An image is worth 16x16 words: Transformers for image recognition at scale. 2020, arXiv preprint arXiv:2010.11929.
15
+ * Bao, H.; Dong, L.; Wei, F. Beit: Bert pre-training of image transformers. 2021, arXiv preprint arXiv:2106.08254.
16
+
17
+ ## Description
18
+
19
+ The Transformer for Human Activity Recognition operates in sequence-to-sequence mode and predicts the class for each time series feature. The advantage is that if there are several consecutive classes in one time series, these classes can be easily identified, and the transformer is not limited to the features in the whole time series belonging to one class.
20
+
21
+ ## Dataset
22
+
23
+ [KU-HAR](https://www.kaggle.com/datasets/niloy333/kuhar?resource=download)
24
+
25
+ ## Model
26
+
27
+ <p align="center">
28
+ <img src="img/model.png" style="background-color: white;">
29
+ </p>
30
+
31
+ ## Results
32
+
33
+ <p align="center">
34
+ <b>Confusion matrix</b>
35
+ <img src="img/result.png" style="background-color: white;">
36
+ </p>
37
+
38
+ <p align="center">
39
+ <b>Hyperparameters</b>
40
+ <img src="img/hyperparams.png">
41
+ </p>
42
+
43
+ ----------------------------------
44
+
45
+ **Frameworks:** TensorFlow, NumPy, Pandas, Scikit-learn, WanDB
Testing.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
Training.ipynb ADDED
@@ -0,0 +1,1118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {
6
+ "id": "VhQSb7PdZznG"
7
+ },
8
+ "source": [
9
+ "# Sequence-to-sequence activity recognition"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": null,
15
+ "metadata": {
16
+ "colab": {
17
+ "base_uri": "https://localhost:8080/"
18
+ },
19
+ "id": "n2y0GYTdc-nY",
20
+ "outputId": "8a4c97ee-752b-4ef3-a83d-e6da46c5f019"
21
+ },
22
+ "outputs": [],
23
+ "source": [
24
+ "!pip3 install wandb"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": null,
30
+ "metadata": {
31
+ "colab": {
32
+ "base_uri": "https://localhost:8080/"
33
+ },
34
+ "id": "gSxOaWIFSBM-",
35
+ "outputId": "475bc447-6414-46af-c5ec-49526e2808f8"
36
+ },
37
+ "outputs": [],
38
+ "source": [
39
+ "!pip3 install git+https://github.com/tensorflow/addons.git"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": null,
45
+ "metadata": {
46
+ "id": "VSncNSHtZznI"
47
+ },
48
+ "outputs": [],
49
+ "source": [
50
+ "from tensorflow.keras.layers import Add, Dense, Dropout, MultiHeadAttention, LayerNormalization, Layer, Normalization\n",
51
+ "from tensorflow.keras.optimizers import Adam\n",
52
+ "from tensorflow.keras import Model\n",
53
+ "from tensorflow.keras.initializers import TruncatedNormal\n",
54
+ "from tensorflow.keras.callbacks import EarlyStopping, LearningRateScheduler, Callback\n",
55
+ "from tensorflow_addons.optimizers import AdamW\n",
56
+ "from wandb.keras import WandbCallback\n",
57
+ "from sklearn.model_selection import train_test_split \n",
58
+ "\n",
59
+ "import math\n",
60
+ "import wandb\n",
61
+ "import numpy as np\n",
62
+ "import pandas as pd\n",
63
+ "import tensorflow as tf\n",
64
+ "import seaborn as sns\n",
65
+ "import matplotlib.pyplot as plt\n"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "markdown",
70
+ "metadata": {
71
+ "id": "_kdFgpMxZznJ"
72
+ },
73
+ "source": [
74
+ "## Init logger"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": null,
80
+ "metadata": {
81
+ "colab": {
82
+ "base_uri": "https://localhost:8080/"
83
+ },
84
+ "id": "Z6DnpqLPZznK",
85
+ "outputId": "078f5861-e753-4525-fe92-0516ac23f007"
86
+ },
87
+ "outputs": [],
88
+ "source": [
89
+ "wandb.login()\n",
90
+ "\n",
91
+ "sweep_config = {\n",
92
+ " 'method': 'grid',\n",
93
+ " 'metric': {\n",
94
+ " 'goal': 'maximize',\n",
95
+ " 'name': 'val_accuracy'\n",
96
+ " },\n",
97
+ " 'parameters': {\n",
98
+ " 'epochs': {\n",
99
+ " 'value': 50\n",
100
+ " },\n",
101
+ " 'num_layers': {\n",
102
+ " 'value': 3\n",
103
+ " },\n",
104
+ " 'embed_layer_size': {\n",
105
+ " 'value': 128\n",
106
+ " },\n",
107
+ " 'fc_layer_size': {\n",
108
+ " 'value': 256\n",
109
+ " },\n",
110
+ " 'num_heads': {\n",
111
+ " 'value': 6\n",
112
+ " },\n",
113
+ " 'dropout': {\n",
114
+ " 'value': 0.1\n",
115
+ " },\n",
116
+ " 'attention_dropout': {\n",
117
+ " 'value': 0.1\n",
118
+ " },\n",
119
+ " 'optimizer': {\n",
120
+ " 'value': 'adam'\n",
121
+ " },\n",
122
+ " 'amsgrad': {\n",
123
+ " 'value': False\n",
124
+ " },\n",
125
+ " 'label_smoothing': {\n",
126
+ " 'value': 0.1\n",
127
+ " },\n",
128
+ " 'learning_rate': {\n",
129
+ " 'value': 1e-3\n",
130
+ " },\n",
131
+ " #'weight_decay': {\n",
132
+ " # 'values': [2.5e-4, 1e-4, 5e-5, 1e-5]\n",
133
+ " #},\n",
134
+ " 'warmup_steps': {\n",
135
+ " 'value': 10\n",
136
+ " },\n",
137
+ " 'batch_size': {\n",
138
+ " 'value': 64\n",
139
+ " },\n",
140
+ " 'global_clipnorm': {\n",
141
+ " 'value': 3.0\n",
142
+ " },\n",
143
+ " }\n",
144
+ "}\n",
145
+ "\n",
146
+ "sweep_id = wandb.sweep(sweep_config, project=\"HAR-Transformer\")\n"
147
+ ]
148
+ },
149
+ {
150
+ "cell_type": "markdown",
151
+ "metadata": {
152
+ "id": "-mGp0L3_ZznL"
153
+ },
154
+ "source": [
155
+ "## Layer"
156
+ ]
157
+ },
158
+ {
159
+ "cell_type": "code",
160
+ "execution_count": null,
161
+ "metadata": {
162
+ "id": "0lFGhNtyZznL"
163
+ },
164
+ "outputs": [],
165
+ "source": [
166
+ "class PositionalEmbedding(Layer):\n",
167
+ " def __init__(self, units, dropout_rate, **kwargs):\n",
168
+ " super(PositionalEmbedding, self).__init__(**kwargs)\n",
169
+ "\n",
170
+ " self.units = units\n",
171
+ "\n",
172
+ " self.projection = Dense(units, kernel_initializer=TruncatedNormal(stddev=0.02))\n",
173
+ "\n",
174
+ " self.dropout = Dropout(rate=dropout_rate)\n",
175
+ "\n",
176
+ " def build(self, input_shape):\n",
177
+ " super(PositionalEmbedding, self).build(input_shape)\n",
178
+ "\n",
179
+ " self.position = self.add_weight(\n",
180
+ " name=\"position\",\n",
181
+ " shape=(1, input_shape[1], self.units),\n",
182
+ " initializer=TruncatedNormal(stddev=0.02),\n",
183
+ " trainable=True,\n",
184
+ " )\n",
185
+ "\n",
186
+ " def call(self, inputs, training):\n",
187
+ " x = self.projection(inputs)\n",
188
+ " x = x + self.position\n",
189
+ "\n",
190
+ " return self.dropout(x, training=training)\n"
191
+ ]
192
+ },
193
+ {
194
+ "cell_type": "code",
195
+ "execution_count": null,
196
+ "metadata": {
197
+ "id": "PIwd6GlIZznM"
198
+ },
199
+ "outputs": [],
200
+ "source": [
201
+ "class Encoder(Layer):\n",
202
+ " def __init__(\n",
203
+ " self, embed_dim, mlp_dim, num_heads, dropout_rate, attention_dropout_rate, **kwargs\n",
204
+ " ):\n",
205
+ " super(Encoder, self).__init__(**kwargs)\n",
206
+ "\n",
207
+ " self.mha = MultiHeadAttention(\n",
208
+ " num_heads=num_heads,\n",
209
+ " key_dim=embed_dim,\n",
210
+ " dropout=attention_dropout_rate,\n",
211
+ " kernel_initializer=TruncatedNormal(stddev=0.02),\n",
212
+ " )\n",
213
+ "\n",
214
+ " self.dense_0 = Dense(\n",
215
+ " units=mlp_dim,\n",
216
+ " activation=\"gelu\",\n",
217
+ " kernel_initializer=TruncatedNormal(stddev=0.02),\n",
218
+ " )\n",
219
+ " self.dense_1 = Dense(\n",
220
+ " units=embed_dim, kernel_initializer=TruncatedNormal(stddev=0.02)\n",
221
+ " )\n",
222
+ "\n",
223
+ " self.dropout_0 = Dropout(rate=dropout_rate)\n",
224
+ " self.dropout_1 = Dropout(rate=dropout_rate)\n",
225
+ "\n",
226
+ " self.norm_0 = LayerNormalization(epsilon=1e-5)\n",
227
+ " self.norm_1 = LayerNormalization(epsilon=1e-5)\n",
228
+ "\n",
229
+ " self.add_0 = Add()\n",
230
+ " self.add_1 = Add()\n",
231
+ "\n",
232
+ " def call(self, inputs, training):\n",
233
+ " # Attention block\n",
234
+ " x = self.norm_0(inputs)\n",
235
+ " x = self.mha(\n",
236
+ " query=x,\n",
237
+ " value=x,\n",
238
+ " key=x,\n",
239
+ " training=training,\n",
240
+ " )\n",
241
+ " x = self.dropout_0(x, training=training)\n",
242
+ " x = self.add_0([x, inputs])\n",
243
+ "\n",
244
+ " # MLP block\n",
245
+ " y = self.norm_1(x)\n",
246
+ " y = self.dense_0(y)\n",
247
+ " y = self.dense_1(y)\n",
248
+ " y = self.dropout_1(y, training=training)\n",
249
+ "\n",
250
+ " return self.add_1([x, y])\n"
251
+ ]
252
+ },
253
+ {
254
+ "cell_type": "markdown",
255
+ "metadata": {
256
+ "id": "YRQTRP60ZznN"
257
+ },
258
+ "source": [
259
+ "## Model"
260
+ ]
261
+ },
262
+ {
263
+ "cell_type": "code",
264
+ "execution_count": null,
265
+ "metadata": {
266
+ "id": "UYEKK7pYZznN"
267
+ },
268
+ "outputs": [],
269
+ "source": [
270
+ "class Transformer(Model):\n",
271
+ " def __init__(\n",
272
+ " self,\n",
273
+ " num_layers,\n",
274
+ " embed_dim,\n",
275
+ " mlp_dim,\n",
276
+ " num_heads,\n",
277
+ " num_classes,\n",
278
+ " dropout_rate,\n",
279
+ " attention_dropout_rate,\n",
280
+ " **kwargs\n",
281
+ " ):\n",
282
+ " super(Transformer, self).__init__(**kwargs)\n",
283
+ "\n",
284
+ " # Input (normalization of RAW measurements)\n",
285
+ " self.input_norm = Normalization()\n",
286
+ "\n",
287
+ " # Input\n",
288
+ " self.pos_embs = PositionalEmbedding(embed_dim, dropout_rate)\n",
289
+ "\n",
290
+ " # Encoder\n",
291
+ " self.e_layers = [\n",
292
+ " Encoder(embed_dim, mlp_dim, num_heads, dropout_rate, attention_dropout_rate)\n",
293
+ " for _ in range(num_layers)\n",
294
+ " ]\n",
295
+ "\n",
296
+ " # Output\n",
297
+ " self.norm = LayerNormalization(epsilon=1e-5)\n",
298
+ " self.final_layer = Dense(num_classes, kernel_initializer=\"zeros\")\n",
299
+ "\n",
300
+ " def call(self, inputs, training):\n",
301
+ " x = self.input_norm(inputs)\n",
302
+ " x = self.pos_embs(x, training=training)\n",
303
+ "\n",
304
+ " for layer in self.e_layers:\n",
305
+ " x = layer(x, training=training)\n",
306
+ "\n",
307
+ " x = self.norm(x)\n",
308
+ " x = self.final_layer(x)\n",
309
+ "\n",
310
+ " return x\n"
311
+ ]
312
+ },
313
+ {
314
+ "cell_type": "markdown",
315
+ "metadata": {
316
+ "id": "j42cze_qiAIb"
317
+ },
318
+ "source": [
319
+ "## Loss"
320
+ ]
321
+ },
322
+ {
323
+ "cell_type": "code",
324
+ "execution_count": null,
325
+ "metadata": {
326
+ "id": "NK6QapYViAIb"
327
+ },
328
+ "outputs": [],
329
+ "source": [
330
+ "def smoothed_sparse_categorical_crossentropy(label_smoothing: float = 0.0):\n",
331
+ " def loss_fn(y_true, y_pred):\n",
332
+ " num_classes = tf.shape(y_pred)[-1]\n",
333
+ " y_true = tf.one_hot(y_true, num_classes)\n",
334
+ "\n",
335
+ " loss = tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=True, label_smoothing=label_smoothing)\n",
336
+ " return tf.reduce_mean(loss)\n",
337
+ "\n",
338
+ " return loss_fn"
339
+ ]
340
+ },
341
+ {
342
+ "cell_type": "markdown",
343
+ "metadata": {
344
+ "id": "PxmZ1ZWBAgLX"
345
+ },
346
+ "source": [
347
+ "## LR scheduler"
348
+ ]
349
+ },
350
+ {
351
+ "cell_type": "code",
352
+ "execution_count": null,
353
+ "metadata": {
354
+ "id": "GEtbF3TdAjDU"
355
+ },
356
+ "outputs": [],
357
+ "source": [
358
+ "def cosine_schedule(base_lr, total_steps, warmup_steps):\n",
359
+ " def step_fn(epoch):\n",
360
+ " lr = base_lr\n",
361
+ " epoch += 1\n",
362
+ "\n",
363
+ " progress = (epoch - warmup_steps) / float(total_steps - warmup_steps)\n",
364
+ " progress = tf.clip_by_value(progress, 0.0, 1.0)\n",
365
+ " \n",
366
+ " lr = lr * 0.5 * (1.0 + tf.cos(math.pi * progress))\n",
367
+ "\n",
368
+ " if warmup_steps:\n",
369
+ " lr = lr * tf.minimum(1.0, epoch / warmup_steps)\n",
370
+ "\n",
371
+ " return lr\n",
372
+ "\n",
373
+ " return step_fn\n",
374
+ "\n"
375
+ ]
376
+ },
377
+ {
378
+ "cell_type": "code",
379
+ "execution_count": null,
380
+ "metadata": {
381
+ "id": "MBlu9AxBHG09"
382
+ },
383
+ "outputs": [],
384
+ "source": [
385
+ "class PrintLR(Callback):\n",
386
+ " def on_epoch_end(self, epoch, logs=None):\n",
387
+ " wandb.log({\"lr\": self.model.optimizer.lr.numpy()}, commit=False)"
388
+ ]
389
+ },
390
+ {
391
+ "cell_type": "markdown",
392
+ "metadata": {
393
+ "id": "7dIynjZAZznP"
394
+ },
395
+ "source": [
396
+ "## Dataset"
397
+ ]
398
+ },
399
+ {
400
+ "cell_type": "code",
401
+ "execution_count": null,
402
+ "metadata": {
403
+ "colab": {
404
+ "base_uri": "https://localhost:8080/"
405
+ },
406
+ "id": "4GkimkgOZznP",
407
+ "outputId": "c43e079b-f8b2-4d51-f9b0-a5339a3c9b77"
408
+ },
409
+ "outputs": [
410
+ {
411
+ "name": "stdout",
412
+ "output_type": "stream",
413
+ "text": [
414
+ "(60060, 300, 6) (60060, 300)\n",
415
+ "(12470, 300, 6) (12470, 300)\n",
416
+ "(10599, 300, 6) (10599, 300)\n"
417
+ ]
418
+ }
419
+ ],
420
+ "source": [
421
+ "CLASS_LABELS = np.array(\n",
422
+ " [\n",
423
+ " \"Stand\",\n",
424
+ " \"Sit\",\n",
425
+ " \"Talk-sit\",\n",
426
+ " \"Talk-stand\",\n",
427
+ " \"Stand-sit\",\n",
428
+ " \"Lay\",\n",
429
+ " \"Lay-stand\",\n",
430
+ " \"Pick\",\n",
431
+ " \"Jump\",\n",
432
+ " \"Push-up\",\n",
433
+ " \"Sit-up\",\n",
434
+ " \"Walk\",\n",
435
+ " \"Walk-backward\",\n",
436
+ " \"Walk-circle\",\n",
437
+ " \"Run\",\n",
438
+ " \"Stair-up\",\n",
439
+ " \"Stair-down\",\n",
440
+ " \"Table-tennis\"\n",
441
+ " ]\n",
442
+ ")\n",
443
+ "\n",
444
+ "# load dataset\n",
445
+ "f = np.load('./new_dataset.npz')\n",
446
+ "signals = f['signals']\n",
447
+ "labels = f['labels']\n",
448
+ "\n",
449
+ "# split to train-test\n",
450
+ "X_train, X_test, y_train, y_test = train_test_split(\n",
451
+ " signals, labels, test_size=0.15, random_state=9, stratify=labels\n",
452
+ ")\n",
453
+ "X_train, X_val, y_train, y_val = train_test_split(\n",
454
+ " X_train, y_train, test_size=0.15, random_state=9, stratify=y_train\n",
455
+ ")\n",
456
+ "print(X_train.shape, y_train.shape)\n",
457
+ "print(X_test.shape, y_test.shape)\n",
458
+ "print(X_val.shape, y_val.shape)\n"
459
+ ]
460
+ },
461
+ {
462
+ "cell_type": "code",
463
+ "execution_count": null,
464
+ "metadata": {
465
+ "colab": {
466
+ "base_uri": "https://localhost:8080/",
467
+ "height": 739
468
+ },
469
+ "id": "RSXjG7qHZznQ",
470
+ "outputId": "c83fae89-3e09-4f05-eb7f-6c4b6ab76db4"
471
+ },
472
+ "outputs": [
473
+ {
474
+ "data": {
475
+ "image/png": "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v/oz//fNb34zxx57bN773vfmqKOOypve9Kacfvrp8/AKxmPRhkrmj0APwL3Jr//6r6eqkiS33XZbDjnkkHzhC19Iay1XXXVVdtppp7WGypUrV+bxj398kuQJT3hC3v3ud0+13uMmVAIAdFi2bNntfx9++OG56qqrcvbZZ2fp0qU5+OCDc+ONN671/5YuXXr730uWLMktt9wy8bpOkjGVAABj8sMf/jBbbbVVli5dmiuvvDIf/ehH57tKU6OlEgBgTF7/+tfnJS95SXbcccc85CEPyTOf+cz5rtLUVGttvuuQJFm+fHlbs2bN1Mozrm/+WPcArMutt96aiy++ONttt12WLFky39VZVO5u3VfV5a215Wv7P93fAAB0EyoBAOgmVAIA0E2oBACgm1AJAEA3oRIAgG7mqQQANgg7f2DniTzvV1/11XUus2rVqiTJTTfdlIsuuig77zzUZfvtt8+JJ54457LOPPPM3HjjjXnuc597zyq7gAmVAADrcP755ydJVq9enVWrVt1+e32deeaZufbaa++VoVL3NwDAPXT66afnyU9+cnbbbbfsscceOeOMM5Ik3/rWt/KkJz0pu+yyS3beeee8+c1vzvnnn5+jjjoqH/rQh7Jq1aq8/e1vn+faj5eWSgCAe+Db3/523va2t+X000/PZpttlksuuSR77rlnVq9enSOPPDLPf/7z88Y3vjFJcs011+QBD3hAXvOa1+Taa6/NEUccMc+1Hz+hEgDgHvj0pz+dSy65JE95ylNuv2+jjTbKpZdemqc85Sn5oz/6o9xwww156lOfuiiuAS5UAgDcA621POtZz8oJJ5zwM4896lGPyhOf+MR85jOfyZFHHpkjjjgip5122jzUcnqMqQQAuAee85zn5LOf/WwuuOCC2+/70pe+lGQYU/ngBz84+++/f/7yL/8yZ511VpJks802y3XXXTcv9Z00oRIA4B5YuXJlTjjhhBx44IHZZZddssMOO9w+VvJjH/tYdt555+y666552ctelqOOOipJ8su//Ms5//zz75Un6lRrbb7rkCRZvnx5W7NmzdTKW3HoqRMvY/Vh+0y8jA2RdQ/Autx66625+OKLs91222XJkiXzXZ1F5e7WfVVd3lpbvrb/01IJAEA3oRIAgG5CJQAA3YRKAAC6CZUAAHQTKgEA6CZUAgDQzWUaAYANwoWP3mEiz7vDNy9c5zJ777139t577xx00EF3uH+XXXbJW9/61rzoRS/6mf85/vjjc/LJJ+fkk0/OOeeck3e961058cQTf2a5G264IZtuumnWNXf4tddem6OOOiqHHnro7fe9+tWvzite8Yrstdde63wNk6alEgBgHQ444IC8//3vv8N955xzTq644oq84AUvWOf/77777msNlOvj2muvzWGHHXaH+4455pgFESgToRIAYJ323XffXHbZZXe4zvdxxx2XfffdN89+9rOz2267Zccdd8xBBx2U22677Wf+/8wzz8yqVatuv3300UfnUY96VHbdddf89V//9R2WfcUrXpHdd989j33sY7PPPvvkyiuvTJK85jWvyfXXX59Vq1Zl9913T5I87WlPy8knn5wkueqqq/KiF70oO++8c3baaaccffTRtz/nihUr8pa3vCVPeMITsu222+Yd73jH+FbOiFAJALAOm2yySV75ylfmuOOOS5LceOON+fCHP5w3vOEN+eQnP5mvfOUrueCCC7J69eqcdNJJd/tcX/va1/LWt741n//853Peeeflxz/+8R0eP+KII3LOOefkggsuyJ577pm3ve1tSZKjjjoqm266ac4///ycc845P/O8r3vd67L99tvnq1/9aj73uc/lHe94R84666zbH7/22mvzxS9+MV/+8pfzrne9K5dffnnnWrkjoRIAYA4OOOCAfOhDH8pNN92UT3ziE9lhhx3y8Ic/PIccckh22WWX7LrrrjnnnHNy/vnn3+3zfO5zn8vznve8bL311kmS3/md37nD4yeccEJ233337LTTTjnmmGPW+XwzPvvZz+bAAw9MkjzoQQ/Ki170onz2s5+9/fH99tsvSbLlllvmEY94RL7zne/M+bXPhVAJADAHj3nMY7Jy5cp88pOfzHHHHZcDDjgghx9+eK666qqcffbZueCCC7LffvvlxhtvXK/nrarb//7CF76Q97znPTnttNPyta99LYcffvh6P9/anjdJli5devvfS5YsyS233HKPnveuCJUAAHN0wAEH5J3vfGe+9KUv5WUve1l++MMfZquttsrSpUtz5ZVX5qMf/eg6n+PpT396Pv3pT98+VvKoo466/bEf/vCH2XTTTbPFFlvkpptuusO4yM022yw//vGPc9NNN631eZ/5zGfmfe97X5Lk+9//fj7xiU/kWc96Vs/LXS9CJQDA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",
476
+ "text/plain": [
477
+ "<Figure size 800x800 with 1 Axes>"
478
+ ]
479
+ },
480
+ "metadata": {
481
+ "needs_background": "light"
482
+ },
483
+ "output_type": "display_data"
484
+ }
485
+ ],
486
+ "source": [
487
+ "plt.figure(figsize=(10, 10), dpi=80)\n",
488
+ "\n",
489
+ "unique, counts = np.unique(labels, return_counts=True)\n",
490
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
491
+ "plt.xticks(rotation=70)\n",
492
+ "\n",
493
+ "unique, counts = np.unique(y_train, return_counts=True)\n",
494
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
495
+ "plt.xticks(rotation=70)\n",
496
+ "\n",
497
+ "unique, counts = np.unique(y_test, return_counts=True)\n",
498
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
499
+ "plt.xticks(rotation=70)\n",
500
+ "\n",
501
+ "unique, counts = np.unique(y_val, return_counts=True)\n",
502
+ "plt.bar(CLASS_LABELS[unique], counts)\n",
503
+ "plt.xticks(rotation=70)\n",
504
+ "\n",
505
+ "plt.legend([\"All\", \"Train\", \"Test\", \"Validation\"])\n",
506
+ "\n",
507
+ "plt.show()"
508
+ ]
509
+ },
510
+ {
511
+ "cell_type": "code",
512
+ "execution_count": null,
513
+ "metadata": {
514
+ "id": "QaZxGMgKZznS"
515
+ },
516
+ "outputs": [],
517
+ "source": [
518
+ "def train(config=None):\n",
519
+ " with wandb.init(config=config):\n",
520
+ " config = wandb.config\n",
521
+ " \n",
522
+ " # Generate new model\n",
523
+ " model = Transformer(\n",
524
+ " num_layers=config.num_layers,\n",
525
+ " embed_dim=config.embed_layer_size,\n",
526
+ " mlp_dim=config.fc_layer_size,\n",
527
+ " num_heads=config.num_heads,\n",
528
+ " num_classes=18,\n",
529
+ " dropout_rate=config.dropout,\n",
530
+ " attention_dropout_rate=config.attention_dropout,\n",
531
+ " )\n",
532
+ "\n",
533
+ " # adapt on training dataset - must be before model.compile !!!\n",
534
+ " model.input_norm.adapt(X_train, batch_size=config.batch_size)\n",
535
+ " print(model.input_norm.variables)\n",
536
+ "\n",
537
+ " # Select optimizer\n",
538
+ " if config.optimizer == \"adam\":\n",
539
+ " optim = Adam(\n",
540
+ " global_clipnorm=config.global_clipnorm,\n",
541
+ " amsgrad=config.amsgrad,\n",
542
+ " )\n",
543
+ " elif config.optimizer == \"adamw\":\n",
544
+ " optim = AdamW(\n",
545
+ " weight_decay=config.weight_decay,\n",
546
+ " amsgrad=config.amsgrad,\n",
547
+ " global_clipnorm=config.global_clipnorm,\n",
548
+ " exclude_from_weight_decay=[\"position\"]\n",
549
+ " )\n",
550
+ " else:\n",
551
+ " raise ValueError(\"The used optimizer is not in list of available\")\n",
552
+ "\n",
553
+ " model.compile(\n",
554
+ " loss=smoothed_sparse_categorical_crossentropy(label_smoothing=config.label_smoothing),\n",
555
+ " optimizer=optim,\n",
556
+ " metrics=[\"accuracy\"],\n",
557
+ " )\n",
558
+ "\n",
559
+ " # Train model\n",
560
+ " model.fit(\n",
561
+ " X_train,\n",
562
+ " y_train,\n",
563
+ " batch_size=config.batch_size,\n",
564
+ " epochs=config.epochs,\n",
565
+ " validation_data=(X_val, y_val),\n",
566
+ " callbacks=[\n",
567
+ " LearningRateScheduler(cosine_schedule(base_lr=config.learning_rate, total_steps=config.epochs, warmup_steps=config.warmup_steps)),\n",
568
+ " PrintLR(),\n",
569
+ " WandbCallback(monitor=\"val_accuracy\", mode='max', save_weights_only=True),\n",
570
+ " EarlyStopping(monitor=\"val_accuracy\", mode='max', min_delta=0.001, patience=5),\n",
571
+ " ],\n",
572
+ " verbose=1\n",
573
+ " )\n",
574
+ "\n",
575
+ " model.summary()"
576
+ ]
577
+ },
578
+ {
579
+ "cell_type": "code",
580
+ "execution_count": null,
581
+ "metadata": {
582
+ "colab": {
583
+ "base_uri": "https://localhost:8080/",
584
+ "height": 1000,
585
+ "referenced_widgets": [
586
+ "c2f96abecad54565be62d18c1b5c1e68",
587
+ "fa0aba1429524429af176534638122db",
588
+ "0054c6582b4c45faa323add90dd34770",
589
+ "634c65b48e0b40359f6158364fb54ad7",
590
+ "ebdfa2b37e5540e39bd6624f22eeb19a",
591
+ "7198820fcadc4aaf875ee617dd605fbc",
592
+ "18adf181e391491a9426d17e69a8c574",
593
+ "dc1f7e46eaf643999d482c3b17e3bee6"
594
+ ]
595
+ },
596
+ "id": "J743-OTSSsZy",
597
+ "outputId": "1ea18bc2-7308-4e10-cabf-7c94643fab4a"
598
+ },
599
+ "outputs": [
600
+ {
601
+ "name": "stderr",
602
+ "output_type": "stream",
603
+ "text": [
604
+ "\u001b[34m\u001b[1mwandb\u001b[0m: Agent Starting Run: lwikvs2y with config:\n",
605
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tamsgrad: False\n",
606
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tattention_dropout: 0.1\n",
607
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tbatch_size: 64\n",
608
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tdropout: 0.1\n",
609
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tembed_layer_size: 128\n",
610
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tepochs: 50\n",
611
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tfc_layer_size: 256\n",
612
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tglobal_clipnorm: 3\n",
613
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tlabel_smoothing: 0.1\n",
614
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tlearning_rate: 0.001\n",
615
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tnum_heads: 6\n",
616
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \tnum_layers: 3\n",
617
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \toptimizer: adam\n",
618
+ "\u001b[34m\u001b[1mwandb\u001b[0m: \twarmup_steps: 10\n"
619
+ ]
620
+ },
621
+ {
622
+ "data": {
623
+ "text/html": [
624
+ "\n",
625
+ " Syncing run <strong><a href=\"https://wandb.ai/markub/imu-transformer/runs/lwikvs2y\" target=\"_blank\">earnest-sweep-1</a></strong> to <a href=\"https://wandb.ai/markub/imu-transformer\" target=\"_blank\">Weights & Biases</a> (<a href=\"https://docs.wandb.com/integrations/jupyter.html\" target=\"_blank\">docs</a>).<br/>\n",
626
+ "Sweep page: <a href=\"https://wandb.ai/markub/imu-transformer/sweeps/cfdl7wcr\" target=\"_blank\">https://wandb.ai/markub/imu-transformer/sweeps/cfdl7wcr</a><br/>\n",
627
+ "\n",
628
+ " "
629
+ ],
630
+ "text/plain": [
631
+ "<IPython.core.display.HTML object>"
632
+ ]
633
+ },
634
+ "metadata": {},
635
+ "output_type": "display_data"
636
+ },
637
+ {
638
+ "name": "stdout",
639
+ "output_type": "stream",
640
+ "text": [
641
+ "[<tf.Variable 'mean:0' shape=(6,) dtype=float32, numpy=\n",
642
+ "array([ 0.10979815, -0.07648689, -0.08781412, 0.03063406, 0.00979011,\n",
643
+ " 0.00650088], dtype=float32)>, <tf.Variable 'variance:0' shape=(6,) dtype=float32, numpy=\n",
644
+ "array([28.058855 , 9.622038 , 16.08444 , 3.0307784, 1.9513103,\n",
645
+ " 2.0505407], dtype=float32)>, <tf.Variable 'count:0' shape=() dtype=int64, numpy=18018000>]\n",
646
+ "Epoch 1/50\n",
647
+ " 6/939 [..............................] - ETA: 3:08 - loss: 2.8825 - accuracy: 0.1228WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0914s vs `on_train_batch_end` time: 0.0915s). Check your callbacks.\n",
648
+ "939/939 [==============================] - 226s 234ms/step - loss: 1.8975 - accuracy: 0.4512 - val_loss: 1.4693 - val_accuracy: 0.6309 - lr: 1.0000e-04\n",
649
+ "Epoch 2/50\n",
650
+ "939/939 [==============================] - 224s 239ms/step - loss: 1.2502 - accuracy: 0.7161 - val_loss: 1.0970 - val_accuracy: 0.7766 - lr: 2.0000e-04\n",
651
+ "Epoch 3/50\n",
652
+ "939/939 [==============================] - 224s 238ms/step - loss: 1.0634 - accuracy: 0.7823 - val_loss: 1.0177 - val_accuracy: 0.8070 - lr: 3.0000e-04\n",
653
+ "Epoch 4/50\n",
654
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.9973 - accuracy: 0.8063 - val_loss: 0.9463 - val_accuracy: 0.8246 - lr: 4.0000e-04\n",
655
+ "Epoch 5/50\n",
656
+ "939/939 [==============================] - 224s 239ms/step - loss: 0.9527 - accuracy: 0.8252 - val_loss: 0.9526 - val_accuracy: 0.8252 - lr: 5.0000e-04\n",
657
+ "Epoch 6/50\n",
658
+ "939/939 [==============================] - 233s 248ms/step - loss: 0.9277 - accuracy: 0.8355 - val_loss: 0.9304 - val_accuracy: 0.8317 - lr: 6.0000e-04\n",
659
+ "Epoch 7/50\n",
660
+ "939/939 [==============================] - 226s 240ms/step - loss: 0.9065 - accuracy: 0.8444 - val_loss: 0.8776 - val_accuracy: 0.8602 - lr: 7.0000e-04\n",
661
+ "Epoch 8/50\n",
662
+ "939/939 [==============================] - 224s 239ms/step - loss: 0.8888 - accuracy: 0.8529 - val_loss: 0.8554 - val_accuracy: 0.8703 - lr: 8.0000e-04\n",
663
+ "Epoch 9/50\n",
664
+ "939/939 [==============================] - 224s 239ms/step - loss: 0.8734 - accuracy: 0.8596 - val_loss: 0.9027 - val_accuracy: 0.8493 - lr: 9.0000e-04\n",
665
+ "Epoch 10/50\n",
666
+ "939/939 [==============================] - 232s 247ms/step - loss: 0.8616 - accuracy: 0.8657 - val_loss: 0.8845 - val_accuracy: 0.8542 - lr: 0.0010\n",
667
+ "Epoch 11/50\n",
668
+ "939/939 [==============================] - 227s 242ms/step - loss: 0.8363 - accuracy: 0.8779 - val_loss: 0.8222 - val_accuracy: 0.8856 - lr: 9.9846e-04\n",
669
+ "Epoch 12/50\n",
670
+ "939/939 [==============================] - 232s 248ms/step - loss: 0.8288 - accuracy: 0.8815 - val_loss: 0.8512 - val_accuracy: 0.8751 - lr: 9.9384e-04\n",
671
+ "Epoch 13/50\n",
672
+ "939/939 [==============================] - 234s 249ms/step - loss: 0.8128 - accuracy: 0.8888 - val_loss: 0.8171 - val_accuracy: 0.8859 - lr: 9.8619e-04\n",
673
+ "Epoch 14/50\n",
674
+ "939/939 [==============================] - 226s 241ms/step - loss: 0.8014 - accuracy: 0.8944 - val_loss: 0.7949 - val_accuracy: 0.8972 - lr: 9.7553e-04\n",
675
+ "Epoch 15/50\n",
676
+ "939/939 [==============================] - 232s 247ms/step - loss: 0.7910 - accuracy: 0.8990 - val_loss: 0.8334 - val_accuracy: 0.8826 - lr: 9.6194e-04\n",
677
+ "Epoch 16/50\n",
678
+ "939/939 [==============================] - 226s 241ms/step - loss: 0.7824 - accuracy: 0.9037 - val_loss: 0.8004 - val_accuracy: 0.8956 - lr: 9.4550e-04\n",
679
+ "Epoch 17/50\n",
680
+ "939/939 [==============================] - 225s 239ms/step - loss: 0.7732 - accuracy: 0.9078 - val_loss: 0.7767 - val_accuracy: 0.9084 - lr: 9.2632e-04\n",
681
+ "Epoch 18/50\n",
682
+ "939/939 [==============================] - 232s 247ms/step - loss: 0.7614 - accuracy: 0.9136 - val_loss: 0.7578 - val_accuracy: 0.9181 - lr: 9.0451e-04\n",
683
+ "Epoch 19/50\n",
684
+ "939/939 [==============================] - 226s 241ms/step - loss: 0.7565 - accuracy: 0.9163 - val_loss: 0.7581 - val_accuracy: 0.9151 - lr: 8.8020e-04\n",
685
+ "Epoch 20/50\n",
686
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.7475 - accuracy: 0.9202 - val_loss: 0.7378 - val_accuracy: 0.9265 - lr: 8.5355e-04\n",
687
+ "Epoch 21/50\n",
688
+ "939/939 [==============================] - 225s 239ms/step - loss: 0.7413 - accuracy: 0.9231 - val_loss: 0.7479 - val_accuracy: 0.9215 - lr: 8.2472e-04\n",
689
+ "Epoch 22/50\n",
690
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.7364 - accuracy: 0.9255 - val_loss: 0.7346 - val_accuracy: 0.9281 - lr: 7.9389e-04\n",
691
+ "Epoch 23/50\n",
692
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.7311 - accuracy: 0.9279 - val_loss: 0.7497 - val_accuracy: 0.9220 - lr: 7.6125e-04\n",
693
+ "Epoch 24/50\n",
694
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.7251 - accuracy: 0.9307 - val_loss: 0.7317 - val_accuracy: 0.9298 - lr: 7.2700e-04\n",
695
+ "Epoch 25/50\n",
696
+ "939/939 [==============================] - 224s 238ms/step - loss: 0.7216 - accuracy: 0.9324 - val_loss: 0.7182 - val_accuracy: 0.9356 - lr: 6.9134e-04\n",
697
+ "Epoch 26/50\n",
698
+ "939/939 [==============================] - 226s 241ms/step - loss: 0.7163 - accuracy: 0.9348 - val_loss: 0.7221 - val_accuracy: 0.9340 - lr: 6.5451e-04\n",
699
+ "Epoch 27/50\n",
700
+ "939/939 [==============================] - 233s 249ms/step - loss: 0.7107 - accuracy: 0.9373 - val_loss: 0.7117 - val_accuracy: 0.9390 - lr: 6.1672e-04\n",
701
+ "Epoch 28/50\n",
702
+ "939/939 [==============================] - 227s 242ms/step - loss: 0.7077 - accuracy: 0.9391 - val_loss: 0.7110 - val_accuracy: 0.9397 - lr: 5.7822e-04\n",
703
+ "Epoch 29/50\n",
704
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.7030 - accuracy: 0.9409 - val_loss: 0.7051 - val_accuracy: 0.9416 - lr: 5.3923e-04\n",
705
+ "Epoch 30/50\n",
706
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.6987 - accuracy: 0.9429 - val_loss: 0.6998 - val_accuracy: 0.9432 - lr: 5.0000e-04\n",
707
+ "Epoch 31/50\n",
708
+ "939/939 [==============================] - 233s 248ms/step - loss: 0.6951 - accuracy: 0.9448 - val_loss: 0.6992 - val_accuracy: 0.9447 - lr: 4.6077e-04\n",
709
+ "Epoch 32/50\n",
710
+ "939/939 [==============================] - 227s 241ms/step - loss: 0.6931 - accuracy: 0.9459 - val_loss: 0.6999 - val_accuracy: 0.9443 - lr: 4.2178e-04\n",
711
+ "Epoch 33/50\n",
712
+ "939/939 [==============================] - 225s 239ms/step - loss: 0.6892 - accuracy: 0.9474 - val_loss: 0.6952 - val_accuracy: 0.9458 - lr: 3.8328e-04\n",
713
+ "Epoch 34/50\n",
714
+ "939/939 [==============================] - 224s 239ms/step - loss: 0.6837 - accuracy: 0.9505 - val_loss: 0.6854 - val_accuracy: 0.9508 - lr: 3.4549e-04\n",
715
+ "Epoch 35/50\n",
716
+ "939/939 [==============================] - 232s 247ms/step - loss: 0.6752 - accuracy: 0.9549 - val_loss: 0.6496 - val_accuracy: 0.9714 - lr: 3.0866e-04\n",
717
+ "Epoch 36/50\n",
718
+ "939/939 [==============================] - 234s 249ms/step - loss: 0.6197 - accuracy: 0.9840 - val_loss: 0.6156 - val_accuracy: 0.9858 - lr: 2.7300e-04\n",
719
+ "Epoch 37/50\n",
720
+ "939/939 [==============================] - 234s 249ms/step - loss: 0.6016 - accuracy: 0.9919 - val_loss: 0.6100 - val_accuracy: 0.9891 - lr: 2.3875e-04\n",
721
+ "Epoch 38/50\n",
722
+ "939/939 [==============================] - 226s 241ms/step - loss: 0.5956 - accuracy: 0.9943 - val_loss: 0.6126 - val_accuracy: 0.9877 - lr: 2.0611e-04\n",
723
+ "Epoch 39/50\n",
724
+ "939/939 [==============================] - 233s 248ms/step - loss: 0.5924 - accuracy: 0.9957 - val_loss: 0.6096 - val_accuracy: 0.9894 - lr: 1.7528e-04\n",
725
+ "Epoch 40/50\n",
726
+ "939/939 [==============================] - 227s 241ms/step - loss: 0.5902 - accuracy: 0.9965 - val_loss: 0.6141 - val_accuracy: 0.9880 - lr: 1.4645e-04\n",
727
+ "Epoch 41/50\n",
728
+ "939/939 [==============================] - 225s 240ms/step - loss: 0.5881 - accuracy: 0.9973 - val_loss: 0.6074 - val_accuracy: 0.9908 - lr: 1.1980e-04\n",
729
+ "Epoch 42/50\n",
730
+ "939/939 [==============================] - 226s 240ms/step - loss: 0.5868 - accuracy: 0.9979 - val_loss: 0.6050 - val_accuracy: 0.9915 - lr: 9.5491e-05\n",
731
+ "Epoch 43/50\n",
732
+ "939/939 [==============================] - 233s 248ms/step - loss: 0.5866 - accuracy: 0.9979 - val_loss: 0.6042 - val_accuracy: 0.9914 - lr: 7.3680e-05\n",
733
+ "Epoch 44/50\n",
734
+ "939/939 [==============================] - 227s 241ms/step - loss: 0.5851 - accuracy: 0.9986 - val_loss: 0.6060 - val_accuracy: 0.9910 - lr: 5.4497e-05\n",
735
+ "Epoch 45/50\n",
736
+ "939/939 [==============================] - 226s 240ms/step - loss: 0.5845 - accuracy: 0.9988 - val_loss: 0.6055 - val_accuracy: 0.9914 - lr: 3.8060e-05\n",
737
+ "Epoch 46/50\n",
738
+ "939/939 [==============================] - 225s 239ms/step - loss: 0.5837 - accuracy: 0.9991 - val_loss: 0.6056 - val_accuracy: 0.9918 - lr: 2.4472e-05\n",
739
+ "Model: \"transformer\"\n",
740
+ "_________________________________________________________________\n",
741
+ " Layer (type) Output Shape Param # \n",
742
+ "=================================================================\n",
743
+ " normalization (Normalizatio multiple 13 \n",
744
+ " n) \n",
745
+ " \n",
746
+ " positional_embedding (Posit multiple 39296 \n",
747
+ " ionalEmbedding) \n",
748
+ " \n",
749
+ " encoder (Encoder) multiple 462080 \n",
750
+ " \n",
751
+ " encoder_1 (Encoder) multiple 462080 \n",
752
+ " \n",
753
+ " encoder_2 (Encoder) multiple 462080 \n",
754
+ " \n",
755
+ " layer_normalization_6 (Laye multiple 256 \n",
756
+ " rNormalization) \n",
757
+ " \n",
758
+ " dense_7 (Dense) multiple 2322 \n",
759
+ " \n",
760
+ "=================================================================\n",
761
+ "Total params: 1,428,127\n",
762
+ "Trainable params: 1,428,114\n",
763
+ "Non-trainable params: 13\n",
764
+ "_________________________________________________________________\n"
765
+ ]
766
+ },
767
+ {
768
+ "data": {
769
+ "text/html": [
770
+ "<br/>Waiting for W&B process to finish, PID 498... <strong style=\"color:green\">(success).</strong>"
771
+ ],
772
+ "text/plain": [
773
+ "<IPython.core.display.HTML object>"
774
+ ]
775
+ },
776
+ "metadata": {},
777
+ "output_type": "display_data"
778
+ },
779
+ {
780
+ "data": {
781
+ "application/vnd.jupyter.widget-view+json": {
782
+ "model_id": "c2f96abecad54565be62d18c1b5c1e68",
783
+ "version_major": 2,
784
+ "version_minor": 0
785
+ },
786
+ "text/plain": [
787
+ "VBox(children=(Label(value=' 5.52MB of 5.52MB uploaded (0.00MB deduped)\\r'), FloatProgress(value=1.0, max=1.0)…"
788
+ ]
789
+ },
790
+ "metadata": {},
791
+ "output_type": "display_data"
792
+ },
793
+ {
794
+ "data": {
795
+ "text/html": [
796
+ "<style>\n",
797
+ " table.wandb td:nth-child(1) { padding: 0 10px; text-align: right }\n",
798
+ " .wandb-row { display: flex; flex-direction: row; flex-wrap: wrap; width: 100% }\n",
799
+ " .wandb-col { display: flex; flex-direction: column; flex-basis: 100%; flex: 1; padding: 10px; }\n",
800
+ " </style>\n",
801
+ "<div class=\"wandb-row\"><div class=\"wandb-col\">\n",
802
+ "<h3>Run history:</h3><br/><table class=\"wandb\"><tr><td>accuracy</td><td>▁▄▅▆▆▆▆▆▆▆▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇█████████</td></tr><tr><td>epoch</td><td>▁▁▁▁▂▂▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇████</td></tr><tr><td>loss</td><td>█▅▄▃▃▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁</td></tr><tr><td>lr</td><td>▁▂▃▄▄▅▆▇██████▇▇▇▇▇▇▆▆▅▅▅▅▄▄▄▃▃▃▂▂▂▂▁▁▁▁</td></tr><tr><td>val_accuracy</td><td>▁▄▄▅▅▅▅▅▅▆▆▆▆▆▆▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇██████████</td></tr><tr><td>val_loss</td><td>█▅▄▄▄▄▃▃▃▃▃▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁</td></tr></table><br/></div><div class=\"wandb-col\">\n",
803
+ "<h3>Run summary:</h3><br/><table class=\"wandb\"><tr><td>accuracy</td><td>0.99912</td></tr><tr><td>best_epoch</td><td>45</td></tr><tr><td>best_val_accuracy</td><td>0.99177</td></tr><tr><td>epoch</td><td>45</td></tr><tr><td>loss</td><td>0.58374</td></tr><tr><td>lr</td><td>2e-05</td></tr><tr><td>val_accuracy</td><td>0.99177</td></tr><tr><td>val_loss</td><td>0.60557</td></tr></table>\n",
804
+ "</div></div>\n",
805
+ "Synced 5 W&B file(s), 1 media file(s), 0 artifact file(s) and 1 other file(s)\n",
806
+ "<br/>Synced <strong style=\"color:#cdcd00\">earnest-sweep-1</strong>: <a href=\"https://wandb.ai/markub/imu-transformer/runs/lwikvs2y\" target=\"_blank\">https://wandb.ai/markub/imu-transformer/runs/lwikvs2y</a><br/>\n",
807
+ "Find logs at: <code>./wandb/run-20220201_003202-lwikvs2y/logs</code><br/>\n"
808
+ ],
809
+ "text/plain": [
810
+ "<IPython.core.display.HTML object>"
811
+ ]
812
+ },
813
+ "metadata": {},
814
+ "output_type": "display_data"
815
+ },
816
+ {
817
+ "name": "stderr",
818
+ "output_type": "stream",
819
+ "text": [
820
+ "\u001b[34m\u001b[1mwandb\u001b[0m: Sweep Agent: Waiting for job.\n",
821
+ "\u001b[34m\u001b[1mwandb\u001b[0m: Sweep Agent: Exiting.\n"
822
+ ]
823
+ }
824
+ ],
825
+ "source": [
826
+ "wandb.agent(sweep_id, train, count=32)"
827
+ ]
828
+ }
829
+ ],
830
+ "metadata": {
831
+ "accelerator": "GPU",
832
+ "colab": {
833
+ "collapsed_sections": [],
834
+ "name": "Training_posledna_verzia_3-3.ipynb",
835
+ "provenance": []
836
+ },
837
+ "interpreter": {
838
+ "hash": "9185113d2128201d66faecd4f34fb34e89a635073a034991399523e584519355"
839
+ },
840
+ "kernelspec": {
841
+ "display_name": "Python 3.9.6 64-bit ('base': conda)",
842
+ "language": "python",
843
+ "name": "python3"
844
+ },
845
+ "language_info": {
846
+ "codemirror_mode": {
847
+ "name": "ipython",
848
+ "version": 3
849
+ },
850
+ "file_extension": ".py",
851
+ "mimetype": "text/x-python",
852
+ "name": "python",
853
+ "nbconvert_exporter": "python",
854
+ "pygments_lexer": "ipython3",
855
+ "version": "3.9.7"
856
+ },
857
+ "orig_nbformat": 4,
858
+ "widgets": {
859
+ "application/vnd.jupyter.widget-state+json": {
860
+ "0054c6582b4c45faa323add90dd34770": {
861
+ "model_module": "@jupyter-widgets/controls",
862
+ "model_module_version": "1.5.0",
863
+ "model_name": "LabelModel",
864
+ "state": {
865
+ "_dom_classes": [],
866
+ "_model_module": "@jupyter-widgets/controls",
867
+ "_model_module_version": "1.5.0",
868
+ "_model_name": "LabelModel",
869
+ "_view_count": null,
870
+ "_view_module": "@jupyter-widgets/controls",
871
+ "_view_module_version": "1.5.0",
872
+ "_view_name": "LabelView",
873
+ "description": "",
874
+ "description_tooltip": null,
875
+ "layout": "IPY_MODEL_7198820fcadc4aaf875ee617dd605fbc",
876
+ "placeholder": "​",
877
+ "style": "IPY_MODEL_ebdfa2b37e5540e39bd6624f22eeb19a",
878
+ "value": " 5.55MB of 5.55MB uploaded (0.00MB deduped)\r"
879
+ }
880
+ },
881
+ "18adf181e391491a9426d17e69a8c574": {
882
+ "model_module": "@jupyter-widgets/controls",
883
+ "model_module_version": "1.5.0",
884
+ "model_name": "ProgressStyleModel",
885
+ "state": {
886
+ "_model_module": "@jupyter-widgets/controls",
887
+ "_model_module_version": "1.5.0",
888
+ "_model_name": "ProgressStyleModel",
889
+ "_view_count": null,
890
+ "_view_module": "@jupyter-widgets/base",
891
+ "_view_module_version": "1.2.0",
892
+ "_view_name": "StyleView",
893
+ "bar_color": null,
894
+ "description_width": ""
895
+ }
896
+ },
897
+ "634c65b48e0b40359f6158364fb54ad7": {
898
+ "model_module": "@jupyter-widgets/controls",
899
+ "model_module_version": "1.5.0",
900
+ "model_name": "FloatProgressModel",
901
+ "state": {
902
+ "_dom_classes": [],
903
+ "_model_module": "@jupyter-widgets/controls",
904
+ "_model_module_version": "1.5.0",
905
+ "_model_name": "FloatProgressModel",
906
+ "_view_count": null,
907
+ "_view_module": "@jupyter-widgets/controls",
908
+ "_view_module_version": "1.5.0",
909
+ "_view_name": "ProgressView",
910
+ "bar_style": "",
911
+ "description": "",
912
+ "description_tooltip": null,
913
+ "layout": "IPY_MODEL_dc1f7e46eaf643999d482c3b17e3bee6",
914
+ "max": 1,
915
+ "min": 0,
916
+ "orientation": "horizontal",
917
+ "style": "IPY_MODEL_18adf181e391491a9426d17e69a8c574",
918
+ "value": 1
919
+ }
920
+ },
921
+ "7198820fcadc4aaf875ee617dd605fbc": {
922
+ "model_module": "@jupyter-widgets/base",
923
+ "model_module_version": "1.2.0",
924
+ "model_name": "LayoutModel",
925
+ "state": {
926
+ "_model_module": "@jupyter-widgets/base",
927
+ "_model_module_version": "1.2.0",
928
+ "_model_name": "LayoutModel",
929
+ "_view_count": null,
930
+ "_view_module": "@jupyter-widgets/base",
931
+ "_view_module_version": "1.2.0",
932
+ "_view_name": "LayoutView",
933
+ "align_content": null,
934
+ "align_items": null,
935
+ "align_self": null,
936
+ "border": null,
937
+ "bottom": null,
938
+ "display": null,
939
+ "flex": null,
940
+ "flex_flow": null,
941
+ "grid_area": null,
942
+ "grid_auto_columns": null,
943
+ "grid_auto_flow": null,
944
+ "grid_auto_rows": null,
945
+ "grid_column": null,
946
+ "grid_gap": null,
947
+ "grid_row": null,
948
+ "grid_template_areas": null,
949
+ "grid_template_columns": null,
950
+ "grid_template_rows": null,
951
+ "height": null,
952
+ "justify_content": null,
953
+ "justify_items": null,
954
+ "left": null,
955
+ "margin": null,
956
+ "max_height": null,
957
+ "max_width": null,
958
+ "min_height": null,
959
+ "min_width": null,
960
+ "object_fit": null,
961
+ "object_position": null,
962
+ "order": null,
963
+ "overflow": null,
964
+ "overflow_x": null,
965
+ "overflow_y": null,
966
+ "padding": null,
967
+ "right": null,
968
+ "top": null,
969
+ "visibility": null,
970
+ "width": null
971
+ }
972
+ },
973
+ "c2f96abecad54565be62d18c1b5c1e68": {
974
+ "model_module": "@jupyter-widgets/controls",
975
+ "model_module_version": "1.5.0",
976
+ "model_name": "VBoxModel",
977
+ "state": {
978
+ "_dom_classes": [],
979
+ "_model_module": "@jupyter-widgets/controls",
980
+ "_model_module_version": "1.5.0",
981
+ "_model_name": "VBoxModel",
982
+ "_view_count": null,
983
+ "_view_module": "@jupyter-widgets/controls",
984
+ "_view_module_version": "1.5.0",
985
+ "_view_name": "VBoxView",
986
+ "box_style": "",
987
+ "children": [
988
+ "IPY_MODEL_0054c6582b4c45faa323add90dd34770",
989
+ "IPY_MODEL_634c65b48e0b40359f6158364fb54ad7"
990
+ ],
991
+ "layout": "IPY_MODEL_fa0aba1429524429af176534638122db"
992
+ }
993
+ },
994
+ "dc1f7e46eaf643999d482c3b17e3bee6": {
995
+ "model_module": "@jupyter-widgets/base",
996
+ "model_module_version": "1.2.0",
997
+ "model_name": "LayoutModel",
998
+ "state": {
999
+ "_model_module": "@jupyter-widgets/base",
1000
+ "_model_module_version": "1.2.0",
1001
+ "_model_name": "LayoutModel",
1002
+ "_view_count": null,
1003
+ "_view_module": "@jupyter-widgets/base",
1004
+ "_view_module_version": "1.2.0",
1005
+ "_view_name": "LayoutView",
1006
+ "align_content": null,
1007
+ "align_items": null,
1008
+ "align_self": null,
1009
+ "border": null,
1010
+ "bottom": null,
1011
+ "display": null,
1012
+ "flex": null,
1013
+ "flex_flow": null,
1014
+ "grid_area": null,
1015
+ "grid_auto_columns": null,
1016
+ "grid_auto_flow": null,
1017
+ "grid_auto_rows": null,
1018
+ "grid_column": null,
1019
+ "grid_gap": null,
1020
+ "grid_row": null,
1021
+ "grid_template_areas": null,
1022
+ "grid_template_columns": null,
1023
+ "grid_template_rows": null,
1024
+ "height": null,
1025
+ "justify_content": null,
1026
+ "justify_items": null,
1027
+ "left": null,
1028
+ "margin": null,
1029
+ "max_height": null,
1030
+ "max_width": null,
1031
+ "min_height": null,
1032
+ "min_width": null,
1033
+ "object_fit": null,
1034
+ "object_position": null,
1035
+ "order": null,
1036
+ "overflow": null,
1037
+ "overflow_x": null,
1038
+ "overflow_y": null,
1039
+ "padding": null,
1040
+ "right": null,
1041
+ "top": null,
1042
+ "visibility": null,
1043
+ "width": null
1044
+ }
1045
+ },
1046
+ "ebdfa2b37e5540e39bd6624f22eeb19a": {
1047
+ "model_module": "@jupyter-widgets/controls",
1048
+ "model_module_version": "1.5.0",
1049
+ "model_name": "DescriptionStyleModel",
1050
+ "state": {
1051
+ "_model_module": "@jupyter-widgets/controls",
1052
+ "_model_module_version": "1.5.0",
1053
+ "_model_name": "DescriptionStyleModel",
1054
+ "_view_count": null,
1055
+ "_view_module": "@jupyter-widgets/base",
1056
+ "_view_module_version": "1.2.0",
1057
+ "_view_name": "StyleView",
1058
+ "description_width": ""
1059
+ }
1060
+ },
1061
+ "fa0aba1429524429af176534638122db": {
1062
+ "model_module": "@jupyter-widgets/base",
1063
+ "model_module_version": "1.2.0",
1064
+ "model_name": "LayoutModel",
1065
+ "state": {
1066
+ "_model_module": "@jupyter-widgets/base",
1067
+ "_model_module_version": "1.2.0",
1068
+ "_model_name": "LayoutModel",
1069
+ "_view_count": null,
1070
+ "_view_module": "@jupyter-widgets/base",
1071
+ "_view_module_version": "1.2.0",
1072
+ "_view_name": "LayoutView",
1073
+ "align_content": null,
1074
+ "align_items": null,
1075
+ "align_self": null,
1076
+ "border": null,
1077
+ "bottom": null,
1078
+ "display": null,
1079
+ "flex": null,
1080
+ "flex_flow": null,
1081
+ "grid_area": null,
1082
+ "grid_auto_columns": null,
1083
+ "grid_auto_flow": null,
1084
+ "grid_auto_rows": null,
1085
+ "grid_column": null,
1086
+ "grid_gap": null,
1087
+ "grid_row": null,
1088
+ "grid_template_areas": null,
1089
+ "grid_template_columns": null,
1090
+ "grid_template_rows": null,
1091
+ "height": null,
1092
+ "justify_content": null,
1093
+ "justify_items": null,
1094
+ "left": null,
1095
+ "margin": null,
1096
+ "max_height": null,
1097
+ "max_width": null,
1098
+ "min_height": null,
1099
+ "min_width": null,
1100
+ "object_fit": null,
1101
+ "object_position": null,
1102
+ "order": null,
1103
+ "overflow": null,
1104
+ "overflow_x": null,
1105
+ "overflow_y": null,
1106
+ "padding": null,
1107
+ "right": null,
1108
+ "top": null,
1109
+ "visibility": null,
1110
+ "width": null
1111
+ }
1112
+ }
1113
+ }
1114
+ }
1115
+ },
1116
+ "nbformat": 4,
1117
+ "nbformat_minor": 0
1118
+ }
dataset/data_augmentation_KU-HAR.txt ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Stand Talk-stand
2
+ Stand Pick
3
+ Stand Jump
4
+ Stand Walk
5
+ Stand Walk-backward
6
+ Stand Walk-circle
7
+ Stand Run
8
+ Stand Stair-up
9
+ Stand Stair-down
10
+ Stand Table-tennis
11
+ Sit Talk-sit
12
+ Talk-sit Sit
13
+ Talk-stand Stand
14
+ Talk-stand Pick
15
+ Talk-stand Jump
16
+ Talk-stand Walk
17
+ Talk-stand Walk-backward
18
+ Talk-stand Walk-circle
19
+ Talk-stand Run
20
+ Talk-stand Stair-up
21
+ Talk-stand Stair-down
22
+ Talk-stand Table-tennis
23
+ Lay Sit-up
24
+ Pick Stand
25
+ Pick Talk-stand
26
+ Pick Jump
27
+ Pick Walk
28
+ Pick Walk-backward
29
+ Pick Walk-circle
30
+ Pick Run
31
+ Pick Stair-up
32
+ Pick Stair-down
33
+ Pick Table-tennis
34
+ Jump Stand
35
+ Jump Talk-stand
36
+ Jump Pick
37
+ Jump Walk
38
+ Jump Walk-backward
39
+ Jump Walk-circle
40
+ Jump Run
41
+ Jump Stair-up
42
+ Jump Stair-down
43
+ Jump Table-tennis
44
+ Sit-up Lay
45
+ Walk Stand
46
+ Walk Talk-stand
47
+ Walk Pick
48
+ Walk Jump
49
+ Walk Walk-circle
50
+ Walk Run
51
+ Walk Stair-up
52
+ Walk Stair-down
53
+ Walk Table-tennis
54
+ Walk-backward Stand
55
+ Walk-backward Talk-stand
56
+ Walk-backward Pick
57
+ Walk-backward Jump
58
+ Walk-backward Table-tennis
59
+ Walk-circle Stand
60
+ Walk-circle Talk-stand
61
+ Walk-circle Pick
62
+ Walk-circle Jump
63
+ Walk-circle Walk
64
+ Walk-circle Run
65
+ Walk-circle Stair-up
66
+ Walk-circle Stair-down
67
+ Walk-circle Table-tennis
68
+ Run Stand
69
+ Run Talk-stand
70
+ Run Pick
71
+ Run Jump
72
+ Run Walk
73
+ Run Walk-circle
74
+ Run Stair-up
75
+ Run Stair-down
76
+ Run Table-tennis
77
+ Stair-up Stand
78
+ Stair-up Talk-stand
79
+ Stair-up Pick
80
+ Stair-up Jump
81
+ Stair-up Walk
82
+ Stair-up Walk-circle
83
+ Stair-up Run
84
+ Stair-up Stair-down
85
+ Stair-down Stand
86
+ Stair-down Talk-stand
87
+ Stair-down Pick
88
+ Stair-down Jump
89
+ Stair-down Walk
90
+ Stair-down Walk-circle
91
+ Stair-down Run
92
+ Stair-down Stair-up
93
+ Table-tennis Stand
94
+ Table-tennis Talk-stand
95
+ Table-tennis Pick
96
+ Table-tennis Jump
97
+ Table-tennis Walk
98
+ Table-tennis Walk-backward
99
+ Table-tennis Walk-circle
100
+ Table-tennis Run
img/hyperparams.png ADDED
img/model.png ADDED
img/result.png ADDED
save/model-best.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2e6ccb7b073a0fbebb411c5c055a4b4edf3fa8bfa1b996aa435c2db0f82d49c7
3
+ size 5790288
save/model-best/keras_metadata.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:80364f440b93b0aec8ecff351ef7655e6c1d7bd4aa52fb7e308a3f0c608cf44b
3
+ size 38612
save/model-best/saved_model.pb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:20cf326cd90331097d2dacc98c0967c4d35b807c8b4ac05ac4eb9144c56b7660
3
+ size 855165
save/model-best/variables/variables.data-00000-of-00001 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a615afb81806229cb65eb64b83d3baf7e75fa2ba1b6b5e4b7005bc6fbf740dd8
3
+ size 5740219
save/model-best/variables/variables.index ADDED
Binary file (3.52 kB). View file