diff --git a/.gitignore b/.gitignore index 1b46987..62c472e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .ipynb_checkpoints -___* + diff --git a/LSTM.ipynb b/LSTM.ipynb index 8dbeffc..c16e9af 100644 --- a/LSTM.ipynb +++ b/LSTM.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# LSTMs for Human Activity Recognition\n", + "# LSTMs for Human Activity Recognition\n", "\n", - "Human Activity Recognition (HAR) using smartphones dataset and an LSTM RNN. Classifying the type of movement amongst six categories:\n", + "Human activity recognition using smartphones dataset and an LSTM RNN. Classifying the type of movement amongst six categories:\n", "- WALKING,\n", "- WALKING_UPSTAIRS,\n", "- WALKING_DOWNSTAIRS,\n", @@ -14,9 +14,7 @@ "- STANDING,\n", "- LAYING.\n", "\n", - "Compared to a classical approach, using a Recurrent Neural Networks (RNN) with Long Short-Term Memory cells (LSTMs) require no or almost no feature engineering. Data can be fed directly into the neural network who acts like a black box, modeling the problem correctly. [Other research](https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%20HAR%20Dataset.names) on the activity recognition dataset can use a big amount of feature engineering, which is rather a signal processing approach combined with classical data science techniques. The approach here is rather very simple in terms of how much was the data preprocessed. \n", - "\n", - "Let's use Google's neat Deep Learning library, TensorFlow, demonstrating the usage of an LSTM, a type of Artificial Neural Network that can process sequential data / time series. \n", + "Compared to a classical approach, using a Recurrent Neural Networks (RNN) with Long Short-Term Memory cells (LSTMs) require no or almost no feature engineering. Data can be fed directly into the neural network who acts like a black box, modeling the problem correctly. Other research on the activity recognition dataset used mostly use a big amount of feature engineering, which is rather a signal processing approach combined with classical data science techniques. The approach here is rather very simple in terms of how much did the data was preprocessed. \n", "\n", "## Video dataset overview\n", "\n", @@ -29,24 +27,21 @@ "
[Watch video]
\n", "

