Skip to content

Commit 453c77d

Browse files
committed
LSTM added
1 parent 7b222f4 commit 453c77d

36 files changed

+143013
-2
lines changed

Diff for: LSTM-Test.ipynb

+302
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"metadata": {},
7+
"outputs": [
8+
{
9+
"name": "stdout",
10+
"output_type": "stream",
11+
"text": [
12+
"hdf5 is not supported on this machine (please install/reinstall h5py for optimal experience)\n"
13+
]
14+
}
15+
],
16+
"source": [
17+
"import glob\n",
18+
"import sys\n",
19+
"import math\n",
20+
"import numpy as np\n",
21+
"import tensorflow as tf\n",
22+
"from random import shuffle\n",
23+
"from random import seed\n",
24+
"\n",
25+
"from device import Device\n",
26+
"from stroke import Stroke\n",
27+
"from sample import Sample\n",
28+
"from datetime import datetime\n",
29+
"import pickle\n",
30+
"import sklearn.utils\n",
31+
"import statistics\n",
32+
"import tflearn"
33+
]
34+
},
35+
{
36+
"cell_type": "code",
37+
"execution_count": 2,
38+
"metadata": {
39+
"collapsed": true
40+
},
41+
"outputs": [],
42+
"source": [
43+
"class MySample:\n",
44+
" def __init__(self, events, sequence_counter, count, inch, jump):\n",
45+
" self.angle = 0\n",
46+
" self.inch = inch\n",
47+
"\n",
48+
" self.x = []\n",
49+
" self.y = []\n",
50+
" self.time = []\n",
51+
" for i in range(sequence_counter, sequence_counter+count):\n",
52+
" if i >= jump-1:\n",
53+
" self.x.append(events[jump-1][0])\n",
54+
" self.y.append(events[jump-1][1])\n",
55+
" \n",
56+
" if i == sequence_counter:\n",
57+
" self.time.append(17)\n",
58+
" else:\n",
59+
" self.time.append(events[jump-1][3]-events[jump-2][3])\n",
60+
" else:\n",
61+
" self.x.append(events[i][0])\n",
62+
" self.y.append(events[i][1])\n",
63+
" if i == sequence_counter:\n",
64+
" self.time.append(17)\n",
65+
" else:\n",
66+
" self.time.append(events[i][3]-events[i-1][3])\n",
67+
"\n",
68+
" def derivate(self):\n",
69+
" x_der = []\n",
70+
" y_der = []\n",
71+
" time_der = []\n",
72+
" for i in range(len(self.x)-1):\n",
73+
" x_der.append(self.x[i+1]-self.x[i])\n",
74+
" y_der.append(self.y[i+1]-self.y[i])\n",
75+
" time_der.append(self.time[i+1])\n",
76+
" self.x = x_der\n",
77+
" self.y = y_der\n",
78+
" self.time = time_der\n",
79+
"\n",
80+
" def getAngle(self, startIndex, endIndex):\n",
81+
" myX = self.x[endIndex]-self.x[startIndex]\n",
82+
" myY = self.y[endIndex]-self.y[startIndex]\n",
83+
" return math.atan2(myX, myY)\n",
84+
"\n",
85+
" def rotate(self, angle, originIndex):\n",
86+
" self.rotation = angle\n",
87+
"\n",
88+
" cs = math.cos(angle)\n",
89+
" sn = math.sin(angle)\n",
90+
" for i in range(len(self.x)):\n",
91+
" myX = (self.x[i]-self.x[originIndex]) * cs -\\\n",
92+
" (self.y[i]-self.y[originIndex])*sn\n",
93+
" myY = (self.x[i]-self.x[originIndex]) * sn +\\\n",
94+
" (self.y[i]-self.y[originIndex])*cs\n",
95+
" self.x[i] = myX + self.x[originIndex]\n",
96+
" self.y[i] = myY + self.y[originIndex]"
97+
]
98+
},
99+
{
100+
"cell_type": "code",
101+
"execution_count": 3,
102+
"metadata": {
103+
"collapsed": true
104+
},
105+
"outputs": [],
106+
"source": [
107+
"def loadStudyData(path, inType, sampleLength):\n",
108+
" file_list = []\n",
109+
" name = \"xxx\"\n",
110+
" if inType == 1: name = \"FittsTasks-participant\"\n",
111+
" elif inType == 2: name = \"PaintTasks-participant\"\n",
112+
" elif inType == 3: name = \"WriteTasks-participant\"\n",
113+
"\n",
114+
" fileName = path+name\n",
115+
"\n",
116+
" for index in range(1,9):\n",
117+
" file_list.append(fileName+str(index)+\".txt\")\n",
118+
"\n",
119+
" samples = []\n",
120+
"\n",
121+
" for fileName in file_list:\n",
122+
" events = []\n",
123+
" f = open(fileName, 'r')\n",
124+
" for line in f:\n",
125+
" tokens = line.split(';')\n",
126+
" events.append([float(tokens[2]), float(tokens[3]), float(tokens[4]), int(tokens[1]), int(tokens[5])])\n",
127+
"\n",
128+
" seqCount = 0\n",
129+
" for i, event in enumerate(events):\n",
130+
" jump = i+sampleLength+1\n",
131+
"\n",
132+
" for j in range(i, i+sampleLength):\n",
133+
" if j >= len(events) or events[j][4] is not 2:\n",
134+
" jump = j\n",
135+
" break\n",
136+
" if jump-i > 11:\n",
137+
" sample = MySample(events, i, sampleLength, 7, jump)\n",
138+
"\n",
139+
" sample.angle = sample.getAngle(9, 10) + math.radians(45)\n",
140+
" sample.rotate(sample.angle, 10)\n",
141+
"\n",
142+
" sample.derivate()\n",
143+
"\n",
144+
" sameTime = 0\n",
145+
" for a in range(len(sample.time)):\n",
146+
" if sample.time[a] < 1:\n",
147+
" sameTime = 1\n",
148+
" if sameTime == 0:\n",
149+
" samples.append(sample)\n",
150+
"\n",
151+
" return samples"
152+
]
153+
},
154+
{
155+
"cell_type": "code",
156+
"execution_count": 4,
157+
"metadata": {
158+
"collapsed": true
159+
},
160+
"outputs": [],
161+
"source": [
162+
"def buildLSTM():\n",
163+
" net = tflearn.input_data([None, 10, 3], name=\"input1\")\n",
164+
" net = tflearn.lstm(net, 512, return_seq=True, weights_init=\"xavier\")\n",
165+
" net = tflearn.dropout(net, 0.75)\n",
166+
" net = tflearn.lstm(net, 256, weights_init=\"xavier\")\n",
167+
" net = tflearn.dropout(net, 0.75)\n",
168+
" net = tflearn.fully_connected(net, 2, activation='linear', weights_init=\"xavier\")\n",
169+
" \n",
170+
" net = tflearn.regression(net, optimizer='adam', learning_rate=0.0001, loss='mean_square')\n",
171+
"\n",
172+
" return tflearn.DNN(net)\n",
173+
"\n",
174+
"def buildLSTMVectors(samples, steps):\n",
175+
" inStudyVec = []\n",
176+
" outStudyVec = []\n",
177+
" \n",
178+
" for sample in samples:\n",
179+
" line = []\n",
180+
" for i in range(10):\n",
181+
" line.append([sample.x[i], sample.y[i], sample.time[i+steps]])\n",
182+
" inStudyVec.append(line)\n",
183+
" \n",
184+
" x = 0\n",
185+
" y = 0\n",
186+
" for i in range(0,steps):\n",
187+
" x = x + sample.x[10 + i]\n",
188+
" y = y + sample.y[10 + i]\n",
189+
" outStudyVec.append([x, y])\n",
190+
" inStudyVec = np.array(inStudyVec)\n",
191+
" outStudyVec = np.array(outStudyVec)\n",
192+
"\n",
193+
" return inStudyVec, outStudyVec\n",
194+
"\n",
195+
"def getLSTMPerformance(model, inVec, outVec, steps):\n",
196+
" batch_size = 500\n",
197+
" total_batch = int(len(inVec)/batch_size)\n",
198+
" avgDist = 0\n",
199+
" for i in range(int(len(inVec)/batch_size)+1):\n",
200+
" batch_x = inVec[i*batch_size:min((i+1)*batch_size, len(inVec))]\n",
201+
" batch_y = outVec[i*batch_size:min((i+1)*batch_size, len(inVec))]\n",
202+
"\n",
203+
" myY = np.array(model.predict(batch_x))\n",
204+
"\n",
205+
" for j in range(len(batch_x)): \n",
206+
" dist = (batch_y[j][0]-myY[j][0])*(batch_y[j][0]-myY[j][0])\n",
207+
" dist = dist + (batch_y[j][1]-myY[j][1])*(batch_y[j][1]-myY[j][1])\n",
208+
" dist = math.sqrt(dist)\n",
209+
" avgDist = avgDist + dist\n",
210+
" return avgDist/len(inVec)"
211+
]
212+
},
213+
{
214+
"cell_type": "code",
215+
"execution_count": 5,
216+
"metadata": {},
217+
"outputs": [
218+
{
219+
"name": "stdout",
220+
"output_type": "stream",
221+
"text": [
222+
"INFO:tensorflow:Restoring parameters from /home/henzens/jupyter/touch/models/LSTM 33.tflearn\n",
223+
"33.33 ms draw 7.4 px\n",
224+
"33.33 ms write 13.2 px\n",
225+
"33.33 ms fitts 5.1 px\n",
226+
"33.33 ms average 8.6 px\n",
227+
"\n",
228+
"INFO:tensorflow:Restoring parameters from /home/henzens/jupyter/touch/models/LSTM 67.tflearn\n",
229+
"66.67 ms draw 15.6 px\n",
230+
"66.67 ms write 31.9 px\n",
231+
"66.67 ms fitts 13.0 px\n",
232+
"66.67 ms average 20.2 px\n",
233+
"\n",
234+
"INFO:tensorflow:Restoring parameters from /home/henzens/jupyter/touch/models/LSTM 100.tflearn\n",
235+
"100.00 ms draw 25.4 px\n",
236+
"100.00 ms write 54.3 px\n",
237+
"100.00 ms fitts 23.0 px\n",
238+
"100.00 ms average 34.2 px\n",
239+
"\n"
240+
]
241+
}
242+
],
243+
"source": [
244+
"tasks = [\"fitts\", \"draw\", \"write\"]\n",
245+
"time = [\"LSTM 33\", \"LSTM 67\", \"LSTM 100\"]\n",
246+
" \n",
247+
"model = buildLSTM()\n",
248+
"for j1, store in enumerate(time):\n",
249+
" j = (j1+1) * 2\n",
250+
" model.load(\"./models/\"+store+'.tflearn', False)\n",
251+
" avgError = 0\n",
252+
" for i in range(1, 4):\n",
253+
" samples = loadStudyData('./data/', i, 11+j)\n",
254+
" inStudyVec, outStudyVec = buildLSTMVectors(samples, j)\n",
255+
" perf = getLSTMPerformance(model, inStudyVec, outStudyVec, j)\n",
256+
" avgError = avgError + perf\n",
257+
" \n",
258+
" print(\"{:.2f}\".format(j*16.6666), \"ms \", tasks[i-1], \"{:.1f}\".format(perf), \"px\")\n",
259+
" print(\"{:.2f}\".format(j*16.6666), \"ms \", \"average\", \"{:.1f}\".format(avgError/3), \"px\\n\")"
260+
]
261+
},
262+
{
263+
"cell_type": "code",
264+
"execution_count": null,
265+
"metadata": {
266+
"collapsed": true
267+
},
268+
"outputs": [],
269+
"source": []
270+
},
271+
{
272+
"cell_type": "code",
273+
"execution_count": null,
274+
"metadata": {
275+
"collapsed": true
276+
},
277+
"outputs": [],
278+
"source": []
279+
}
280+
],
281+
"metadata": {
282+
"kernelspec": {
283+
"display_name": "Python 3",
284+
"language": "python",
285+
"name": "python3"
286+
},
287+
"language_info": {
288+
"codemirror_mode": {
289+
"name": "ipython",
290+
"version": 3
291+
},
292+
"file_extension": ".py",
293+
"mimetype": "text/x-python",
294+
"name": "python",
295+
"nbconvert_exporter": "python",
296+
"pygments_lexer": "ipython3",
297+
"version": "3.6.1"
298+
}
299+
},
300+
"nbformat": 4,
301+
"nbformat_minor": 2
302+
}

0 commit comments

Comments
 (0)