\n", "\n", - "## Details about the input data\n", + "## Details about input data\n", "\n", "I will be using an LSTM on the data to learn (as a cellphone attached on the waist) to recognise the type of activity that the user is doing. The dataset's description goes like this:\n", "\n", "> The sensor signals (accelerometer and gyroscope) were pre-processed by applying noise filters and then sampled in fixed-width sliding windows of 2.56 sec and 50% overlap (128 readings/window). The sensor acceleration signal, which has gravitational and body motion components, was separated using a Butterworth low-pass filter into body acceleration and gravity. The gravitational force is assumed to have only low frequency components, therefore a filter with 0.3 Hz cutoff frequency was used. \n", "\n", - "That said, I will use the almost raw data: only the gravity effect has been filtered out of the accelerometer as a preprocessing step for another 3D feature as an input to help learning. If you'd ever want to extract the gravity by yourself, you could fork my code on using a [Butterworth Low-Pass Filter (LPF) in Python](https://github.com/guillaume-chevalier/filtering-stft-and-laplace-transform) and edit it to have the right cutoff frequency of 0.3 Hz which is a good frequency for activity recognition from body sensors.\n", + "That said, I will use the almost raw data: only the gravity effect has been filtered out of the accelerometer as a preprocessing step for another 3D feature as an input to help learning. \n", "\n", "## What is an RNN?\n", "\n", - "As explained in [this article](http://karpathy.github.io/2015/05/21/rnn-effectiveness/), an RNN takes many input vectors to process them and output other vectors. It can be roughly pictured like in the image below, imagining each rectangle has a vectorial depth and other special hidden quirks in the image below. **In our case, the \"many to one\" architecture is used**: we accept time series of [feature vectors](https://www.quora.com/What-do-samples-features-time-steps-mean-in-LSTM/answer/Guillaume-Chevalier-2) (one vector per [time step](https://www.quora.com/What-do-samples-features-time-steps-mean-in-LSTM/answer/Guillaume-Chevalier-2)) to convert them to a probability vector at the output for classification. Note that a \"one to one\" architecture would be a standard feedforward neural network. \n", - "\n", - "> \n", - "> http://karpathy.github.io/2015/05/21/rnn-effectiveness/\n", + "As explained in [this article](http://karpathy.github.io/2015/05/21/rnn-effectiveness/), an RNN takes many input vectors to process them and output other vectors. It can be roughly pictured like in the image below, imagining each rectangle has a vectorial depth and other special hidden quirks in the image below. **In our case, the \"many to one\" architecture is used**: we accept time series of feature vectors (one vector per time step) to convert them to a probability vector at the output for classification. Note that a \"one to one\" architecture would be a standard feedforward neural network. \n", "\n", - "## What is an LSTM?\n", + "\n", "\n", - "An LSTM is an improved RNN. It is more complex, but easier to train, avoiding what is called the vanishing gradient problem. I recommend [this article](http://colah.github.io/posts/2015-08-Understanding-LSTMs/) for you to learn more on LSTMs.\n", + "An LSTM is an improved RNN. It is more complex, but easier to train, avoiding what is called the vanishing gradient problem. \n", "\n", "\n", "## Results \n", @@ -56,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": true }, @@ -75,8 +70,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": null, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Useful Constants\n", @@ -114,45 +111,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/ubuntu/pynb/LSTM-Human-Activity-Recognition\n", - "data\t LSTM_files LSTM_OLD.ipynb README.md\n", - "LICENSE LSTM.ipynb lstm.py\t screenlog.0\n", - "/home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data\n", - "download_dataset.py source.txt\n", - "\n", - "Downloading...\n", - "--2017-05-24 01:49:53-- https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%20HAR%20Dataset.zip\n", - "Resolving archive.ics.uci.edu (archive.ics.uci.edu)... 128.195.10.249\n", - "Connecting to archive.ics.uci.edu (archive.ics.uci.edu)|128.195.10.249|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 60999314 (58M) [application/zip]\n", - "Saving to: ‘UCI HAR Dataset.zip’\n", - "\n", - "100%[======================================>] 60,999,314 1.69MB/s in 38s \n", - "\n", - "2017-05-24 01:50:31 (1.55 MB/s) - ‘UCI HAR Dataset.zip’ saved [60999314/60999314]\n", - "\n", - "Downloading done.\n", - "\n", - "Extracting...\n", - "Extracting successfully done to /home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data/UCI HAR Dataset.\n", - "/home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data\n", - "download_dataset.py __MACOSX source.txt UCI HAR Dataset UCI HAR Dataset.zip\n", - "/home/ubuntu/pynb/LSTM-Human-Activity-Recognition\n", - "data\t LSTM_files LSTM_OLD.ipynb README.md\n", - "LICENSE LSTM.ipynb lstm.py\t screenlog.0\n", - "\n", - "Dataset is now located at: data/UCI HAR Dataset/\n" - ] - } - ], + "outputs": [], "source": [ "# Note: Linux bash commands start with a \"!\" inside those \"ipython notebook\" cells\n", "\n", @@ -181,8 +142,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": null, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "TRAIN = \"train/\"\n", @@ -248,25 +211,14 @@ "\n", "Here are some core parameter definitions for the training. \n", "\n", - "For example, the whole neural network's structure could be summarised by enumerating those parameters and the fact that two LSTM are used one on top of another (stacked) output-to-input as hidden layers through time steps. " + "The whole neural network's structure could be summarised by enumerating those parameters and the fact an LSTM is used. " ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Some useful info to get an insight on dataset's shape and normalisation:\n", - "(X shape, y shape, every X's mean, every X's standard deviation)\n", - "(2947, 128, 9) (2947, 1) 0.0991399 0.395671\n", - "The dataset is therefore properly normalised, as expected, but not yet one-hot encoded.\n" - ] - } - ], + "outputs": [], "source": [ "# Input Data \n", "\n", @@ -308,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": true }, @@ -328,7 +280,7 @@ " _X = tf.reshape(_X, [-1, n_input]) \n", " # new shape: (n_steps*batch_size, n_input)\n", " \n", - " # ReLU activation, thanks to Yu Zhao for adding this improvement here:\n", + " # Linear activation\n", " _X = tf.nn.relu(tf.matmul(_X, _weights['hidden']) + _biases['hidden'])\n", " # Split data because rnn cell needs a list of inputs for the RNN inner loop\n", " _X = tf.split(_X, n_steps, 0) \n", @@ -341,7 +293,7 @@ " # Get LSTM cell output\n", " outputs, states = tf.contrib.rnn.static_rnn(lstm_cells, _X, dtype=tf.float32)\n", "\n", - " # Get last time step's output feature for a \"many-to-one\" style classifier, \n", + " # Get last time step's output feature for a \"many to one\" style classifier, \n", " # as in the image describing RNNs at the top of this page\n", " lstm_last_output = outputs[-1]\n", " \n", @@ -364,14 +316,13 @@ " return batch_s\n", "\n", "\n", - "def one_hot(y_, n_classes=n_classes):\n", - " # Function to encode neural one-hot output labels from number indexes \n", - " # e.g.: \n", - " # one_hot(y_=[[5], [0], [3]], n_classes=6):\n", - " # return [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]]\n", + "def one_hot(y_):\n", + " # Function to encode output labels from number indexes \n", + " # e.g.: [[5], [0], [3]] --> [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]]\n", " \n", " y_ = y_.reshape(len(y_))\n", - " return np.eye(n_classes)[np.array(y_, dtype=np.int32)] # Returns FLOATS\n" + " n_values = int(np.max(y_)) + 1\n", + " return np.eye(n_values)[np.array(y_, dtype=np.int32)] # Returns FLOATS\n" ] }, { @@ -383,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -424,171 +375,36 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "if not os.path.exists('checkpoints/'): # making the directory to save the best model weights if not made\n", + " os.makedirs('checkpoints/')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "prev_loss = 100000 # prev_loss is the loss for the previous step, initialized with a big number\n", + " # so as to make the condition true for the first step, considering test loss for\n", + " # first step will not get greater than 100000." + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": { - "scrolled": true + "scrolled": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:From :9: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.\n", - "Instructions for updating:\n", - "Use `tf.global_variables_initializer` instead.\n", - "Training iter #1500: Batch Loss = 5.416760, Accuracy = 0.15266665816307068\n", - "PERFORMANCE ON TEST SET: Batch Loss = 4.880829811096191, Accuracy = 0.05632847175002098\n", - "Training iter #30000: Batch Loss = 3.031930, Accuracy = 0.607333242893219\n", - "PERFORMANCE ON TEST SET: Batch Loss = 3.0515167713165283, Accuracy = 0.6067186594009399\n", - "Training iter #60000: Batch Loss = 2.672764, Accuracy = 0.7386666536331177\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.780435085296631, Accuracy = 0.7027485370635986\n", - "Training iter #90000: Batch Loss = 2.378301, Accuracy = 0.8366667032241821\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.6019773483276367, Accuracy = 0.7617915868759155\n", - "Training iter #120000: Batch Loss = 2.127290, Accuracy = 0.9066667556762695\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.3625404834747314, Accuracy = 0.8116728663444519\n", - "Training iter #150000: Batch Loss = 1.929805, Accuracy = 0.9380000233650208\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.306251049041748, Accuracy = 0.8276212215423584\n", - "Training iter #180000: Batch Loss = 1.971904, Accuracy = 0.9153333902359009\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.0835530757904053, Accuracy = 0.8771631121635437\n", - "Training iter #210000: Batch Loss = 1.860249, Accuracy = 0.8613333702087402\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.9994492530822754, Accuracy = 0.8788597583770752\n", - "Training iter #240000: Batch Loss = 1.626292, Accuracy = 0.9380000233650208\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.879166603088379, Accuracy = 0.8944689035415649\n", - "Training iter #270000: Batch Loss = 1.582758, Accuracy = 0.9386667013168335\n", - "PERFORMANCE ON TEST SET: Batch Loss = 2.0341007709503174, Accuracy = 0.8361043930053711\n", - "Training iter #300000: Batch Loss = 1.620352, Accuracy = 0.9306666851043701\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.8185184001922607, Accuracy = 0.8639293313026428\n", - "Training iter #330000: Batch Loss = 1.474394, Accuracy = 0.9693333506584167\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.7638503313064575, Accuracy = 0.8747878670692444\n", - "Training iter #360000: Batch Loss = 1.406998, Accuracy = 0.9420000314712524\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.5946787595748901, Accuracy = 0.902273416519165\n", - "Training iter #390000: Batch Loss = 1.362515, Accuracy = 0.940000057220459\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.5285792350769043, Accuracy = 0.9046487212181091\n", - "Training iter #420000: Batch Loss = 1.252860, Accuracy = 0.9566667079925537\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.4635565280914307, Accuracy = 0.9107565879821777\n", - "Training iter #450000: Batch Loss = 1.190078, Accuracy = 0.9553333520889282\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.442753553390503, Accuracy = 0.9093992710113525\n", - "Training iter #480000: Batch Loss = 1.159610, Accuracy = 0.9446667432785034\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.4130011796951294, Accuracy = 0.8971834778785706\n", - "Training iter #510000: Batch Loss = 1.100551, Accuracy = 0.9593333601951599\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.3075592517852783, Accuracy = 0.9117745757102966\n", - "Training iter #540000: Batch Loss = 1.123470, Accuracy = 0.9240000247955322\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.2605488300323486, Accuracy = 0.9165251851081848\n", - "Training iter #570000: Batch Loss = 1.103454, Accuracy = 0.909333348274231\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.2327136993408203, Accuracy = 0.9009160399436951\n", - "Training iter #600000: Batch Loss = 1.083368, Accuracy = 0.8966666460037231\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.2683708667755127, Accuracy = 0.8890395164489746\n", - "Training iter #630000: Batch Loss = 0.939185, Accuracy = 0.9700000882148743\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.2147629261016846, Accuracy = 0.8866642713546753\n", - "Training iter #660000: Batch Loss = 0.881242, Accuracy = 0.9806667566299438\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.1068334579467773, Accuracy = 0.9151678681373596\n", - "Training iter #690000: Batch Loss = 0.831674, Accuracy = 0.9853334426879883\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.0885852575302124, Accuracy = 0.9121139645576477\n", - "Training iter #720000: Batch Loss = 0.866615, Accuracy = 0.9573334455490112\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.0513516664505005, Accuracy = 0.9158465266227722\n", - "Training iter #750000: Batch Loss = 0.858979, Accuracy = 0.940000057220459\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.0598633289337158, Accuracy = 0.9063453674316406\n", - "Training iter #780000: Batch Loss = 0.750040, Accuracy = 0.9593334197998047\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.010966420173645, Accuracy = 0.9155071973800659\n", - "Training iter #810000: Batch Loss = 0.732136, Accuracy = 0.9620000123977661\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.9865696430206299, Accuracy = 0.9161858558654785\n", - "Training iter #840000: Batch Loss = 0.758945, Accuracy = 0.9406667351722717\n", - "PERFORMANCE ON TEST SET: Batch Loss = 1.0347753763198853, Accuracy = 0.8958262205123901\n", - "Training iter #870000: Batch Loss = 0.710809, Accuracy = 0.9660000205039978\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.9786491990089417, Accuracy = 0.893111526966095\n", - "Training iter #900000: Batch Loss = 0.705978, Accuracy = 0.9553333520889282\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.9204542636871338, Accuracy = 0.9002374410629272\n", - "Training iter #930000: Batch Loss = 0.759181, Accuracy = 0.9066667556762695\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.9086415767669678, Accuracy = 0.9036307334899902\n", - "Training iter #960000: Batch Loss = 0.705333, Accuracy = 0.9286667108535767\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.850454568862915, Accuracy = 0.9080419540405273\n", - "Training iter #990000: Batch Loss = 0.599754, Accuracy = 0.9693333506584167\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.8451057076454163, Accuracy = 0.9114353656768799\n", - "Training iter #1020000: Batch Loss = 0.585689, Accuracy = 0.9700000286102295\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.8170899152755737, Accuracy = 0.9110959768295288\n", - "Training iter #1050000: Batch Loss = 0.553970, Accuracy = 0.984000027179718\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.8555561304092407, Accuracy = 0.9114352464675903\n", - "Training iter #1080000: Batch Loss = 0.601349, Accuracy = 0.9693334102630615\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.8512595891952515, Accuracy = 0.8781810998916626\n", - "Training iter #1110000: Batch Loss = 0.601967, Accuracy = 0.937999963760376\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.7551606297492981, Accuracy = 0.9087206721305847\n", - "Training iter #1140000: Batch Loss = 0.597223, Accuracy = 0.9353333711624146\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.7431289553642273, Accuracy = 0.909060001373291\n", - "Training iter #1170000: Batch Loss = 0.523300, Accuracy = 0.9500000476837158\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.745741605758667, Accuracy = 0.9093992710113525\n", - "Training iter #1200000: Batch Loss = 0.500816, Accuracy = 0.9600000381469727\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6978224515914917, Accuracy = 0.9138105511665344\n", - "Training iter #1230000: Batch Loss = 0.495834, Accuracy = 0.9546667337417603\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6866210699081421, Accuracy = 0.9178825616836548\n", - "Training iter #1260000: Batch Loss = 0.480467, Accuracy = 0.9813334345817566\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6883729100227356, Accuracy = 0.9100779294967651\n", - "Training iter #1290000: Batch Loss = 0.516874, Accuracy = 0.9326666593551636\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6925369501113892, Accuracy = 0.9032914042472839\n", - "Training iter #1320000: Batch Loss = 0.570053, Accuracy = 0.9080000519752502\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.743996798992157, Accuracy = 0.8978621363639832\n", - "Training iter #1350000: Batch Loss = 0.491792, Accuracy = 0.9580000638961792\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6543726921081543, Accuracy = 0.8951475024223328\n", - "Training iter #1380000: Batch Loss = 0.423705, Accuracy = 0.9760000705718994\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6256207227706909, Accuracy = 0.91788250207901\n", - "Training iter #1410000: Batch Loss = 0.399226, Accuracy = 0.9840000867843628\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6232836246490479, Accuracy = 0.9205971360206604\n", - "Training iter #1440000: Batch Loss = 0.415493, Accuracy = 0.972000002861023\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.6083709001541138, Accuracy = 0.9104173183441162\n", - "Training iter #1470000: Batch Loss = 0.499316, Accuracy = 0.9306666851043701\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5882848501205444, Accuracy = 0.9117745757102966\n", - "Training iter #1500000: Batch Loss = 0.478666, Accuracy = 0.9346666932106018\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5803182125091553, Accuracy = 0.91652512550354\n", - "Training iter #1530000: Batch Loss = 0.366041, Accuracy = 0.968666672706604\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5783829689025879, Accuracy = 0.9114352464675903\n", - "Training iter #1560000: Batch Loss = 0.377644, Accuracy = 0.9506667256355286\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5899279117584229, Accuracy = 0.9070240259170532\n", - "Training iter #1590000: Batch Loss = 0.485060, Accuracy = 0.9133333563804626\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.7430599927902222, Accuracy = 0.8649473190307617\n", - "Training iter #1620000: Batch Loss = 0.386228, Accuracy = 0.9633333683013916\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5264637470245361, Accuracy = 0.9070240259170532\n", - "Training iter #1650000: Batch Loss = 0.416933, Accuracy = 0.9193333983421326\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5343363881111145, Accuracy = 0.914489209651947\n", - "Training iter #1680000: Batch Loss = 0.421477, Accuracy = 0.9300000667572021\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5374469757080078, Accuracy = 0.9243297576904297\n", - "Training iter #1710000: Batch Loss = 0.403527, Accuracy = 0.9300000071525574\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5439008474349976, Accuracy = 0.905666708946228\n", - "Training iter #1740000: Batch Loss = 0.331851, Accuracy = 0.9753334522247314\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5405154228210449, Accuracy = 0.9093992710113525\n", - "Training iter #1770000: Batch Loss = 0.337737, Accuracy = 0.9780000448226929\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5582258701324463, Accuracy = 0.9026126861572266\n", - "Training iter #1800000: Batch Loss = 0.332086, Accuracy = 0.9600000381469727\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5655900835990906, Accuracy = 0.8995587825775146\n", - "Training iter #1830000: Batch Loss = 0.400998, Accuracy = 0.9480000734329224\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.47865116596221924, Accuracy = 0.9144891500473022\n", - "Training iter #1860000: Batch Loss = 0.364531, Accuracy = 0.9493333697319031\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.49166250228881836, Accuracy = 0.9158465266227722\n", - "Training iter #1890000: Batch Loss = 0.316529, Accuracy = 0.9593334197998047\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5186017751693726, Accuracy = 0.9104173183441162\n", - "Training iter #1920000: Batch Loss = 0.309109, Accuracy = 0.9626667499542236\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5222393274307251, Accuracy = 0.9002374410629272\n", - "Training iter #1950000: Batch Loss = 0.427720, Accuracy = 0.9193333387374878\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5457150340080261, Accuracy = 0.9070240259170532\n", - "Training iter #1980000: Batch Loss = 0.330174, Accuracy = 0.9526667594909668\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.5917137861251831, Accuracy = 0.8812350034713745\n", - "Training iter #2010000: Batch Loss = 0.371541, Accuracy = 0.906000018119812\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.53951495885849, Accuracy = 0.8802171349525452\n", - "Training iter #2040000: Batch Loss = 0.382413, Accuracy = 0.9206666946411133\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.42567864060401917, Accuracy = 0.9324736595153809\n", - "Training iter #2070000: Batch Loss = 0.342763, Accuracy = 0.9326667189598083\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.4292983412742615, Accuracy = 0.9273836612701416\n", - "Training iter #2100000: Batch Loss = 0.259442, Accuracy = 0.9873334169387817\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.44131210446357727, Accuracy = 0.9273836612701416\n", - "Training iter #2130000: Batch Loss = 0.284630, Accuracy = 0.9593333601951599\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.46982717514038086, Accuracy = 0.9093992710113525\n", - "Training iter #2160000: Batch Loss = 0.299012, Accuracy = 0.9686667323112488\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.48389002680778503, Accuracy = 0.9138105511665344\n", - "Training iter #2190000: Batch Loss = 0.287106, Accuracy = 0.9700000286102295\n", - "PERFORMANCE ON TEST SET: Batch Loss = 0.4670214056968689, Accuracy = 0.9216151237487793\n", - "Optimization Finished!\n", - "FINAL RESULT: Batch Loss = 0.45611169934272766, Accuracy = 0.9165252447128296\n" - ] - } - ], + "outputs": [], "source": [ "# To keep track of training's performance\n", "test_losses = []\n", @@ -597,13 +413,16 @@ "train_accuracies = []\n", "\n", "# Launch the graph\n", + "saver = tf.train.Saver()\n", "sess = tf.InteractiveSession(config=tf.ConfigProto(log_device_placement=True))\n", "init = tf.global_variables_initializer()\n", "sess.run(init)\n", "\n", + "\n", "# Perform Training steps with \"batch_size\" amount of example data at each loop\n", "step = 1\n", "while step * batch_size <= training_iters:\n", + " \n", " batch_xs = extract_batch_size(X_train, step, batch_size)\n", " batch_ys = one_hot(extract_batch_size(y_train, step, batch_size))\n", "\n", @@ -634,16 +453,38 @@ " y: one_hot(y_test)\n", " }\n", " )\n", + " \n", + " \n", " test_losses.append(loss)\n", " test_accuracies.append(acc)\n", " print(\"PERFORMANCE ON TEST SET: \" + \\\n", " \"Batch Loss = {}\".format(loss) + \\\n", " \", Accuracy = {}\".format(acc))\n", + " \n", + " # Saving the model weights only when the validation loss of a step is least out of the all the steps done before.\n", + " # The least validation loss till now is stored in prev_loss\n", + " # 'loss' is the test loss of the step being done right now.\n", + " \n", + " if prev_loss > loss:\n", + " prev_loss = loss\n", + " saver.save(sess, './checkpoints/my_model')\n", + " print(\"Model is saved\")\n", "\n", " step += 1\n", "\n", "print(\"Optimization Finished!\")\n", "\n", + "# Restoring the best saved model by passing the directory name to search for.\n", + "\n", + "new_saver = tf.train.import_meta_graph('checkpoints/my_model.meta')\n", + "new_saver.restore(sess, tf.train.latest_checkpoint('./checkpoints/'))\n", + "all_vars = tf.get_collection('vars')\n", + "for v in all_vars:\n", + " v_ = sess.run(v)\n", + " print(v_)\n", + "\n", + "print(\"Model weights are loaded!\")\n", + " \n", "# Accuracy for test data\n", "\n", "one_hot_predictions, accuracy, final_loss = sess.run(\n", @@ -673,20 +514,11 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nvkUxXS3dfoQQQghRDCZNmsSwYcOsvvhBQUE0b94cb29vVqxYwZkzZ8jOzmbw4MFUr17duko9ffp0\nEhISrK47lSpVomHDhqSlpbF//352795NVtaFsTzq1atH9+7dWbVqFUlJSYDR7adTp074+/sDWH8L\nQilFREQEkZGRhIaG4uPjQ3JyMhs2bCArKwutNV988QVdu3bl3nvvtfKNHDmSsWPHWvV29F2vU6cO\nGRkZrFmzJte6unXrxpIlS1BKobVGKUWdOnWIiooiJSWF9evXF7LVC2fatGl4e3tTt25dKlWqxNat\nW23LAwMDqV27NqGhoYSEhHDmzBk2bdrEkSNHANizZw+DBw/m+++/t/Js376drl27kpaWZrVFcHAw\nDRo0IDQ0lK1bt9q6jjlztIGz9PR02rdvz99//20tq127NjVq1CAxMZFt27YBsGnTJrp168bKlSut\nvKNHj7by+Pj4WL8kHT58mL179+a6p0VcouI++7iUCbkKJIQQJYZ85hdcQa/8Z2Vl6Ztuusm6wlq7\ndm195MgRa/nhw4d1hQoVrKuwDRo0sJYNHz7cdlU2MzPTVvaZM2f07NmzrSvUDj179rTVLTk5udDb\nd+7cOb1z5063yzZs2GC7etynTx9rWWpqqg4MDLRd2Xa94puenq6nTp1qvZ4zZ47tF4tSpUrp33//\n3ZYnJSVF//TTT9brorzyr5TSQUFBevHixbY058+f11prvWPHjlxtr7XWmZmZunHjxlZbBwYG6oyM\nDGv5/fffb6vD3XffrVNTU21lLF++XCckJFivHVf+Hfmcr/yPHTvWVt6nn35qK2vUqFG2vP/973+1\n1lrn5OTY8n300Ue5tmXbtm16woQJueYXBeTKvxBCCHF9UqOK7+ZSPUIX27rzsmrVKlJSUqyr/kop\n4uLi3KbVWrNlyxYOHDhAxYoVqVKlirXs2LFjDBkyhJYtW1KzZk2io6MJDg6ma9eul6XegYGBKKX4\n5z//ybJly0hMTLR+oQBsV+gTEi7cNrhgwQLS09OtbW3Xrh2DBg2yle3v788jjzxivf7xxx+t7VdK\n8dprr3HHHXfY8pQtW5bOnTtflm1VSvH0009z11132eZ7e3sDEBkZyeeff85PP/3E9u3bOX78uK1f\nvaMtMjIySExMpFatWmRlZTF//nxrmY+PD5MnTyY8PNy2jhYtWhS4no57LBzt9Ouvv7JkyRJr+YkT\nJ6z6AMybN4/77rsPpRQVK1bkwIEDKKX4+uuvCQgIoFatWkRHR1OpUiViY2NzjVYlLp4E/0IIIUqE\nqzUAL06JiReenam1JiEhwRYsu7Nnzx4qVqxIz549+fDDD9m5cydaa8aNG2fdKOvl5UXDhg3p1asX\nzz33HH5+fkVa7/nz59OtW7dcQa5rVxStNadOnbJeO7bXEaDefrvrI4Vyc24jgJYtW15K1QvFUc9W\nrVq5XX769On/Z+/Ow+ye7/6PP99JJplkkiARBCkRVELt+1JRoqiitlpba7U/FK1W676VqrutWkpL\nq6jirqXRIqiltST2JVFua2pJrCERpMnIns/vj+/smeV8Z86Z9fm4rnOd893fM3K5Xuczn4Xtt9++\npksNND+VavXv4sMPP6zX3WfkyJEMHz68TbVOmzat5n4pJW6//fZGz8sa0anXpejss8/mhBNOAODF\nF1/kxBNPrDk2dOhQdt99d77//e+z+eabt6lGZQz/kiT1UNVBrFpLU29GBJWVlUDWP/yZZ57hd7/7\nHRMmTOD555/ns88+q7nvs88+y7PPPssLL7zAn/70p6LWfeKJJ7Jo0aKaeocPH86mm27KgAEDWLZs\nGbfeemtNq3bdn7Hhz1uI1lzT0JIlS+pt5+3D3lQw//Wvf81LL71U83vo27cv2267LSuvvDIRwZNP\nPsm7775bc371z1KMn6mhuvcsZArX6n8rAMcddxyjR4/mqquuYtKkSfVWrP7444+56aabmDBhAs88\n8wyjR48ubuE9UGeY6lOSJHWAtddeu+ZzRHDyySezdOnSJl9Llixh9913r7mmoqKCH/zgBzz66KPM\nnTuXGTNmcP/997PddtvVnHP99dczd+7ces9pixkzZtRrjd9mm214++23ueuuuxg/fjwXXXRRk9eO\nHDmyXg2PPPJIi8+rvqZaIdc0/EvH7Nmzc9+jrl69Go9rjz32GFAbvKdMmcJDDz3ELbfcwvjx4xk1\nalSj16222mqUl5fXbE+bNq3elJ6tsfbaa9d82erVqxczZ85s9t9Sde3VdthhB6699lqmTZtGZWUl\nL730Er/+9a+B7L/X/Pnzufrqq9tUozKGf0mSeqhtt92WoUOHAlmAvOaaa+r10672wQcfcPnll3P6\n6afX7JsyZQrXXHNNvWC7yiqrsMsuu9QL/1C/i0f//v3rHXvvvfdy1dywFb1fv3414XjRokWcccYZ\nTV775S9/uWZGoZQS9913HxdffHG9VutFixZx44031mzvs88+QG3f+Z///Oc89NBD9e47e/Zs7rzz\nzprtVVddtaamlBKTJk3ijTfeAOC1116rmV2prS3wDX8XdX+3t956K4888kijX7bKysrYY489aroV\nLV26lG984xvMmjWr3nlPPfUUr7zySkG17L333kD2e1q2bBknnnhivdZ9gGXLljFp0iSOPfZYnn/+\n+Zr9l156KU888UTN76O8vJwNNtiAI444ot4XqaZmH1I+dvuRJKmbaqmVvaysjJ/97Gc1i1DNmzeP\nXXbZhY022oi1116bRYsW8cYbb/Dmm2+SUqo3Zebrr7/OcccdxwknnMD666/PWmutRb9+/XjnnXd4\n9tlna8Jt37596/2FYf31169X21577cU222xDWVkZO++8MyeddFKzNY8YMYLhw4czY8YMACZNmsTo\n0aMZNWoUzz33HB988EGTP/ewYcP4wQ9+wHnnnQdkwfz000/n0ksvZcMNN2Tx4sVMmTKF8vJyDjvs\nMCAL/zvttFNNa/1//vMfdt1115rf0ezZs5kyZQr7779/zaDfAQMGsNVWW/HUU08REXzyySeMHj2a\n1VdfvWaa00L++7Rk66235qGHHqq5z+abb84OO+zAzJkzmTx5cpN/MYBses377ruP+fPnA9kiW6NG\njWKTTTZhpZVWYurUqbz22mvce++9y3W1aazub3/721x22WU1f5UZP3489913H5ttthmDBw9m1qxZ\nvPDCC8ybN4+IqOnjD3DFFVdw2mmnMWTIEMaMGcPQoUNZsGABTz/9dM24joio+bejNuro6Yba8sJp\n3ySpx/D/+YXLu8jXueeem/r06dPoAlF1F1zaZ599aq65+eabGz2/4TUXXHBBvWdNmzYtDRgwoNHr\njjzyyIJ+vhtuuKHJWn/5y1/W2zd69Ojlrj/llFOaXBCrV69eyy3yNXv27LTLLrs0e03dRb5SSumf\n//xnKisra/Tck046qd6+pqb6rD6/4XSp1WbOnJnWXHPNRp+x3Xbbpf3226/Z+/zjH/9Iw4YNa/a/\nY2OLfDU21WdKtYt8tfTvonfv3mny5Mk1122wwQYtXjNq1Kg0c+bMZv5VtA49cKpPu/1IktQNNTfr\nS0NnnXUWzz33HCeeeCIbbbQRgwcPpk+fPqy44opsvPHGHH300dx8882MHz++5povfelLXH755Rx6\n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\nbwFNGxMAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ "# (Inline plots: )\n", "%matplotlib inline\n", @@ -730,50 +562,11 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Accuracy: 91.65252447128296%\n", - "\n", - "Precision: 91.76286479743305%\n", - "Recall: 91.65252799457076%\n", - "f1_score: 91.6437546304815%\n", - "\n", - "Confusion Matrix:\n", - "[[466 2 26 0 2 0]\n", - " [ 5 441 25 0 0 0]\n", - " [ 1 0 419 0 0 0]\n", - " [ 1 1 0 396 87 6]\n", - " [ 2 1 0 87 442 0]\n", - " [ 0 0 0 0 0 537]]\n", - "\n", - "Confusion matrix (normalised to % of total test data):\n", - "[[ 15.81269073 0.06786563 0.88225317 0. 0.06786563 0. ]\n", - " [ 0.16966406 14.96437073 0.84832031 0. 0. 0. ]\n", - " [ 0.03393281 0. 14.21784878 0. 0. 0. ]\n", - " [ 0.03393281 0.03393281 0. 13.43739319 2.95215464\n", - " 0.20359688]\n", - " [ 0.06786563 0.03393281 0. 2.95215464 14.99830341 0. ]\n", - " [ 0. 0. 0. 0. 0. 18.22192001]]\n", - "Note: training and testing data is not equally distributed amongst classes, \n", - "so it is normal that more than a 6th of the data is correctly classifier in the last category.\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0UAAANGCAYAAAAyEyUbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XecXFX9//HXOyH0gIL0liAgTUHpYEhAoyKiVAENJPK1\n0UXFH4pAQOwNCwgiVZRiAQsoqJAC0i2gtAhBOlJDb9nP749zJnv3ZmZ2ZnezO5v7fj4e85iZe869\n99wzd2fvZ065igjMzMzMzMyqasRQF8DMzMzMzGwoOSgyMzMzM7NKc1BkZmZmZmaV5qDIzMzMzMwq\nzUGRmZmZmZlVmoMiMzMzMzOrNAdFZmZmZmZWaQ6KzMzMzMwqZIwUGvrHvfXKJulwSRdJukdSV+Gx\nf4P8+0v6k6RHJb0i6QVJd0r6kaSxrdaJfPNWMzMzM7PqkDTkEYCAiNB8y6WngGXqrPKRiDi3lPfb\nwBH5bfmQBDwNbBERd/dWHrcUmZmZmZlZp7gFOAM4CHiMFNzMR9ISwCGkYCiAXwHvAj4KvJCXLZvf\n92qR/pbazMzMzMyGmZFD3DYyt6vu4ogYX3st6agmW1gSGFVbDZgaEbfl9XYHds7LF22lOG4pMjMz\nMzOzYSUingD+Tne3uRMkvVPS/wET8vJXgQta2Z5biszMzMzMqmZk3V5pg2fugGxlN+AsYAdg9/yA\nFBDdBBwRETe2siG3FJmZmZmZ2XD0HPAf4GW6xxbVWo42AT4sqaXuc24pMjMzMzOzBWpaVzCta+Dm\nvJM0EpgBbEgKhI4BvgcsD/wM2A74JClg+nSv2/OU3GZmZmZm1SEpYolRvWdckGV48dW6U3L3yCPN\nBtYiBT09puSWtCPw55z2dEQsX0h7P3BJTnskIlbrrTzuPmdmZmZmZsPNCvlZwGKSilHe6wppy7ay\nMXefMzMzMzOrmkWGeKKFBiRNJE23TeEZ4G2S5uTXM4F/FtKWAC6UdBopWPpSIe2Glvbr7nNmZmZm\nZtUhKWJ0S/MPLLgyPPtK3e5zku4F1uxl9QkRMUPSj4CP11Yt5QnSTVx3iIibeiuPu8+ZmZmZmVmn\n6KLnTHLlx7y7vkbEgcAk4ArgUdJ9iV4CZgGnA29tJSACtxSZmZmZmVWKpIjXLT60ZXj6pV4nWhhM\nbikyMzMzM7NK80QLZmZmZmZVM7JjGmk6gluKzMzMzMys0hwUmZmZmZlZpbn7nJmZmZlZ1Yx020iR\na8PMzMzMzCrNLUVmZmZmZlXjlqIeXBtmZmZmZlZpDorMzMzMzKzS3H3OzMzMzKxqfJ+iHtxSZGZm\nZmZmleaWIjMzMzOzqvFECz24NszMzMzMrNIcFJmZmZmZWaW5+5yZmZmZWdV4ooUe3FJkZmZmZmaV\n5pYiMzMzM7OqWcRtI0WuDTMzMzMzqzQHRWZmZmZmVmnuPmdmZmZmVjWeaKEHtxSZmZmZmVmluaXI\nzMzMzKxqRrptpMi1YWZmZmZmleagyMzMzMzMKs3d58zMzMzMqsbd53pwbZiZmZmZWaW5pcjMzMzM\nrGo8JXcPbikyMzMzM7NKc1BkZmZmZmaV5u5zZmZmZmZV44kWenBtmJmZmZlZpbmlyMzMzMysajzR\nQg9uKTIzMzMzs0pzUGRmZkNG0p6SLpQ0W9Lz+XG3pAsk7S5pSP9PSdpR0nRJcyR1SZorac1B2vf4\nvM8rB2N/VSdpaq7vY4e6LGY2+Nx9zszMBp2k1YFfA5sDXcAtwI359drAnsAHgZuALYewjJcASwLT\ngPtz+Z4bxGJEflgTkrqAiIiR/diM69qqxRMt9OCgyMzMBpWk5YFrgNWBPwMHRsTdpTwrA18A9h38\nEs4zEVgaOCciPjIE+78e2AB4YQj2XUU/AM4HHh/qgpjZ4HNQZGZmg+1UYA1S68tOETG3nCEiHgEO\nk3ThIJetaI38PHsodh4RLwF3DcW+qygingSeHOpymA0aT7TQg9vNzMxs0EhaB9id1E3p4HoBUVFE\nXFNnGytI+rakOyW9KOmpPO5nvwb7PDuPFdlf0psk/UrSY5JekHSzpA+W8k/O3bGm5kW1sSZdks4s\n5qm9r7PP4+qNT5E0IpfjakkPSXpJ0sOSrpN0oqRFC3mbjimSNE7SJZIelfSypAck/VTSRg3yd0ma\nm1/vJ+nGPIbrCUm/kLR2vfUaKdaBpOUknSLp/lyv/5S0TyHv2yVdLulJSc9KulTSm+psc5Fctgvy\n5/tsfvxD0jGSlqxXBtL5pMLnNO9Yc75544UkrS3pvFz/r0k6rJynsN76kp7Ln9Nb65T3vXmdhyWt\n2E79mVlncUuRmZkNpvcBAv4REbe3u7Kk9YCrgFVIY3wuAZYBdgDGSXpXRJSDo9pYkc2Ak4H/An8C\nxpLGK50vaUREXJDz/wc4G9g0P/6RHwBXt1HceuNTzgYmAc/nbT0BrAisB3we+D7wv942LOlQ4KT8\n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\nt0sWkt4maU5+fTXwE+CqOps4Dnh9fn0+cAPwYG/7dVBkZmZmZmad4nRgzdIyAYflB8CEiLi03sqS\njqA7KLoiIs5tZacOiszMzMzMqmaQJ1poQxfNu7210iWu5W5zNQ6KzMzMzMysI0TE2v1cf2xf1nNQ\nZGZmZmZWNSMWiokWBkzHtpuZmZmZmZkNBgdFZmZmZmZWae4+Z2ZmZmZWNQvHfYoGjFuKzMzMzMys\n0txSZGZmZmZWNZ07JfeQcG2YmZmZmVmlOSgyMzMzM7NKc/c5MzMzM7OK6fJ9inpwS5GZmZmZmVWa\nW4rMzMzMzCqmyxMt9OCgyMwG1BfPvXGoizCsnPiVdw11EYalg35y+VAXwczMFiIOEc3MzMzMrNLc\nUmRmZmZmVjGeaKEntxSZmZmZmVmluaXIzMzMzKxi5o5020iRa8PMzMzMzCrNQZGZmZmZmVWau8+Z\nmZmZmVWMJ1royS1FZmZmZmZWaW4pMjMzMzOrmBjhtpEi14aZmZmZmVWagyIzMzMzM6s0d58zMzMz\nM6sYT7TQk1uKzMzMzMys0txSZGZmZmZWMW4p6sktRWZmZmZmVmkOiszMzMzMrNLcfc7MzMzMrGK6\nfJ+iHlwbZmZmZmZWaW4pMjMzMzOrGE+00JNbiszMzMzMrNIcFJmZmZmZWaW5+5yZmZmZWcXMldtG\nilwbZmZmZmZWaW4pMjMzMzOrGE+00JNbiszMzMzMrNIcFJmZmZmZWaW5+5yZmZmZWcW4+1xPbiky\nMzMzM7NKc1BkZmZmZmaV5u5zZmZmZmYVEyPcNlLk2jAzMzMzs0pzUFQiaV9JXflxf530Wwvpvyil\njZb0WiF9o1L6pEJal6QXJb2uQTnOKuS7spcyjy9td81S+gmFtLmSDs7LJxeXl9aZVtrmPk32OVfS\nonXKNVrSYZL+KOkhSS9JelrSXZIul3SEpLHNjq3B8d5b2PexddKL5d6/sHxyKa32eFnSA5J+KWl8\nne0tJukoSTdJeibnfzSfCxdIOrRJvfX22L/O/srb+FmDehhZyvehQtr/NdjfC5JmSTpD0voNtruB\npLMlzc6f2XOS7pN0taSTJW3V+6dkZmZmnaxrhIb00WncfW5+M/JzAKtKGhsRswFyALNhTgMYV1p3\nW1KgGcBTEfHvUvrkwroAiwL7Aj9qUp5oktZrXklfB47MaQF8IiLOaGEfUVp+vKSLIqKrlfJJmgic\nC6xUyjcKGA28EZgIbAF8aL4NNFcuW6M8raYtAqwC7A7sLunQiDgZQNIiwDRgq9K6b8iPjUif+w/a\nKFtDksaQzqvaNgTsKml0RDzb4vE0S1sMWJtU/3tK2joibi/sf1vgT8AS9PzMVsuPbYFHgetbPCQz\nMzOzjuegqCQiHpQ0GxhLuijcHpidk7cjXaRGfl5B0roRMSunb1/Y1DXF7UpaHdihuCg/T6F5UNSO\nWtlq+/wucHh+2wUcEBE/7W29OssFrAN8BCgHVPOtK+ntwG9JQV8AT5KO8TrgeVKgtBWwZ+uH1nKZ\n21n37fn1GsBUYL38/puSLoyIx4EP57IG8BRwLHA76W9nfWBnUt3UHAIsW3j/XuAL+XVxnzV3lco2\npc6xLQ7sA5ze7oHmbb0GjCd9HlsCXyEF70sDB+cy13wj7y+Aq0if2+PAcqQAdo8+lMHMzMysozko\nqm8mKSiC9Kv9OYXXALNIF9KL52WzSum1bRRNprsV6WLgHaSL580lrR8Rdwxg+UdIOgX4ZH7/GrBf\nRFzYx+3VAqNjJZ0bEa82yihJwGmkC3ABDwDbRMSDpawXSTqS1NIyJCLi2tprSY8CtW6Ki5FaRH5L\nCiJqzo6IUwrv/wT8QNJShW32aB2UtG6jfTawX3F/pEAU0vnTl6CovN/pknYE3k36XNcsZd2c7qDs\nkNJ5eTHwheLxmpmZ2fDU5YkWenBt1Dej8Hpc6XUAfwFuIF08jgPIY2q2KOQtB0XFi90zgF8W3k/p\nX3HnqbUunEx3QPQKsHc/AiJILTwAqwMH9ZJ3C2CDQnmOrhMQpcSIroi4tR/lGkhP5+daHdbGSM0p\n5NlH0hRJaxRXjIjnB6IAkranOxh/iNTK9zzpPNtG0jqN1u2HB0rvn6G7Dr4pacdyEDRQx2tmZmbW\nKRwU1VcLaASsI2klSYsDmxXSa4FTLWjaitTCAPAicHNtY3mcxnr57ePA5UBx8Pyk3MIyUHbKzy8D\ne0bExf3c3nTgClJ9fF7Skk3y1uqodjyX1xIkLSVpuzqPxebfzODJXRu/VHubn/+Rny8rLF8VOBP4\nb55o4deSPixp5AAVpdYqFMDPI+I54DeF9Cl93XCu5wm5de6deR8vA6eWsl5KOlaRugb+GZgj6V+S\nvi9pk76WwczMzDpHlzSkj07joKiOPEbo0cKicaSgp9Z6UAyKxkpahe7gKIDrI+K1wvpTCmkX5BaS\naaRf6UUa5P+uAT4MgIcpBGf9dHR+XgH4VJN8ry+9f7zwen1S3RUfM4C1BqiMrQpST78uSV3AfaQA\noJZ2dkT8ByAirgaOIrW4ReGxArAr8FPgatWZfa8dkpag53id80rP0LO1sVVB6iY7k9Q98Oukv/sb\ngB0i4pZS/s8AV9PzWEeQJhg5BPhbcbY9MzMzs4WBxxQ1NpPuiQDGAY/l1/fmyRieIo3VGUmaYKHu\neKLcwrRXIe3nhdfnk2aGgxQ4Xc7A6CJdyI4BZkjaISLK3aTaEhE3S7qEFAh8FritQdanS++Xp7vu\noOcEAn39maA4A15v2yjPlldUnqjhMeCHwFd7ZIr4Rp4We2/SZ701KSiq2ZIUKH6jl7I0sxdp4oMA\nbit0K/wz8D9gRWB1Se+IiL+0ue3ycYo0lmu1+TJGPAlsrzQ1+S6ksVVvpfsHAQHfkPSLiHik3s5m\nvDZ13uu1RkxgrRET2iyumZnZwu1epnEv04a6GFbgoKixGXQHRePpbjmaCRARL0j6G2kMzQTSxSPF\nPNnupAkVapMVXFunp5yAD0haNiLmlBPbUBsg/0nge6Rpld8ITJO0Y0Tc149tAxwDvJ90PEc2yFNr\nmapdiE8kB4IRcTMwUtJadM/o1xfFqanfUEyQtEIpb736LM8+9yrwWETc22iHeVzUd/KDfK+en5Gm\ntw66p+zuq8mF1xvlFqx6ppDGtLVKwGsRsaikN5DKP4kUgJ0naZPC7InzRMR0UrdJcnfJjwIn5eRF\nSYHSH+rtcPtFprZRPDMzs+oZwwTGMGHe++kcP+hl6MR7BQ0ld59rrBjYbEyajjtKy2eSLjo/TLr3\nDsBcoDjDWPHmnNHgAWk80t4DVPYrSL/y1wbEr00KjNq+UWpRnlntfPLAf+pPiX0Dacrq2riUEyWt\nVCdffxRneJsoqXge75Kfa3/pjVq0iIhrI+KvEXFjo4BI0laSVq6z7vWkeq7p899SnrhhAt312eg8\nEbCbpKX7sp88xfjHgP/m7S1GqVVM0vvKY6Qi4gXSfZheLpTR3x1mZma20HBLUWO3kFoZliFdjC7J\n/EHRDNIYjKXovlj8e76IRNKqdA9qB/g883cvm0C6Bw2kVoAf1ynL2pK+Wmf5vyPivDrLiYgrJe0M\n/J7UKjCG7haju+ut06LjSMFb3ckFIiIkHUQKGEbl/f5d0snAjaRWmS3rrduGn5FueivSBBbXS/oj\nqYtZMQi9vp/HCvA+4HOSriB1ZbuDdAxvpecYn7/2Yx9T6G69+jepC1/ZF0mz/y0BfJA04UPbIuLl\nfC7VJljYVdLGEfGv/P4nQJeki0nH9BDp/N6P7olEXiV9lmZmZjZMeUrunhwUNZAv7q8h3Xyz5rGI\nKN5sszYgvdYqUQ6aavcmArgjIuYbcyLpalJQJGArSeuV9iHSvWT+X51iXkLPgfjlY5ghaSfSjGLL\nkO6tND0HRuWbhrYkIu6RdCbw8SZ5pkvalXR/p+VJN2v9Ujlbfu4ijc1qpwyXSToV+ERetBnds97V\nWlUeAw5oZ7tNLEI6D3YuLa/t63b6dwPeYiB3VkTMFxhLWp80bkmkIKoYFLV7I9uzSF0hVyOdn8eS\nAi3ydlYCDsyPsgC+HBH/a2N/ZmZmZh3NIWJzM+jZfanHvYci4ingX6U8Vxey7F9YXrwvUXEbt5Fa\nH2oXtVOKyS086uUtbv8a4D2kVq8gzXR3laQ3NVuvkFbPCaRpxxuuGxF/ANYlBXPTSUHKq8ALwD2k\nQO1zwBsj4p4G+2koIg4ijfn6A2m816uk7oL/Ar4FbNrghrjNjreeU0jB14XAraRJD14l3c/nb8BU\nYOs8fXbD4jbap6Tt6B6XFMCvG2zj14U820pau7Ttlvebb777jULa7jnogjQG7njSuKX/5ON8FXiE\n9JntGhEnNDlWMzMzs2FHEe38wGxm1pikOHrRZhP+WdmJU9891EUYlg76yUBN1lkdK97jQdVmnep4\nREQM2h+ppLht1rGDtbu6Nlz3hEE95t64+5x1hDzZwJq9ZLsvIu4fjPKYmZmZ2eCTdDhpgrPNSWPT\na6ZExLmFfKNIQ1UmkMZ6r0Sa+OwJ4DrgpIiYQYscFFmnOIA0iUMzU0ld98zMzMysHzp4ooWppLHw\n0Hy4w3KkCcrKeVYi3VdzV0kfi4gzWtlpx9aGVVKr46fMzMzMbOF0C3AGcBBpTHqzLnZBGrt+EOne\nmAfndWrXjd+RtHgrO3VLkXWEiDgehuDOZWZmZmbWMSJifO21pKOaZH0eGB8RxUnOrpT0KPCr/H5p\n0v1Gb+ptvw6KzMzMzMwqJtQxcxz0SZ759+o6SXeW3jebIXged58zMzMzM7OFxT6F13c1uEXLfNxS\nZGZmZmZWMV0jhndLUT2S9gE+n9++Anys1XUdFJmZmZmZ2QJ147Wzuem62Qts+5KOAL5FmpjhJeCD\npfFGTTkoMjMzMzOzBWqLbcayxTZj570/9XvTBmzbkr4DfIo069zTwK7t3KMIHBSZmZmZmVVOl4b/\n1AKSFgXOA/YkBUT3ATu1Oo6oyEGRmZmZmZl1BEkTgSXz2yULSW+TNCe/ngm8AFwOjKO7hehIYHlJ\n2xXWuysiHuttvw6KzMzMzMwqpoMnWjgdWLO0TMBh+QEwAfgvKSCqpb8euKjO9qYA5/a2UwdFZmZm\nZmbWKbpILT+NRIPXveVtykGRmZmZmZl1hIhYu43sIwdqvw6KzMzMzMwqpksd231uSAz/aSfMzMzM\nzMz6wS1FZmZmZmYVM3eE20aKXBtmZmZmZlZpDorMzMzMzKzS3H3OzMzMzKxiPNFCT24pMjMzMzOz\nSnNLkZmZmZlZxbilqCe3FJmZmZmZWaU5KDIzMzMzs0pz9zkzMzMzs4oJ36eoB9eGmZmZmZlVmluK\nzMzMzMwqxhMt9OSWIjMzMzMzqzQHRWZmZmZmVmnuPmdmZmZmVjHuPteTW4rMzMzMzKzS3FJkZgNq\nkVf8y1M7pn7hiqEuwrB0yrl7D3URhp2p+1841EUwsw7ilqKe3FJkZmZmZmaV5qDIzMzMzMwqzd3n\nzMzMzMwqpktuGylybZiZmZmZWaW5pcjMzMzMrGI80UJPbikyMzMzM7NKc1BkZmZmZmaV5u5zZmZm\nZmYVM3eEu88VuaXIzMzMzMwqzS1FZmZmZmYV4ym5e3JtmJmZmZlZpTkoMjMzMzOzSnP3OTMzMzOz\nignfp6gHtxSZmZmZmVmlOSgyMzMzM7NKc/c5MzMzM7OK6cLd54rcUmRmZmZmZpXmliIzMzMzs4rp\n8kQLPbilyMzMzMzMKs1BkZmZmZmZVZq7z5mZmZmZVUyX3DZS5NowMzMzM7NKc0uRmZmZmVnFeKKF\nntxSZGZmZmZmleagyMzMzMzMKs3d58zMzMzMKmauu8/14JYiMzMzMzOrNLcUmZmZmZlVjCda6Mkt\nRWZmZmZmVmkOiszMzMzMrNLcfc7MzMzMrGK63DbSw5DWhqR9JXXlx/110m8tpP+ilDZa0muF9I1K\n6ZMKaV2SXpT0ugblOKuQ78peyjy+tN01S+knFNLmSjo4L59cXF5aZ1ppm/s02edcSYvWKddoSYdJ\n+qOkhyS9JOlpSXdJulzSEZLGNju2Bsd7b6lsr0iaI+k/ki6TdKikZXrZxlsknSbpdknP5M/iv5J+\n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\ntf8HGEwmAny82PIAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ "# Results\n", "\n", @@ -820,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": true }, @@ -837,86 +630,50 @@ "\n", "Outstandingly, **the final accuracy is of 91%**! And it can peak to values such as 92.73%, at some moments of luck during the training, depending on how the neural network's weights got initialized at the start of the training, randomly. \n", "\n", - "This means that the neural networks is almost always able to correctly identify the movement type! Remember, the phone is attached on the waist and each series to classify has just a 128 sample window of two internal sensors (a.k.a. 2.56 seconds at 50 FPS), so it amazes me how those predictions are extremely accurate given this small window of context and raw data. I've validated and re-validated that there is no important bug, and the community used and tried this code a lot. (Note: be sure to report something in the issue tab if you find bugs, otherwise [Quora](https://www.quora.com/), [StackOverflow](https://stackoverflow.com/questions/tagged/tensorflow?sort=votes&pageSize=50), and other [StackExchange](https://stackexchange.com/sites#science) sites are the places for asking questions.)\n", + "This means that the neural networks is almost always able to correctly identify the movement type! Remember, the phone is attached on the waist and each series to classify has just a 128 sample window of two internal sensors (a.k.a. 2.56 seconds at 50 FPS), so those predictions are extremely accurate.\n", "\n", - "I specially did not expect such good results for guessing between the labels \"SITTING\" and \"STANDING\". Those are seemingly almost the same thing from the point of view of a device placed at waist level according to how the dataset was originally gathered. Thought, it is still possible to see a little cluster on the matrix between those classes, which drifts away just a bit from the identity. This is great.\n", + "I specially did not expect such good results for guessing between \"SITTING\" and \"STANDING\". Those are seemingly almost the same thing from the point of view of a device placed at waist level according to how the dataset was gathered. Thought, it is still possible to see a little cluster on the matrix between those classes, which drifts away from the identity. This is great.\n", "\n", "It is also possible to see that there was a slight difficulty in doing the difference between \"WALKING\", \"WALKING_UPSTAIRS\" and \"WALKING_DOWNSTAIRS\". Obviously, those activities are quite similar in terms of movements. \n", "\n", - "I also tried my code without the gyroscope, using only the 3D accelerometer's 6 features (and not changing the training hyperparameters), and got an accuracy of 87%. In general, gyroscopes consumes more power than accelerometers, so it is preferable to turn them off. \n", + "I also tried my code without the gyroscope, using only the two 3D accelerometer's features (and not changing the training hyperparameters), and got an accuracy of 87%. In general, gyroscopes consumes more power than accelerometers, so it is preferable to turn them off. \n", "\n", "\n", "## Improvements\n", "\n", - "In [another open-source repository of mine](https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs), the accuracy is pushed up to nearly 94% using a special deep LSTM architecture which combines the concepts of bidirectional RNNs, residual connections, and stacked cells. This architecture is also tested on another similar activity dataset. It resembles the nice architecture used in \"[Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation](https://arxiv.org/pdf/1609.08144.pdf)\", without an attention mechanism, and with just the encoder part - as a \"many to one\" architecture instead of a \"many to many\" to be adapted to the Human Activity Recognition (HAR) problem. I also worked more on the problem and came up with the [LARNN](https://github.com/guillaume-chevalier/Linear-Attention-Recurrent-Neural-Network), however it's complicated for just a little gain. Thus the current, original activity recognition project is simply better to use for its outstanding simplicity. \n", + "In [another open-source repository of mine](https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs), the accuracy is pushed up to 94% using a special deep LSTM architecture which combines the concepts of bidirectional RNNs, residual connections and stacked cells. This architecture is also tested on another similar activity dataset. It resembles to the architecture used in \"[Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation](https://arxiv.org/pdf/1609.08144.pdf)\" without an attention mechanism and with just the encoder part - still as a \"many to one\" architecture which is adapted to the Human Activity Recognition (HAR) problem.\n", "\n", - "If you want to learn more about deep learning, I have also built a list of the learning ressources for deep learning which have revealed to be the most useful to me [here](https://github.com/guillaume-chevalier/Awesome-Deep-Learning-Resources). \n", + "If you want to learn more about deep learning, I have also built a list of the learning ressources for deep learning which have revealed to be the most useful to me [here](https://github.com/guillaume-chevalier/awesome-deep-learning-resources). You could as well learn to [learn to learn by gradient descent by gradient descent](https://arxiv.org/pdf/1606.04474.pdf) (not for the faint of heart). Ok, I pushed the joke deep enough... \n", "\n", "\n", "## References\n", "\n", - "The [dataset](https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones) can be found on the UCI Machine Learning Repository: \n", + "The [dataset](https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones) can be found on the UCI Machine Learning Repository. \n", "\n", "> Davide Anguita, Alessandro Ghio, Luca Oneto, Xavier Parra and Jorge L. Reyes-Ortiz. A Public Domain Dataset for Human Activity Recognition Using Smartphones. 21th European Symposium on Artificial Neural Networks, Computational Intelligence and Machine Learning, ESANN 2013. Bruges, Belgium 24-26 April 2013.\n", "\n", - "The RNN image for \"many-to-one\" is taken from Karpathy's post: \n", - "\n", - "> Andrej Karpathy, The Unreasonable Effectiveness of Recurrent Neural Networks, 2015, \n", - "> http://karpathy.github.io/2015/05/21/rnn-effectiveness/\n", - "\n", - "## Citation\n", - "\n", - "Copyright (c) 2016 Guillaume Chevalier. To cite my code, you can point to the URL of the GitHub repository, for example: \n", - "\n", - "> Guillaume Chevalier, LSTMs for Human Activity Recognition, 2016, \n", + "To cite my work, point to the URL of the GitHub repository: \n", + "> Guillaume Chevalier, LSTMs for Human Activity Recognition, 2016\n", "> https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition\n", "\n", - "My code is available for free and even for private usage for anyone under the [MIT License](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/blob/master/LICENSE), however I ask to cite for using the code. \n", + "My code is available under the [MIT License](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/blob/master/LICENSE). \n", "\n", - "## Extra links\n", + "## Connect with me\n", "\n", - "### Connect with me\n", - "\n", - "- [LinkedIn](https://ca.linkedin.com/in/chevalierg)\n", - "- [Twitter](https://twitter.com/guillaume_che)\n", - "- [GitHub](https://github.com/guillaume-chevalier/)\n", - "- [Quora](https://www.quora.com/profile/Guillaume-Chevalier-2)\n", - "- [YouTube](https://www.youtube.com/c/GuillaumeChevalier)\n", - "- [Dev/Consulting](http://www.neuraxio.com/en/)\n", - "\n", - "### Liked this project? Did it help you? Leave a [star](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/stargazers), [fork](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/network/members) and share the love!\n", - "\n", - "This activity recognition project has been seen in:\n", - "\n", - "- [Hacker News 1st page](https://news.ycombinator.com/item?id=13049143)\n", - "- [Awesome TensorFlow](https://github.com/jtoy/awesome-tensorflow#tutorials)\n", - "- [TensorFlow World](https://github.com/astorfi/TensorFlow-World#some-useful-tutorials)\n", - "- And more.\n", - "\n", - "---\n" + "- https://ca.linkedin.com/in/chevalierg \n", + "- https://twitter.com/guillaume_che\n", + "- https://github.com/guillaume-chevalier/\n" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { - "scrolled": true + "collapsed": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NbConvertApp] Converting notebook LSTM.ipynb to markdown\n", - "[NbConvertApp] Support files will be in LSTM_files/\n", - "[NbConvertApp] Making directory LSTM_files\n", - "[NbConvertApp] Making directory LSTM_files\n", - "[NbConvertApp] Writing 38654 bytes to LSTM.md\n" - ] - } - ], + "outputs": [], "source": [ - "# Let's convert this notebook to a README automatically for the GitHub project's title page:\n", + "# Let's convert this notebook to a README for the GitHub project's title page:\n", "!jupyter nbconvert --to markdown LSTM.ipynb\n", "!mv LSTM.md README.md" ] @@ -939,7 +696,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.6.3" } }, "nbformat": 4, diff --git a/README.md b/README.md index efa6a17..a3045ce 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# LSTMs for Human Activity Recognition +# LSTMs for Human Activity Recognition -Human Activity Recognition (HAR) using smartphones dataset and an LSTM RNN. Classifying the type of movement amongst six categories: +Human activity recognition using smartphones dataset and an LSTM RNN. Classifying the type of movement amongst six categories: - WALKING, - WALKING_UPSTAIRS, - WALKING_DOWNSTAIRS, @@ -9,9 +9,7 @@ Human Activity Recognition (HAR) using smartphones dataset and an LSTM RNN. Clas - STANDING, - LAYING. -Compared to a classical approach, using a Recurrent Neural Networks (RNN) with Long Short-Term Memory cells (LSTMs) require no or almost no feature engineering. Data can be fed directly into the neural network who acts like a black box, modeling the problem correctly. [Other research](https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%20HAR%20Dataset.names) on the activity recognition dataset can use a big amount of feature engineering, which is rather a signal processing approach combined with classical data science techniques. The approach here is rather very simple in terms of how much was the data preprocessed. - -Let's use Google's neat Deep Learning library, TensorFlow, demonstrating the usage of an LSTM, a type of Artificial Neural Network that can process sequential data / time series. +Compared to a classical approach, using a Recurrent Neural Networks (RNN) with Long Short-Term Memory cells (LSTMs) require no or almost no feature engineering. Data can be fed directly into the neural network who acts like a black box, modeling the problem correctly. Other research on the activity recognition dataset used mostly use a big amount of feature engineering, which is rather a signal processing approach combined with classical data science techniques. The approach here is rather very simple in terms of how much did the data was preprocessed. ## Video dataset overview @@ -19,34 +17,31 @@ Follow this link to see a video of the 6 activities recorded in the experiment w

Video of the experiment

[Watch video]

-## Details about the input data +## Details about input data I will be using an LSTM on the data to learn (as a cellphone attached on the waist) to recognise the type of activity that the user is doing. The dataset's description goes like this: -> The sensor signals (accelerometer and gyroscope) were pre-processed by applying noise filters and then sampled in fixed-width sliding windows of 2.56 sec and 50% overlap (128 readings/window). The sensor acceleration signal, which has gravitational and body motion components, was separated using a Butterworth low-pass filter into body acceleration and gravity. The gravitational force is assumed to have only low frequency components, therefore a filter with 0.3 Hz cutoff frequency was used. +> The sensor signals (accelerometer and gyroscope) were pre-processed by applying noise filters and then sampled in fixed-width sliding windows of 2.56 sec and 50% overlap (128 readings/window). The sensor acceleration signal, which has gravitational and body motion components, was separated using a Butterworth low-pass filter into body acceleration and gravity. The gravitational force is assumed to have only low frequency components, therefore a filter with 0.3 Hz cutoff frequency was used. -That said, I will use the almost raw data: only the gravity effect has been filtered out of the accelerometer as a preprocessing step for another 3D feature as an input to help learning. If you'd ever want to extract the gravity by yourself, you could fork my code on using a [Butterworth Low-Pass Filter (LPF) in Python](https://github.com/guillaume-chevalier/filtering-stft-and-laplace-transform) and edit it to have the right cutoff frequency of 0.3 Hz which is a good frequency for activity recognition from body sensors. +That said, I will use the almost raw data: only the gravity effect has been filtered out of the accelerometer as a preprocessing step for another 3D feature as an input to help learning. ## What is an RNN? -As explained in [this article](http://karpathy.github.io/2015/05/21/rnn-effectiveness/), an RNN takes many input vectors to process them and output other vectors. It can be roughly pictured like in the image below, imagining each rectangle has a vectorial depth and other special hidden quirks in the image below. **In our case, the "many to one" architecture is used**: we accept time series of [feature vectors](https://www.quora.com/What-do-samples-features-time-steps-mean-in-LSTM/answer/Guillaume-Chevalier-2) (one vector per [time step](https://www.quora.com/What-do-samples-features-time-steps-mean-in-LSTM/answer/Guillaume-Chevalier-2)) to convert them to a probability vector at the output for classification. Note that a "one to one" architecture would be a standard feedforward neural network. - -> -> http://karpathy.github.io/2015/05/21/rnn-effectiveness/ +As explained in [this article](http://karpathy.github.io/2015/05/21/rnn-effectiveness/), an RNN takes many input vectors to process them and output other vectors. It can be roughly pictured like in the image below, imagining each rectangle has a vectorial depth and other special hidden quirks in the image below. **In our case, the "many to one" architecture is used**: we accept time series of feature vectors (one vector per time step) to convert them to a probability vector at the output for classification. Note that a "one to one" architecture would be a standard feedforward neural network. -## What is an LSTM? + -An LSTM is an improved RNN. It is more complex, but easier to train, avoiding what is called the vanishing gradient problem. I recommend [this article](http://colah.github.io/posts/2015-08-Understanding-LSTMs/) for you to learn more on LSTMs. +An LSTM is an improved RNN. It is more complex, but easier to train, avoiding what is called the vanishing gradient problem. -## Results +## Results -Scroll on! Nice visuals awaits. +Scroll on! Nice visuals awaits. ```python @@ -80,17 +75,17 @@ INPUT_SIGNAL_TYPES = [ # Output classes to learn how to classify LABELS = [ - "WALKING", - "WALKING_UPSTAIRS", - "WALKING_DOWNSTAIRS", - "SITTING", - "STANDING", + "WALKING", + "WALKING_UPSTAIRS", + "WALKING_DOWNSTAIRS", + "SITTING", + "STANDING", "LAYING" -] +] ``` -## Let's start by downloading the data: +## Let's start by downloading the data: ```python @@ -118,7 +113,7 @@ print("\n" + "Dataset is now located at: " + DATASET_PATH) LICENSE LSTM.ipynb lstm.py screenlog.0 /home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data download_dataset.py source.txt - + Downloading... --2017-05-24 01:49:53-- https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%20HAR%20Dataset.zip Resolving archive.ics.uci.edu (archive.ics.uci.edu)... 128.195.10.249 @@ -126,13 +121,13 @@ print("\n" + "Dataset is now located at: " + DATASET_PATH) HTTP request sent, awaiting response... 200 OK Length: 60999314 (58M) [application/zip] Saving to: ‘UCI HAR Dataset.zip’ - + 100%[======================================>] 60,999,314 1.69MB/s in 38s - + 2017-05-24 01:50:31 (1.55 MB/s) - ‘UCI HAR Dataset.zip’ saved [60999314/60999314] - + Downloading done. - + Extracting... Extracting successfully done to /home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data/UCI HAR Dataset. /home/ubuntu/pynb/LSTM-Human-Activity-Recognition/data @@ -140,7 +135,7 @@ print("\n" + "Dataset is now located at: " + DATASET_PATH) /home/ubuntu/pynb/LSTM-Human-Activity-Recognition data LSTM_files LSTM_OLD.ipynb README.md LICENSE LSTM.ipynb lstm.py screenlog.0 - + Dataset is now located at: data/UCI HAR Dataset/ @@ -156,7 +151,7 @@ TEST = "test/" def load_X(X_signals_paths): X_signals = [] - + for signal_type_path in X_signals_paths: file = open(signal_type_path, 'r') # Read dataset from disk, dealing with text files' syntax @@ -166,7 +161,7 @@ def load_X(X_signals_paths): ]] ) file.close() - + return np.transpose(np.array(X_signals), (1, 2, 0)) X_train_signals_paths = [ @@ -188,12 +183,12 @@ def load_y(y_path): y_ = np.array( [elem for elem in [ row.replace(' ', ' ').strip().split(' ') for row in file - ]], + ]], dtype=np.int32 ) file.close() - - # Substract 1 to each output class for friendly 0-based indexing + + # Substract 1 to each output class for friendly 0-based indexing return y_ - 1 y_train_path = DATASET_PATH + TRAIN + "y_train.txt" @@ -206,13 +201,13 @@ y_test = load_y(y_test_path) ## Additionnal Parameters: -Here are some core parameter definitions for the training. +Here are some core parameter definitions for the training. -For example, the whole neural network's structure could be summarised by enumerating those parameters and the fact that two LSTM are used one on top of another (stacked) output-to-input as hidden layers through time steps. +The whole neural network's structure could be summarised by enumerating those parameters and the fact an LSTM is used. ```python -# Input Data +# Input Data training_data_count = len(X_train) # 7352 training series (with 50% overlap between each serie) test_data_count = len(X_test) # 2947 testing series @@ -226,7 +221,7 @@ n_hidden = 32 # Hidden layer num of features n_classes = 6 # Total classes (should go up, or should go down) -# Training +# Training learning_rate = 0.0025 lambda_loss_amount = 0.0015 @@ -255,23 +250,23 @@ print("The dataset is therefore properly normalised, as expected, but not yet on ```python def LSTM_RNN(_X, _weights, _biases): - # Function returns a tensorflow LSTM (RNN) artificial neural network from given parameters. - # Moreover, two LSTM cells are stacked which adds deepness to the neural network. - # Note, some code of this notebook is inspired from an slightly different - # RNN architecture used on another dataset, some of the credits goes to + # Function returns a tensorflow LSTM (RNN) artificial neural network from given parameters. + # Moreover, two LSTM cells are stacked which adds deepness to the neural network. + # Note, some code of this notebook is inspired from an slightly different + # RNN architecture used on another dataset, some of the credits goes to # "aymericdamien" under the MIT license. # (NOTE: This step could be greatly optimised by shaping the dataset once # input shape: (batch_size, n_steps, n_input) _X = tf.transpose(_X, [1, 0, 2]) # permute n_steps and batch_size # Reshape to prepare input to hidden activation - _X = tf.reshape(_X, [-1, n_input]) + _X = tf.reshape(_X, [-1, n_input]) # new shape: (n_steps*batch_size, n_input) - - # ReLU activation, thanks to Yu Zhao for adding this improvement here: + + # Linear activation _X = tf.nn.relu(tf.matmul(_X, _weights['hidden']) + _biases['hidden']) # Split data because rnn cell needs a list of inputs for the RNN inner loop - _X = tf.split(_X, n_steps, 0) + _X = tf.split(_X, n_steps, 0) # new shape: n_steps * (batch_size, n_hidden) # Define two stacked LSTM cells (two recurrent layers deep) with tensorflow @@ -281,17 +276,17 @@ def LSTM_RNN(_X, _weights, _biases): # Get LSTM cell output outputs, states = tf.contrib.rnn.static_rnn(lstm_cells, _X, dtype=tf.float32) - # Get last time step's output feature for a "many-to-one" style classifier, + # Get last time step's output feature for a "many to one" style classifier, # as in the image describing RNNs at the top of this page lstm_last_output = outputs[-1] - + # Linear activation return tf.matmul(lstm_last_output, _weights['out']) + _biases['out'] def extract_batch_size(_train, step, batch_size): - # Function to fetch a "batch_size" amount of data from "(X|y)_train" data. - + # Function to fetch a "batch_size" amount of data from "(X|y)_train" data. + shape = list(_train.shape) shape[0] = batch_size batch_s = np.empty(shape) @@ -299,19 +294,18 @@ def extract_batch_size(_train, step, batch_size): for i in range(batch_size): # Loop index index = ((step-1)*batch_size + i) % len(_train) - batch_s[i] = _train[index] + batch_s[i] = _train[index] return batch_s -def one_hot(y_, n_classes=n_classes): - # Function to encode neural one-hot output labels from number indexes - # e.g.: - # one_hot(y_=[[5], [0], [3]], n_classes=6): - # return [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]] - +def one_hot(y_): + # Function to encode output labels from number indexes + # e.g.: [[5], [0], [3]] --> [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]] + y_ = y_.reshape(len(y_)) - return np.eye(n_classes)[np.array(y_, dtype=np.int32)] # Returns FLOATS + n_values = int(np.max(y_)) + 1 + return np.eye(n_values)[np.array(y_, dtype=np.int32)] # Returns FLOATS ``` @@ -373,24 +367,24 @@ while step * batch_size <= training_iters: _, loss, acc = sess.run( [optimizer, cost, accuracy], feed_dict={ - x: batch_xs, + x: batch_xs, y: batch_ys } ) train_losses.append(loss) train_accuracies.append(acc) - - # Evaluate network only at some steps for faster training: + + # Evaluate network only at some steps for faster training: if (step*batch_size % display_iter == 0) or (step == 1) or (step * batch_size > training_iters): - + # To not spam console, show training accuracy/loss in this "if" print("Training iter #" + str(step*batch_size) + \ ": Batch Loss = " + "{:.6f}".format(loss) + \ ", Accuracy = {}".format(acc)) - + # Evaluation on the test set (no learning made here - just evaluation for diagnosis) loss, acc = sess.run( - [cost, accuracy], + [cost, accuracy], feed_dict={ x: X_test, y: one_hot(y_test) @@ -620,7 +614,7 @@ plt.show() ``` -![LSTM Training Testing Comparison Curve](LSTM_files/LSTM_16_0.png) +![png](LSTM_files/LSTM_16_0.png) ## And finally, the multi-class confusion matrix and metrics! @@ -650,13 +644,13 @@ print(normalised_confusion_matrix) print("Note: training and testing data is not equally distributed amongst classes, ") print("so it is normal that more than a 6th of the data is correctly classifier in the last category.") -# Plot Results: +# Plot Results: width = 12 height = 12 plt.figure(figsize=(width, height)) plt.imshow( - normalised_confusion_matrix, - interpolation='nearest', + normalised_confusion_matrix, + interpolation='nearest', cmap=plt.cm.rainbow ) plt.title("Confusion matrix \n(normalised to % of total test data)") @@ -671,11 +665,11 @@ plt.show() ``` Testing Accuracy: 91.65252447128296% - + Precision: 91.76286479743305% Recall: 91.65252799457076% f1_score: 91.6437546304815% - + Confusion Matrix: [[466 2 26 0 2 0] [ 5 441 25 0 0 0] @@ -683,7 +677,7 @@ plt.show() [ 1 1 0 396 87 6] [ 2 1 0 87 442 0] [ 0 0 0 0 0 537]] - + Confusion matrix (normalised to % of total test data): [[ 15.81269073 0.06786563 0.88225317 0. 0.06786563 0. ] [ 0.16966406 14.96437073 0.84832031 0. 0. 0. ] @@ -692,12 +686,12 @@ plt.show() 0.20359688] [ 0.06786563 0.03393281 0. 2.95215464 14.99830341 0. ] [ 0. 0. 0. 0. 0. 18.22192001]] - Note: training and testing data is not equally distributed amongst classes, + Note: training and testing data is not equally distributed amongst classes, so it is normal that more than a 6th of the data is correctly classifier in the last category. -![Confusion Matrix](LSTM_files/LSTM_18_1.png) +![png](LSTM_files/LSTM_18_1.png) @@ -707,76 +701,51 @@ sess.close() ## Conclusion -Outstandingly, **the final accuracy is of 91%**! And it can peak to values such as 92.73%, at some moments of luck during the training, depending on how the neural network's weights got initialized at the start of the training, randomly. +Outstandingly, **the final accuracy is of 91%**! And it can peak to values such as 92.73%, at some moments of luck during the training, depending on how the neural network's weights got initialized at the start of the training, randomly. -This means that the neural networks is almost always able to correctly identify the movement type! Remember, the phone is attached on the waist and each series to classify has just a 128 sample window of two internal sensors (a.k.a. 2.56 seconds at 50 FPS), so it amazes me how those predictions are extremely accurate given this small window of context and raw data. I've validated and re-validated that there is no important bug, and the community used and tried this code a lot. (Note: be sure to report something in the issue tab if you find bugs, otherwise [Quora](https://www.quora.com/), [StackOverflow](https://stackoverflow.com/questions/tagged/tensorflow?sort=votes&pageSize=50), and other [StackExchange](https://stackexchange.com/sites#science) sites are the places for asking questions.) +This means that the neural networks is almost always able to correctly identify the movement type! Remember, the phone is attached on the waist and each series to classify has just a 128 sample window of two internal sensors (a.k.a. 2.56 seconds at 50 FPS), so those predictions are extremely accurate. -I specially did not expect such good results for guessing between the labels "SITTING" and "STANDING". Those are seemingly almost the same thing from the point of view of a device placed at waist level according to how the dataset was originally gathered. Thought, it is still possible to see a little cluster on the matrix between those classes, which drifts away just a bit from the identity. This is great. +I specially did not expect such good results for guessing between "SITTING" and "STANDING". Those are seemingly almost the same thing from the point of view of a device placed at waist level according to how the dataset was gathered. Thought, it is still possible to see a little cluster on the matrix between those classes, which drifts away from the identity. This is great. -It is also possible to see that there was a slight difficulty in doing the difference between "WALKING", "WALKING_UPSTAIRS" and "WALKING_DOWNSTAIRS". Obviously, those activities are quite similar in terms of movements. +It is also possible to see that there was a slight difficulty in doing the difference between "WALKING", "WALKING_UPSTAIRS" and "WALKING_DOWNSTAIRS". Obviously, those activities are quite similar in terms of movements. -I also tried my code without the gyroscope, using only the 3D accelerometer's 6 features (and not changing the training hyperparameters), and got an accuracy of 87%. In general, gyroscopes consumes more power than accelerometers, so it is preferable to turn them off. +I also tried my code without the gyroscope, using only the two 3D accelerometer's features (and not changing the training hyperparameters), and got an accuracy of 87%. In general, gyroscopes consumes more power than accelerometers, so it is preferable to turn them off. ## Improvements -In [another open-source repository of mine](https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs), the accuracy is pushed up to nearly 94% using a special deep LSTM architecture which combines the concepts of bidirectional RNNs, residual connections, and stacked cells. This architecture is also tested on another similar activity dataset. It resembles the nice architecture used in "[Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation](https://arxiv.org/pdf/1609.08144.pdf)", without an attention mechanism, and with just the encoder part - as a "many to one" architecture instead of a "many to many" to be adapted to the Human Activity Recognition (HAR) problem. I also worked more on the problem and came up with the [LARNN](https://github.com/guillaume-chevalier/Linear-Attention-Recurrent-Neural-Network), however it's complicated for just a little gain. Thus the current, original activity recognition project is simply better to use for its outstanding simplicity. +In [another open-source repository of mine](https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs), the accuracy is pushed up to 94% using a special deep LSTM architecture which combines the concepts of bidirectional RNNs, residual connections and stacked cells. This architecture is also tested on another similar activity dataset. It resembles to the architecture used in "[Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation](https://arxiv.org/pdf/1609.08144.pdf)" without an attention mechanism and with just the encoder part - still as a "many to one" architecture which is adapted to the Human Activity Recognition (HAR) problem. -If you want to learn more about deep learning, I have also built a list of the learning ressources for deep learning which have revealed to be the most useful to me [here](https://github.com/guillaume-chevalier/Awesome-Deep-Learning-Resources). +If you want to learn more about deep learning, I have also built a list of the learning ressources for deep learning which have revealed to be the most useful to me [here](https://github.com/guillaume-chevalier/awesome-deep-learning-resources). You could as well learn to [learn to learn by gradient descent by gradient descent](https://arxiv.org/pdf/1606.04474.pdf) (not for the faint of heart). Ok, I pushed the joke deep enough... +## Checkpoint -## References - -The [dataset](https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones) can be found on the UCI Machine Learning Repository: - -> Davide Anguita, Alessandro Ghio, Luca Oneto, Xavier Parra and Jorge L. Reyes-Ortiz. A Public Domain Dataset for Human Activity Recognition Using Smartphones. 21th European Symposium on Artificial Neural Networks, Computational Intelligence and Machine Learning, ESANN 2013. Bruges, Belgium 24-26 April 2013. +The checkpoint will save the best model weights according to the validation loss. In other words, weights in a step would be saved only if the validation loss evaluated would be least out of all the steps done before. -The RNN image for "many-to-one" is taken from Karpathy's post: +**Caution** - In the checkpoint directory, the checkpoint is of few steps rather than till the last step. (Testing purpose only) -> Andrej Karpathy, The Unreasonable Effectiveness of Recurrent Neural Networks, 2015, -> http://karpathy.github.io/2015/05/21/rnn-effectiveness/ +## References -## Citation +The [dataset](https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones) can be found on the UCI Machine Learning Repository. -Copyright (c) 2016 Guillaume Chevalier. To cite my code, you can point to the URL of the GitHub repository, for example: +> Davide Anguita, Alessandro Ghio, Luca Oneto, Xavier Parra and Jorge L. Reyes-Ortiz. A Public Domain Dataset for Human Activity Recognition Using Smartphones. 21th European Symposium on Artificial Neural Networks, Computational Intelligence and Machine Learning, ESANN 2013. Bruges, Belgium 24-26 April 2013. -> Guillaume Chevalier, LSTMs for Human Activity Recognition, 2016, +To cite my work, point to the URL of the GitHub repository: +> Guillaume Chevalier, LSTMs for Human Activity Recognition, 2016 > https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition -My code is available for free and even for private usage for anyone under the [MIT License](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/blob/master/LICENSE), however I ask to cite for using the code. - -## Extra links - -### Connect with me +My code is available under the [MIT License](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/blob/master/LICENSE). -- [LinkedIn](https://ca.linkedin.com/in/chevalierg) -- [Twitter](https://twitter.com/guillaume_che) -- [GitHub](https://github.com/guillaume-chevalier/) -- [Quora](https://www.quora.com/profile/Guillaume-Chevalier-2) -- [YouTube](https://www.youtube.com/c/GuillaumeChevalier) -- [Dev/Consulting](http://www.neuraxio.com/en/) +## Connect with me -### Liked this project? Did it help you? Leave a [star](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/stargazers), [fork](https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition/network/members) and share the love! - -This activity recognition project has been seen in: - -- [Hacker News 1st page](https://news.ycombinator.com/item?id=13049143) -- [Awesome TensorFlow](https://github.com/jtoy/awesome-tensorflow#tutorials) -- [TensorFlow World](https://github.com/astorfi/TensorFlow-World#some-useful-tutorials) -- And more. - ---- +- https://ca.linkedin.com/in/chevalierg +- https://twitter.com/guillaume_che +- https://github.com/guillaume-chevalier/ ```python -# Let's convert this notebook to a README automatically for the GitHub project's title page: +# Let's convert this notebook to a README for the GitHub project's title page: !jupyter nbconvert --to markdown LSTM.ipynb !mv LSTM.md README.md ``` - - [NbConvertApp] Converting notebook LSTM.ipynb to markdown - [NbConvertApp] Support files will be in LSTM_files/ - [NbConvertApp] Making directory LSTM_files - [NbConvertApp] Making directory LSTM_files - [NbConvertApp] Writing 38654 bytes to LSTM.md diff --git a/checkpoints/checkpoint b/checkpoints/checkpoint new file mode 100644 index 0000000..5557995 --- /dev/null +++ b/checkpoints/checkpoint @@ -0,0 +1,2 @@ +model_checkpoint_path: "my_model" +all_model_checkpoint_paths: "my_model" diff --git a/checkpoints/my_model.data-00000-of-00001 b/checkpoints/my_model.data-00000-of-00001 new file mode 100644 index 0000000..c7bb197 Binary files /dev/null and b/checkpoints/my_model.data-00000-of-00001 differ diff --git a/checkpoints/my_model.index b/checkpoints/my_model.index new file mode 100644 index 0000000..c321e14 Binary files /dev/null and b/checkpoints/my_model.index differ diff --git a/checkpoints/my_model.meta b/checkpoints/my_model.meta new file mode 100644 index 0000000..802631c Binary files /dev/null and b/checkpoints/my_model.meta differ diff --git a/lstm.py b/lstm.py new file mode 100644 index 0000000..099bfd4 --- /dev/null +++ b/lstm.py @@ -0,0 +1,301 @@ +"""Human activity recognition using smartphones dataset and an LSTM RNN.""" + +# https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition + +# The MIT License (MIT) +# +# Copyright (c) 2016 Guillaume Chevalier +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Also thanks to Zhao Yu for converting the ".ipynb" notebook to this ".py" +# file which I continued to maintain. + +# Note that the dataset must be already downloaded for this script to work. +# To download the dataset, do: +# $ cd data/ +# $ python download_dataset.py + + +import tensorflow as tf + +import numpy as np + + +# Load "X" (the neural network's training and testing inputs) + +def load_X(X_signals_paths): + X_signals = [] + + for signal_type_path in X_signals_paths: + file = open(signal_type_path, 'r') + # Read dataset from disk, dealing with text files' syntax + X_signals.append( + [np.array(serie, dtype=np.float32) for serie in [ + row.replace(' ', ' ').strip().split(' ') for row in file + ]] + ) + file.close() + + return np.transpose(np.array(X_signals), (1, 2, 0)) + + +# Load "y" (the neural network's training and testing outputs) + +def load_y(y_path): + file = open(y_path, 'r') + # Read dataset from disk, dealing with text file's syntax + y_ = np.array( + [elem for elem in [ + row.replace(' ', ' ').strip().split(' ') for row in file + ]], + dtype=np.int32 + ) + file.close() + # Substract 1 to each output class for friendly 0-based indexing + return y_ - 1 + + +class Config(object): + """ + define a class to store parameters, + the input should be feature mat of training and testing + + Note: it would be more interesting to use a HyperOpt search space: + https://github.com/hyperopt/hyperopt + """ + + def __init__(self, X_train, X_test): + # Input data + self.train_count = len(X_train) # 7352 training series + self.test_data_count = len(X_test) # 2947 testing series + self.n_steps = len(X_train[0]) # 128 time_steps per series + + # Training + self.learning_rate = 0.0025 + self.lambda_loss_amount = 0.0015 + self.training_epochs = 300 + self.batch_size = 1500 + + # LSTM structure + self.n_inputs = len(X_train[0][0]) # Features count is of 9: 3 * 3D sensors features over time + self.n_hidden = 32 # nb of neurons inside the neural network + self.n_classes = 6 # Final output classes + self.W = { + 'hidden': tf.Variable(tf.random_normal([self.n_inputs, self.n_hidden])), + 'output': tf.Variable(tf.random_normal([self.n_hidden, self.n_classes])) + } + self.biases = { + 'hidden': tf.Variable(tf.random_normal([self.n_hidden], mean=1.0)), + 'output': tf.Variable(tf.random_normal([self.n_classes])) + } + + +def LSTM_Network(_X, config): + """Function returns a TensorFlow RNN with two stacked LSTM cells + + Two LSTM cells are stacked which adds deepness to the neural network. + Note, some code of this notebook is inspired from an slightly different + RNN architecture used on another dataset, some of the credits goes to + "aymericdamien". + + Args: + _X: ndarray feature matrix, shape: [batch_size, time_steps, n_inputs] + config: Config for the neural network. + + Returns: + This is a description of what is returned. + + Raises: + KeyError: Raises an exception. + + Args: + feature_mat: ndarray fature matrix, shape=[batch_size,time_steps,n_inputs] + config: class containing config of network + return: + : matrix output shape [batch_size,n_classes] + """ + # (NOTE: This step could be greatly optimised by shaping the dataset once + # input shape: (batch_size, n_steps, n_input) + _X = tf.transpose(_X, [1, 0, 2]) # permute n_steps and batch_size + # Reshape to prepare input to hidden activation + _X = tf.reshape(_X, [-1, config.n_inputs]) + # new shape: (n_steps*batch_size, n_input) + + # Linear activation + _X = tf.nn.relu(tf.matmul(_X, config.W['hidden']) + config.biases['hidden']) + # Split data because rnn cell needs a list of inputs for the RNN inner loop + _X = tf.split(_X, config.n_steps, 0) + # new shape: n_steps * (batch_size, n_hidden) + + # Define two stacked LSTM cells (two recurrent layers deep) with tensorflow + lstm_cell_1 = tf.contrib.rnn.BasicLSTMCell(config.n_hidden, forget_bias=1.0, state_is_tuple=True) + lstm_cell_2 = tf.contrib.rnn.BasicLSTMCell(config.n_hidden, forget_bias=1.0, state_is_tuple=True) + lstm_cells = tf.contrib.rnn.MultiRNNCell([lstm_cell_1, lstm_cell_2], state_is_tuple=True) + # Get LSTM cell output + outputs, states = tf.contrib.rnn.static_rnn(lstm_cells, _X, dtype=tf.float32) + + # Get last time step's output feature for a "many to one" style classifier, + # as in the image describing RNNs at the top of this page + lstm_last_output = outputs[-1] + + # Linear activation + return tf.matmul(lstm_last_output, config.W['output']) + config.biases['output'] + + +def one_hot(y_): + """ + Function to encode output labels from number indexes. + + E.g.: [[5], [0], [3]] --> [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]] + """ + y_ = y_.reshape(len(y_)) + n_values = int(np.max(y_)) + 1 + return np.eye(n_values)[np.array(y_, dtype=np.int32)] # Returns FLOATS + + +if __name__ == "__main__": + + # ----------------------------- + # Step 1: load and prepare data + # ----------------------------- + + # Those are separate normalised input features for the neural network + INPUT_SIGNAL_TYPES = [ + "body_acc_x_", + "body_acc_y_", + "body_acc_z_", + "body_gyro_x_", + "body_gyro_y_", + "body_gyro_z_", + "total_acc_x_", + "total_acc_y_", + "total_acc_z_" + ] + + # Output classes to learn how to classify + LABELS = [ + "WALKING", + "WALKING_UPSTAIRS", + "WALKING_DOWNSTAIRS", + "SITTING", + "STANDING", + "LAYING" + ] + + DATA_PATH = "data/" + DATASET_PATH = DATA_PATH + "UCI HAR Dataset/" + print("\n" + "Dataset is now located at: " + DATASET_PATH) + TRAIN = "train/" + TEST = "test/" + + X_train_signals_paths = [ + DATASET_PATH + TRAIN + "Inertial Signals/" + signal + "train.txt" for signal in INPUT_SIGNAL_TYPES + ] + X_test_signals_paths = [ + DATASET_PATH + TEST + "Inertial Signals/" + signal + "test.txt" for signal in INPUT_SIGNAL_TYPES + ] + X_train = load_X(X_train_signals_paths) + X_test = load_X(X_test_signals_paths) + + y_train_path = DATASET_PATH + TRAIN + "y_train.txt" + y_test_path = DATASET_PATH + TEST + "y_test.txt" + y_train = one_hot(load_y(y_train_path)) + y_test = one_hot(load_y(y_test_path)) + + # ----------------------------------- + # Step 2: define parameters for model + # ----------------------------------- + + config = Config(X_train, X_test) + print("Some useful info to get an insight on dataset's shape and normalisation:") + print("features shape, labels shape, each features mean, each features standard deviation") + print(X_test.shape, y_test.shape, + np.mean(X_test), np.std(X_test)) + print("the dataset is therefore properly normalised, as expected.") + + # ------------------------------------------------------ + # Step 3: Let's get serious and build the neural network + # ------------------------------------------------------ + + X = tf.placeholder(tf.float32, [None, config.n_steps, config.n_inputs]) + Y = tf.placeholder(tf.float32, [None, config.n_classes]) + + pred_Y = LSTM_Network(X, config) + + # Loss,optimizer,evaluation + l2 = config.lambda_loss_amount * \ + sum(tf.nn.l2_loss(tf_var) for tf_var in tf.trainable_variables()) + # Softmax loss and L2 + cost = tf.reduce_mean( + tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=pred_Y)) + l2 + optimizer = tf.train.AdamOptimizer( + learning_rate=config.learning_rate).minimize(cost) + + correct_pred = tf.equal(tf.argmax(pred_Y, 1), tf.argmax(Y, 1)) + accuracy = tf.reduce_mean(tf.cast(correct_pred, dtype=tf.float32)) + + # -------------------------------------------- + # Step 4: Hooray, now train the neural network + # -------------------------------------------- + + # Note that log_device_placement can be turned ON but will cause console spam with RNNs. + sess = tf.InteractiveSession(config=tf.ConfigProto(log_device_placement=False)) + init = tf.global_variables_initializer() + sess.run(init) + + best_accuracy = 0.0 + # Start training for each batch and loop epochs + for i in range(config.training_epochs): + for start, end in zip(range(0, config.train_count, config.batch_size), + range(config.batch_size, config.train_count + 1, config.batch_size)): + sess.run(optimizer, feed_dict={X: X_train[start:end], + Y: y_train[start:end]}) + + # Test completely at every epoch: calculate accuracy + pred_out, accuracy_out, loss_out = sess.run( + [pred_Y, accuracy, cost], + feed_dict={ + X: X_test, + Y: y_test + } + ) + print("traing iter: {},".format(i) + + " test accuracy : {},".format(accuracy_out) + + " loss : {}".format(loss_out)) + best_accuracy = max(best_accuracy, accuracy_out) + + print("") + print("final test accuracy: {}".format(accuracy_out)) + print("best epoch's test accuracy: {}".format(best_accuracy)) + print("") + + # ------------------------------------------------------------------ + # Step 5: Training is good, but having visual insight is even better + # ------------------------------------------------------------------ + + # Note: the code is in the .ipynb and in the README file + # Try running the "ipython notebook" command to open the .ipynb notebook + + # ------------------------------------------------------------------ + # Step 6: And finally, the multi-class confusion matrix and metrics! + # ------------------------------------------------------------------ + + # Note: the code is in the .ipynb and in the README file + # Try running the "ipython notebook" command to open the .ipynb notebook