Created
August 10, 2021 10:47
-
-
Save 79man/4bd1bd1afa0589b26445954f1514bddc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 142, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from __future__ import print_function\n", | |
"from keras.models import Sequential\n", | |
"from keras import layers\n", | |
"import numpy as np\n", | |
"from six.moves import range\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"class CharacterTable(object):\n", | |
" \"\"\"Given a set of characters:\n", | |
" + Encode them to a one-hot integer representation\n", | |
" + Decode the one-hot or integer representation to their character output\n", | |
" + Decode a vector of probabilities to their character output\n", | |
" \"\"\"\n", | |
" def __init__(self, chars):\n", | |
" \"\"\"Initialize character table.\n", | |
"\n", | |
" # Arguments\n", | |
" chars: Characters that can appear in the input.\n", | |
" \"\"\"\n", | |
" self.chars = sorted(set(chars))\n", | |
" self.char_indices = dict((c, i) for i, c in enumerate(self.chars))\n", | |
" self.indices_char = dict((i, c) for i, c in enumerate(self.chars))\n", | |
"\n", | |
" def encode(self, C, num_rows):\n", | |
" \"\"\"One-hot encode given string C.\n", | |
"\n", | |
" # Arguments\n", | |
" C: string, to be encoded.\n", | |
" num_rows: Number of rows in the returned one-hot encoding. This is\n", | |
" used to keep the # of rows for each data the same.\n", | |
" \"\"\"\n", | |
" x = np.zeros((num_rows, len(self.chars)))\n", | |
" for i, c in enumerate(C):\n", | |
" x[i, self.char_indices[c]] = 1\n", | |
" return x\n", | |
"\n", | |
" def decode(self, x, calc_argmax=True):\n", | |
" \"\"\"Decode the given vector or 2D array to their character output.\n", | |
"\n", | |
" # Arguments\n", | |
" x: A vector or a 2D array of probabilities or one-hot representations;\n", | |
" or a vector of character indices (used with `calc_argmax=False`).\n", | |
" calc_argmax: Whether to find the character index with maximum\n", | |
" probability, defaults to `True`.\n", | |
" \"\"\"\n", | |
" if calc_argmax:\n", | |
" x = x.argmax(axis=-1)\n", | |
" return ''.join(self.indices_char[x] for x in x)\n", | |
"\n", | |
"class colors:\n", | |
" ok = '\\033[92m'\n", | |
" fail = '\\033[91m'\n", | |
" close = '\\033[0m'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 143, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Step - 1 : Setiing up the Parameters\n", | |
"# Parameters for the model and dataset.\n", | |
"TRAINING_SIZE = 50000\n", | |
"DIGITS = 3\n", | |
"REVERSE = True\n", | |
"\n", | |
"# Maximum length of input is 'int + int' (e.g., '345+678'). Maximum length of\n", | |
"# int is DIGITS.\n", | |
"MAXLEN = DIGITS + 1 + DIGITS\n", | |
"\n", | |
"# All the numbers, plus sign and space for padding.\n", | |
"chars = '0123456789+ '\n", | |
"ctable = CharacterTable(chars)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 144, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Generating data...\n", | |
"question : reversed : training : actual\n", | |
"'15+91' : ' 19+51' : '106 ' : '106'\n", | |
"'556+7' : ' 7+655' : '563 ' : '563'\n", | |
"'91+11' : ' 11+19' : '102 ' : '102'\n", | |
"'18+776' : ' 677+81' : '794 ' : '794'\n", | |
"'32+357' : ' 753+23' : '389 ' : '389'\n", | |
"'242+7' : ' 7+242' : '249 ' : '249'\n", | |
"'508+67' : ' 76+805' : '575 ' : '575'\n", | |
"'990+77' : ' 77+099' : '1067' : '1067'\n", | |
"'2+187' : ' 781+2' : '189 ' : '189'\n", | |
"'96+59' : ' 95+69' : '155 ' : '155'\n", | |
"'904+4' : ' 4+409' : '908 ' : '908'\n", | |
"'51+871' : ' 178+15' : '922 ' : '922'\n", | |
"'669+8' : ' 8+966' : '677 ' : '677'\n", | |
"'88+829' : ' 928+88' : '917 ' : '917'\n", | |
"'733+883' : '388+337' : '1616' : '1616'\n", | |
"'896+793' : '397+698' : '1689' : '1689'\n", | |
"'132+4' : ' 4+231' : '136 ' : '136'\n", | |
"'85+380' : ' 083+58' : '465 ' : '465'\n", | |
"'139+975' : '579+931' : '1114' : '1114'\n", | |
"'970+43' : ' 34+079' : '1013' : '1013'\n", | |
"'817+846' : '648+718' : '1663' : '1663'\n", | |
"'621+5' : ' 5+126' : '626 ' : '626'\n", | |
"'46+26' : ' 62+64' : '72 ' : '72'\n", | |
"'67+795' : ' 597+76' : '862 ' : '862'\n", | |
"'881+244' : '442+188' : '1125' : '1125'\n", | |
"'91+919' : ' 919+19' : '1010' : '1010'\n", | |
"'91+520' : ' 025+19' : '611 ' : '611'\n", | |
"'0+812' : ' 218+0' : '812 ' : '812'\n", | |
"'52+61' : ' 16+25' : '113 ' : '113'\n", | |
"'31+919' : ' 919+13' : '950 ' : '950'\n", | |
"'522+40' : ' 04+225' : '562 ' : '562'\n", | |
"'17+553' : ' 355+71' : '570 ' : '570'\n", | |
"'23+936' : ' 639+32' : '959 ' : '959'\n", | |
"'155+81' : ' 18+551' : '236 ' : '236'\n", | |
"'759+446' : '644+957' : '1205' : '1205'\n", | |
"'96+668' : ' 866+69' : '764 ' : '764'\n", | |
"'145+681' : '186+541' : '826 ' : '826'\n", | |
"'1+990' : ' 099+1' : '991 ' : '991'\n", | |
"'5+339' : ' 933+5' : '344 ' : '344'\n", | |
"'70+594' : ' 495+07' : '664 ' : '664'\n", | |
"'763+62' : ' 26+367' : '825 ' : '825'\n", | |
"'54+316' : ' 613+45' : '370 ' : '370'\n", | |
"'62+446' : ' 644+26' : '508 ' : '508'\n", | |
"'601+86' : ' 68+106' : '687 ' : '687'\n", | |
"'40+930' : ' 039+04' : '970 ' : '970'\n", | |
"'104+873' : '378+401' : '977 ' : '977'\n", | |
"'885+250' : '052+588' : '1135' : '1135'\n", | |
"'24+514' : ' 415+42' : '538 ' : '538'\n", | |
"'730+63' : ' 36+037' : '793 ' : '793'\n", | |
"'427+958' : '859+724' : '1385' : '1385'\n", | |
"Total addition questions: 50000\n" | |
] | |
} | |
], | |
"source": [ | |
"# Step - 2 : Generating the Training Data - 50000 Question of len(12), 50000 Answers of len (7)\n", | |
"questions = []\n", | |
"expected = []\n", | |
"seen = set()\n", | |
"print('Generating data...')\n", | |
"\n", | |
"qCount = 0\n", | |
"print(\"{} : {} : {} : {}\".format(\"question\", \"reversed\", \"training\", \"actual\"))\n", | |
"while len(questions) < TRAINING_SIZE:\n", | |
" f = lambda: int(''.join(np.random.choice(list('0123456789'))\n", | |
" for i in range(np.random.randint(1, DIGITS + 1))))\n", | |
" a, b = f(), f()\n", | |
" # Skip any addition questions we've already seen\n", | |
" # Also skip any such that x+Y == Y+x (hence the sorting).\n", | |
" key = tuple(sorted((a, b)))\n", | |
" if key in seen:\n", | |
" continue\n", | |
" seen.add(key)\n", | |
" \n", | |
" qCount = qCount + 1\n", | |
" # Pad the data with spaces such that it is always MAXLEN.\n", | |
" q = '{}+{}'.format(a, b)\n", | |
" query = q + ' ' * (MAXLEN - len(q))\n", | |
" ans = str(a + b)\n", | |
" # Answers can be of maximum size DIGITS + 1.\n", | |
" ans += ' ' * (DIGITS + 1 - len(ans))\n", | |
" if REVERSE:\n", | |
" # Reverse the query, e.g., '12+345 ' becomes ' 543+21'. (Note the\n", | |
" # space used for padding.)\n", | |
" query = query[::-1]\n", | |
" \n", | |
" questions.append(query)\n", | |
" expected.append(ans)\n", | |
" \n", | |
" if qCount % 1000 == 0 :\n", | |
" print(\"'{}' : '{}' : '{}' : '{}'\".format(q, query, ans, a+b))\n", | |
"\n", | |
"print('Total addition questions:', len(questions))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 145, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 864x504 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Encoded Question: ' 7+43'\n", | |
"(7, 12)\n", | |
"[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n", | |
" [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n", | |
" [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]'\n", | |
"Encoded Answer: '41 '\n", | |
"(4, 12)\n", | |
"[[0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n", | |
" [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", | |
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]'\n" | |
] | |
} | |
], | |
"source": [ | |
"# Understanding the One Hot Encoding used\n", | |
"plt.scatter([str(\"'\") + str(c) + str(\"'\") for c in list(ctable.char_indices.keys())], list(ctable.char_indices.values()))\n", | |
"plt.title(\"One Hot Encoding by Character\")\n", | |
"plt.ylabel(\"Assigned Index\")\n", | |
"plt.xlabel(\"Encoded Character\")\n", | |
"plt.show()\n", | |
"\n", | |
"t = ctable.encode(questions[0], MAXLEN)\n", | |
"print(\"Encoded Question: '{}'\\n{}\\n{}'\".format(questions[0], t.shape, t))\n", | |
"\n", | |
"t = ctable.encode(expected[0], DIGITS + 1)\n", | |
"print(\"Encoded Answer: '{}'\\n{}\\n{}'\".format(expected[0], t.shape, t))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 146, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Vectorization...\n", | |
"(50000, 7, 12) (50000, 4, 12)\n", | |
"Sample Encoded Question: ' 7+43'\n", | |
"(7, 12)\n", | |
"[[ True False False False False False False False False False False False]\n", | |
" [ True False False False False False False False False False False False]\n", | |
" [ True False False False False False False False False False False False]\n", | |
" [False False False False False False False False False True False False]\n", | |
" [False True False False False False False False False False False False]\n", | |
" [False False False False False False True False False False False False]\n", | |
" [False False False False False True False False False False False False]]'\n", | |
"Sample Encoded Answer: '41 '\n", | |
"(7, 12)\n", | |
"[[ True False False False False False False False False False False False]\n", | |
" [ True False False False False False False False False False False False]\n", | |
" [ True False False False False False False False False False False False]\n", | |
" [False False False False False False False False False True False False]\n", | |
" [False True False False False False False False False False False False]\n", | |
" [False False False False False False True False False False False False]\n", | |
" [False False False False False True False False False False False False]]'\n" | |
] | |
} | |
], | |
"source": [ | |
"# Step - 3 : Vectorization of the questions through One Hot Encoding\n", | |
"print('Vectorization...')\n", | |
"x = np.zeros((len(questions), MAXLEN, len(chars)), dtype=np.bool)\n", | |
"y = np.zeros((len(questions), DIGITS + 1, len(chars)), dtype=np.bool)\n", | |
"\n", | |
"print(x.shape, y.shape)\n", | |
"\n", | |
"for i, sentence in enumerate(questions):\n", | |
" x[i] = ctable.encode(sentence, MAXLEN)\n", | |
"for i, sentence in enumerate(expected):\n", | |
" y[i] = ctable.encode(sentence, DIGITS + 1)\n", | |
" \n", | |
"print(\"Sample Encoded Question: '{}'\\n{}\\n{}'\".format(questions[0], x[0].shape, x[0]))\n", | |
"print(\"Sample Encoded Answer: '{}'\\n{}\\n{}'\".format(expected[0], x[0].shape, x[0]))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 147, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"((50000, 4, 12),\n", | |
" array([24763, 13191, 5224, ..., 1028, 14309, 40267]),\n", | |
" 50000,\n", | |
" 5000)" | |
] | |
}, | |
"execution_count": 147, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"testin = np.arange(len(y))\n", | |
"np.random.shuffle(testin)\n", | |
"y.shape, testin, len(x), len(x) // 10" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 148, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Training Data: (45000, 7, 12) (45000, 4, 12)\n", | |
"Validation Data: (5000, 7, 12) (5000, 4, 12)\n" | |
] | |
} | |
], | |
"source": [ | |
"# Step - 4 : Shuffle (x, y) in unison as the later parts of x will almost all be larger\n", | |
"# digits.\n", | |
"indices = np.arange(len(y))\n", | |
"np.random.shuffle(indices)\n", | |
"x = x[indices]\n", | |
"y = y[indices]\n", | |
"\n", | |
"# Explicitly set apart 10% for validation data that we never train over.\n", | |
"# '//'' is the 'divide-and-floor' operator\n", | |
"\n", | |
"split_at = len(x) - len(x) // 10\n", | |
"(x_train, x_test) = x[:split_at], x[split_at:]\n", | |
"(y_train, y_test) = y[:split_at], y[split_at:]\n", | |
"print('Training Data:', x_train.shape, y_train.shape)\n", | |
"print('Validation Data:', x_test.shape, y_test.shape)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Build model...\n", | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"lstm_5 (LSTM) (None, 128) 72192 \n", | |
"_________________________________________________________________\n", | |
"repeat_vector_3 (RepeatVecto (None, 4, 128) 0 \n", | |
"_________________________________________________________________\n", | |
"lstm_6 (LSTM) (None, 4, 128) 131584 \n", | |
"_________________________________________________________________\n", | |
"time_distributed_3 (TimeDist (None, 4, 12) 1548 \n", | |
"=================================================================\n", | |
"Total params: 205,324\n", | |
"Trainable params: 205,324\n", | |
"Non-trainable params: 0\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"# Step - 5 : Building the RNN\n", | |
"\n", | |
"# Try replacing GRU, or SimpleRNN.\n", | |
"RNN = layers.LSTM\n", | |
"HIDDEN_SIZE = 128\n", | |
"BATCH_SIZE = 128\n", | |
"LAYERS = 1\n", | |
"\n", | |
"print('Build model...')\n", | |
"model = Sequential()\n", | |
"# \"Encode\" the input sequence using an RNN, producing an output of HIDDEN_SIZE.\n", | |
"# Note: In a situation where your input sequences have a variable length,\n", | |
"# use input_shape=(None, num_feature).\n", | |
"model.add(RNN(HIDDEN_SIZE, input_shape=(MAXLEN, len(chars))))\n", | |
"# As the decoder RNN's input, repeatedly provide with the last output of\n", | |
"# RNN for each time step. Repeat 'DIGITS + 1' times as that's the maximum\n", | |
"# length of output, e.g., when DIGITS=3, max output is 999+999=1998.\n", | |
"model.add(layers.RepeatVector(DIGITS + 1))\n", | |
"# The decoder RNN could be multiple layers stacked or a single layer.\n", | |
"for _ in range(LAYERS):\n", | |
" # By setting return_sequences to True, return not only the last output but\n", | |
" # all the outputs so far in the form of (num_samples, timesteps,\n", | |
" # output_dim). This is necessary as TimeDistributed in the below expects\n", | |
" # the first dimension to be the timesteps.\n", | |
" model.add(RNN(HIDDEN_SIZE, return_sequences=True))\n", | |
"\n", | |
"# Apply a dense layer to the every temporal slice of an input. For each of step\n", | |
"# of the output sequence, decide which character should be chosen.\n", | |
"model.add(layers.TimeDistributed(layers.Dense(len(chars), activation='softmax')))\n", | |
"model.compile(loss='categorical_crossentropy',\n", | |
" optimizer='adam',\n", | |
" metrics=['accuracy'])\n", | |
"model.summary()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 150, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 1\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 8s 183us/step - loss: 1.8803 - acc: 0.3229 - val_loss: 1.7714 - val_acc: 0.3467\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 100 -1043\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 100 -319\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 221 117\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 60 7\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 401 -93\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 62 -662\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 100 -549\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 101 -1244\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 100 -165\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 621 496\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 2\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 150us/step - loss: 1.7083 - acc: 0.3673 - val_loss: 1.6363 - val_acc: 0.3910\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1229 86\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 403 -16\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 34 -70\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 11 -42\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 44 -680\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 904 255\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1229 -116\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 409 144\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 66 -59\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 3\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 153us/step - loss: 1.5615 - acc: 0.4166 - val_loss: 1.4812 - val_acc: 0.4440\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1100 -43\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 330 -89\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 12 -92\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 10 -43\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 488 -6\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 380 -344\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 650 1\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1330 -15\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 231 -34\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 126 1\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 4\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 6s 140us/step - loss: 1.4003 - acc: 0.4771 - val_loss: 1.3243 - val_acc: 0.5094\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1177 34\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 301 -118\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 110 6\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 10 -43\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 484 -10\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 731 7\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 661 12\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1329 -16\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 211 -54\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 121 -4\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 5\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 6s 138us/step - loss: 1.2541 - acc: 0.5349 - val_loss: 1.1972 - val_acc: 0.5516\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1111 -32\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 408 -11\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 116 12\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 61 8\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 485 -9\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 731 7\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 651 2\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1311 -34\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 285 20\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 121 -4\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 6\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 147us/step - loss: 1.1212 - acc: 0.5880 - val_loss: 1.0827 - val_acc: 0.5884\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1074 -69\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 400 -19\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 102 -2\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 68 15\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 480 -14\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 711 -13\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 646 -3\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1300 -45\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 268 3\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 119 -6\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 7\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 6s 138us/step - loss: 1.0100 - acc: 0.6336 - val_loss: 0.9639 - val_acc: 0.6505\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1177 34\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 410 -9\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 11 -93\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 58 5\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 495 1\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 728 4\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 659 10\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1375 30\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 253 -12\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 121 -4\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 8\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 6s 144us/step - loss: 0.9125 - acc: 0.6739 - val_loss: 0.8792 - val_acc: 0.6823\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1141 -2\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 413 -6\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 113 9\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 495 1\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 723 -1\n", | |
"Q 649+0 T 649 \u001b[91m☒\u001b[0m 659 10\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1349 4\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 263 -2\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 121 -4\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 9\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 147us/step - loss: 0.8281 - acc: 0.7077 - val_loss: 0.7971 - val_acc: 0.7215\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1147 4\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 418 -1\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 58 5\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 495 1\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 727 3\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1344 -1\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 262 -3\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 124 -1\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 10\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 6s 141us/step - loss: 0.7602 - acc: 0.7322 - val_loss: 0.7492 - val_acc: 0.7301\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1147 4\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 418 -1\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 10 -94\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 495 1\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1445 100\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 262 -3\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 128 3\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 11\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 155us/step - loss: 0.6803 - acc: 0.7581 - val_loss: 0.6253 - val_acc: 0.7754\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1144 1\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 105 1\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 52 -1\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 493 -1\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1344 -1\n", | |
"Q 73+192 T 265 \u001b[91m☒\u001b[0m 263 -2\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 126 1\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 12\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 165us/step - loss: 0.5427 - acc: 0.8073 - val_loss: 0.4794 - val_acc: 0.8296\n", | |
"Q 738+405 T 1143 \u001b[91m☒\u001b[0m 1142 -1\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 429 10\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 105 1\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 43 -10\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 493 -1\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 723 -1\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[91m☒\u001b[0m 126 1\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 13\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 147us/step - loss: 0.3968 - acc: 0.8710 - val_loss: 0.3384 - val_acc: 0.9010\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 105 1\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 54 1\n", | |
"Q 73+421 T 494 \u001b[91m☒\u001b[0m 493 -1\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 723 -1\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[91m☒\u001b[0m 1445 100\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 14\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 150us/step - loss: 0.2833 - acc: 0.9250 - val_loss: 0.2467 - val_acc: 0.9398\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[91m☒\u001b[0m 55 2\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[91m☒\u001b[0m 723 -1\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 15\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 165us/step - loss: 0.2022 - acc: 0.9557 - val_loss: 0.1814 - val_acc: 0.9583\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[91m☒\u001b[0m 105 1\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 16\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 153us/step - loss: 0.1444 - acc: 0.9724 - val_loss: 0.1440 - val_acc: 0.9670\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 429 10\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 17\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 154us/step - loss: 0.1099 - acc: 0.9802 - val_loss: 0.1179 - val_acc: 0.9735\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[91m☒\u001b[0m 429 10\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 18\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 159us/step - loss: 0.0890 - acc: 0.9839 - val_loss: 0.0854 - val_acc: 0.9831\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 19\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 151us/step - loss: 0.0668 - acc: 0.9899 - val_loss: 0.0694 - val_acc: 0.9871\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n", | |
"\n", | |
"--------------------------------------------------\n", | |
"Iteration 20\n", | |
"Train on 45000 samples, validate on 5000 samples\n", | |
"Epoch 1/1\n", | |
"45000/45000 [==============================] - 7s 160us/step - loss: 0.0619 - acc: 0.9888 - val_loss: 0.0653 - val_acc: 0.9859\n", | |
"Q 738+405 T 1143 \u001b[92m☑\u001b[0m 1143 0\n", | |
"Q 330+89 T 419 \u001b[92m☑\u001b[0m 419 0\n", | |
"Q 72+32 T 104 \u001b[92m☑\u001b[0m 104 0\n", | |
"Q 16+37 T 53 \u001b[92m☑\u001b[0m 53 0\n", | |
"Q 73+421 T 494 \u001b[92m☑\u001b[0m 494 0\n", | |
"Q 3+721 T 724 \u001b[92m☑\u001b[0m 724 0\n", | |
"Q 649+0 T 649 \u001b[92m☑\u001b[0m 649 0\n", | |
"Q 600+745 T 1345 \u001b[92m☑\u001b[0m 1345 0\n", | |
"Q 73+192 T 265 \u001b[92m☑\u001b[0m 265 0\n", | |
"Q 62+63 T 125 \u001b[92m☑\u001b[0m 125 0\n" | |
] | |
} | |
], | |
"source": [ | |
"# Step - 6: Train the model each generation and show predictions against the validation dataset.\n", | |
"\n", | |
"# We will collect 10 random questions and check the prediction status on these after every few epoch\n", | |
"question_indices = np.random.randint(0, len(x_test), size=10)\n", | |
"\n", | |
"num_iterations = 20\n", | |
"learning_error_map = np.ndarray((10,num_iterations), np.int)\n", | |
"\n", | |
"for iteration in range(1, num_iterations+1):\n", | |
" print()\n", | |
" print('-' * 50)\n", | |
" print('Iteration', iteration)\n", | |
" model.fit(x_train, y_train,\n", | |
" batch_size=BATCH_SIZE,\n", | |
" epochs=1,\n", | |
" validation_data=(x_test, y_test),\n", | |
" callbacks=[])\n", | |
" \n", | |
" # Select 10 samples from the validation set at random so we can visualize\n", | |
" # errors.\n", | |
" questionNumber = 0\n", | |
" for ind in question_indices:\n", | |
" #ind = np.random.randint(0, len(x_val))\n", | |
" rowx, rowy = x_test[np.array([ind])], y_test[np.array([ind])]\n", | |
" preds = model.predict_classes(rowx, verbose=2)\n", | |
"\n", | |
" q = ctable.decode(rowx[0])\n", | |
" correct = ctable.decode(rowy[0])\n", | |
" guess = ctable.decode(preds[0], calc_argmax=False)\n", | |
" error = int(guess) - int(correct)\n", | |
" \n", | |
" print('Q', q[::-1] if REVERSE else q, end=' ') \n", | |
" print('T', correct, end=' ')\n", | |
" if correct == guess:\n", | |
" print(colors.ok + '☑' + colors.close, end=' ')\n", | |
" else:\n", | |
" print(colors.fail + '☒' + colors.close, end=' ')\n", | |
" print(guess, end=' ')\n", | |
" print(error)\n", | |
" learning_error_map[questionNumber][iteration-1] = error\n", | |
" questionNumber = questionNumber+1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x5f18fd0>,\n", | |
" <matplotlib.lines.Line2D at 0x5f201d0>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20320>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20470>,\n", | |
" <matplotlib.lines.Line2D at 0x5f205c0>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20710>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20860>,\n", | |
" <matplotlib.lines.Line2D at 0x5f209b0>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20b00>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20c50>,\n", | |
" <matplotlib.lines.Line2D at 0x5ef7b38>,\n", | |
" <matplotlib.lines.Line2D at 0x5f20eb8>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26048>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26198>,\n", | |
" <matplotlib.lines.Line2D at 0x5f262e8>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26438>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26588>,\n", | |
" <matplotlib.lines.Line2D at 0x5f266d8>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26828>,\n", | |
" <matplotlib.lines.Line2D at 0x5f26978>]" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 864x504 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.rcParams['figure.figsize'] = [12, 7]\n", | |
"sel_ques = [questions[i] for i in question_indices]\n", | |
"plt.plot(sel_ques,learning_error_map)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 69, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def evaluateModel(x_data, y_data) :\n", | |
" sum_of_errors = 0\n", | |
" max_of_errors = 0\n", | |
" min_of_errors = np.inf\n", | |
"\n", | |
" max_error_indx = -1\n", | |
" min_error_indx = -1\n", | |
"\n", | |
" sum_of_correct = 0\n", | |
"\n", | |
" correct_count = 0\n", | |
"\n", | |
" for ind in range(0, len(x_data)):\n", | |
" #ind = np.random.randint(0, len(x_val))\n", | |
"\n", | |
" rowx, rowy = x_data[np.array([ind])], y_data[np.array([ind])]\n", | |
" preds = model.predict_classes(rowx, verbose=2)\n", | |
" q = ctable.decode(rowx[0])\n", | |
" q = q[::-1] if REVERSE else q\n", | |
"\n", | |
" correct = ctable.decode(rowy[0]) \n", | |
" guess = ctable.decode(preds[0], calc_argmax=False)\n", | |
" error = np.absolute(int(guess) - int(correct))\n", | |
" sum_of_errors = sum_of_errors + error\n", | |
" sum_of_correct = sum_of_correct + int(correct)\n", | |
"\n", | |
" if error > max_of_errors :\n", | |
" max_of_errors = error\n", | |
" max_error_indx = ind\n", | |
"\n", | |
" if error > 0 and error < min_of_errors:\n", | |
" min_of_errors = error\n", | |
" min_error_indx = ind\n", | |
"\n", | |
" if guess == correct:\n", | |
" correct_count = correct_count + 1\n", | |
" \n", | |
" if ind % 1000 == 1:\n", | |
" print(\"[{}] : Errors: Max {}, Min {}, Sum {}, Correct_sum {}, correct: {}/{}, Accuracy: {}\".format(ind, max_of_errors, min_of_errors, sum_of_errors, sum_of_correct, correct_count, len(x_data), correct_count/len(x_data)))\n", | |
"\n", | |
" print(\"Errors: Max {}, Min {}, Sum {}, Correct_sum {}, correct: {}/{}, Accuracy: {}\".format(max_of_errors, min_of_errors, sum_of_errors, sum_of_correct, correct_count, len(x_data), correct_count/len(x_data)))\n", | |
"\n", | |
" return {\n", | |
" \"max_error\" : max_of_errors, \n", | |
" \"max_error_index\" : max_error_indx,\n", | |
" \"min_error\" : min_of_errors,\n", | |
" \"min_error_index\" : min_error_indx,\n", | |
" \"correct\" : correct_count,\n", | |
" \"wrong\" : len(x_data) - correct_count,\n", | |
" \"accuracy\" : str(correct_count/len(x_data) * 100) + \"%\"\n", | |
" }" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 70, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[1] : Errors: Max 10, Min 10, Sum 10, Correct_sum 1251, correct: 1/45000, Accuracy: 2.2222222222222223e-05\n", | |
"[1001] : Errors: Max 100, Min 1, Sum 565, Correct_sum 660612, correct: 942/45000, Accuracy: 0.020933333333333335\n", | |
"[2001] : Errors: Max 100, Min 1, Sum 1292, Correct_sum 1327546, correct: 1894/45000, Accuracy: 0.04208888888888889\n", | |
"[3001] : Errors: Max 8860, Min 1, Sum 10982, Correct_sum 2004414, correct: 2843/45000, Accuracy: 0.06317777777777778\n", | |
"[4001] : Errors: Max 8860, Min 1, Sum 12746, Correct_sum 2677280, correct: 3794/45000, Accuracy: 0.08431111111111111\n", | |
"[5001] : Errors: Max 8860, Min 1, Sum 13775, Correct_sum 3343505, correct: 4741/45000, Accuracy: 0.10535555555555555\n", | |
"[6001] : Errors: Max 8860, Min 1, Sum 14963, Correct_sum 4018502, correct: 5682/45000, Accuracy: 0.12626666666666667\n", | |
"[7001] : Errors: Max 8860, Min 1, Sum 16149, Correct_sum 4708606, correct: 6630/45000, Accuracy: 0.14733333333333334\n", | |
"[8001] : Errors: Max 8860, Min 1, Sum 16730, Correct_sum 5380712, correct: 7585/45000, Accuracy: 0.16855555555555554\n", | |
"[9001] : Errors: Max 8860, Min 1, Sum 25849, Correct_sum 6062012, correct: 8533/45000, Accuracy: 0.18962222222222222\n", | |
"[10001] : Errors: Max 8860, Min 1, Sum 34510, Correct_sum 6720593, correct: 9490/45000, Accuracy: 0.21088888888888888\n", | |
"[11001] : Errors: Max 8860, Min 1, Sum 42938, Correct_sum 7387953, correct: 10436/45000, Accuracy: 0.23191111111111112\n", | |
"[12001] : Errors: Max 8860, Min 1, Sum 52080, Correct_sum 8062013, correct: 11386/45000, Accuracy: 0.2530222222222222\n", | |
"[13001] : Errors: Max 8860, Min 1, Sum 53801, Correct_sum 8727100, correct: 12334/45000, Accuracy: 0.2740888888888889\n", | |
"[14001] : Errors: Max 8860, Min 1, Sum 62823, Correct_sum 9393554, correct: 13278/45000, Accuracy: 0.29506666666666664\n", | |
"[15001] : Errors: Max 8860, Min 1, Sum 63209, Correct_sum 10046954, correct: 14231/45000, Accuracy: 0.31624444444444444\n", | |
"[16001] : Errors: Max 8860, Min 1, Sum 65346, Correct_sum 10729773, correct: 15182/45000, Accuracy: 0.3373777777777778\n", | |
"[17001] : Errors: Max 8860, Min 1, Sum 66728, Correct_sum 11386352, correct: 16136/45000, Accuracy: 0.3585777777777778\n", | |
"[18001] : Errors: Max 8860, Min 1, Sum 67716, Correct_sum 12053681, correct: 17072/45000, Accuracy: 0.37937777777777776\n", | |
"[19001] : Errors: Max 8860, Min 1, Sum 68147, Correct_sum 12733589, correct: 18033/45000, Accuracy: 0.40073333333333333\n", | |
"[20001] : Errors: Max 8860, Min 1, Sum 68831, Correct_sum 13419522, correct: 18981/45000, Accuracy: 0.4218\n", | |
"[21001] : Errors: Max 8860, Min 1, Sum 85288, Correct_sum 14102391, correct: 19934/45000, Accuracy: 0.4429777777777778\n", | |
"[22001] : Errors: Max 8860, Min 1, Sum 101838, Correct_sum 14782431, correct: 20884/45000, Accuracy: 0.4640888888888889\n", | |
"[23001] : Errors: Max 8860, Min 1, Sum 102150, Correct_sum 15434826, correct: 21836/45000, Accuracy: 0.4852444444444444\n", | |
"[24001] : Errors: Max 8860, Min 1, Sum 102771, Correct_sum 16086003, correct: 22797/45000, Accuracy: 0.5066\n", | |
"[25001] : Errors: Max 8860, Min 1, Sum 111578, Correct_sum 16765754, correct: 23744/45000, Accuracy: 0.5276444444444445\n", | |
"[26001] : Errors: Max 8860, Min 1, Sum 120587, Correct_sum 17460192, correct: 24674/45000, Accuracy: 0.5483111111111111\n", | |
"[27001] : Errors: Max 8860, Min 1, Sum 121203, Correct_sum 18116304, correct: 25620/45000, Accuracy: 0.5693333333333334\n", | |
"[28001] : Errors: Max 8860, Min 1, Sum 121998, Correct_sum 18778038, correct: 26573/45000, Accuracy: 0.5905111111111111\n", | |
"[29001] : Errors: Max 8860, Min 1, Sum 122528, Correct_sum 19434244, correct: 27535/45000, Accuracy: 0.6118888888888889\n", | |
"[30001] : Errors: Max 8860, Min 1, Sum 130983, Correct_sum 20116135, correct: 28481/45000, Accuracy: 0.6329111111111111\n", | |
"[31001] : Errors: Max 8860, Min 1, Sum 156412, Correct_sum 20793751, correct: 29435/45000, Accuracy: 0.6541111111111111\n", | |
"[32001] : Errors: Max 8860, Min 1, Sum 165446, Correct_sum 21470656, correct: 30380/45000, Accuracy: 0.6751111111111111\n", | |
"[33001] : Errors: Max 8860, Min 1, Sum 174136, Correct_sum 22129274, correct: 31334/45000, Accuracy: 0.6963111111111111\n", | |
"[34001] : Errors: Max 8860, Min 1, Sum 175203, Correct_sum 22792720, correct: 32279/45000, Accuracy: 0.7173111111111111\n", | |
"[35001] : Errors: Max 8860, Min 1, Sum 183506, Correct_sum 23470643, correct: 33242/45000, Accuracy: 0.7387111111111111\n", | |
"[36001] : Errors: Max 8860, Min 1, Sum 192091, Correct_sum 24155242, correct: 34194/45000, Accuracy: 0.7598666666666667\n", | |
"[37001] : Errors: Max 8860, Min 1, Sum 200558, Correct_sum 24805652, correct: 35140/45000, Accuracy: 0.7808888888888889\n", | |
"[38001] : Errors: Max 8860, Min 1, Sum 209300, Correct_sum 25473790, correct: 36087/45000, Accuracy: 0.8019333333333334\n", | |
"[39001] : Errors: Max 8860, Min 1, Sum 209944, Correct_sum 26158820, correct: 37028/45000, Accuracy: 0.8228444444444445\n", | |
"[40001] : Errors: Max 8860, Min 1, Sum 210927, Correct_sum 26815289, correct: 37986/45000, Accuracy: 0.8441333333333333\n", | |
"[41001] : Errors: Max 8860, Min 1, Sum 219803, Correct_sum 27489924, correct: 38927/45000, Accuracy: 0.8650444444444444\n", | |
"[42001] : Errors: Max 8860, Min 1, Sum 220199, Correct_sum 28163650, correct: 39884/45000, Accuracy: 0.8863111111111112\n", | |
"[43001] : Errors: Max 8860, Min 1, Sum 229090, Correct_sum 28835054, correct: 40833/45000, Accuracy: 0.9074\n", | |
"[44001] : Errors: Max 8860, Min 1, Sum 245933, Correct_sum 29515309, correct: 41789/45000, Accuracy: 0.9286444444444445\n", | |
"Errors: Max 8860, Min 1, Sum 254355, Correct_sum 30181321, correct: 42748/45000, Accuracy: 0.9499555555555556\n", | |
"Train data stats: {} {'max_error': 8860, 'max_error_index': 2554, 'min_error': 1, 'min_error_index': 8, 'correct': 42748, 'wrong': 2252, 'accuracy': '94.99555555555555%'}\n", | |
"-------------------------------------------------------\n", | |
"[1] : Errors: Max 0, Min inf, Sum 0, Correct_sum 1059, correct: 2/5000, Accuracy: 0.0004\n", | |
"[1001] : Errors: Max 100, Min 1, Sum 1168, Correct_sum 669355, correct: 944/5000, Accuracy: 0.1888\n", | |
"[2001] : Errors: Max 100, Min 1, Sum 2351, Correct_sum 1341388, correct: 1877/5000, Accuracy: 0.3754\n", | |
"[3001] : Errors: Max 101, Min 1, Sum 3673, Correct_sum 2037160, correct: 2801/5000, Accuracy: 0.5602\n", | |
"[4001] : Errors: Max 8050, Min 1, Sum 12613, Correct_sum 2728724, correct: 3730/5000, Accuracy: 0.746\n", | |
"Errors: Max 8050, Min 1, Sum 13596, Correct_sum 3390692, correct: 4677/5000, Accuracy: 0.9354\n", | |
"Train data stats: {} {'max_error': 8050, 'max_error_index': 3423, 'min_error': 1, 'min_error_index': 4, 'correct': 4677, 'wrong': 323, 'accuracy': '93.54%'}\n" | |
] | |
} | |
], | |
"source": [ | |
"train_eval = evaluateModel(x_train, y_train)\n", | |
"print(\"Train data stats: {}\", train_eval)\n", | |
"print(\"-\"*55)\n", | |
"test_eval = evaluateModel(x_test, y_test)\n", | |
"print(\"Train data stats: {}\", test_eval)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 154, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def printQuestionDetails(x_test, y_test, indx) :\n", | |
" rowx, rowy = x_test[np.array([indx])], y_test[np.array([indx])]\n", | |
" preds = model.predict_classes(rowx, verbose=2)\n", | |
" q = ctable.decode(rowx[0])\n", | |
" q = q[::-1] if REVERSE else q\n", | |
"\n", | |
" correct = ctable.decode(rowy[0])\n", | |
" guess = ctable.decode(preds[0], calc_argmax=False)\n", | |
" error = int(guess) - int(correct) \n", | |
" \n", | |
" print('Q', q[::-1] if REVERSE else q, end=' ') \n", | |
" print('T', correct, end=' ')\n", | |
" if correct == guess:\n", | |
" print(colors.ok + '☑' + colors.close, end=' ')\n", | |
" else:\n", | |
" print(colors.fail + '☒' + colors.close, end=' ')\n", | |
" print(guess, end=' ')\n", | |
" print(error)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 155, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Q 8+501 T 113 \u001b[92m☑\u001b[0m 113 0\n" | |
] | |
} | |
], | |
"source": [ | |
"printQuestionDetails(x_test, y_test, max_error_indx)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 156, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Q 78+43 T 121 \u001b[92m☑\u001b[0m 121 0\n" | |
] | |
} | |
], | |
"source": [ | |
"printQuestionDetails(x_test, y_test, min_error_indx)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 157, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def calculate_add(a, b) :\n", | |
" q = '{}+{}'.format(a, b)\n", | |
" q = q[::-1] if REVERSE else q\n", | |
" \n", | |
" query = q + ' ' * (MAXLEN - len(q))\n", | |
" #print(query)\n", | |
" query_enc = ctable.encode(query, MAXLEN)>0\n", | |
" #print(query_enc) \n", | |
" query_enc = query_enc.reshape((1, query_enc.shape[0], query_enc.shape[1]))\n", | |
" #print(query_enc)\n", | |
" #print(\"-\"*55)\n", | |
" #print(x_train[np.array([10])].shape)\n", | |
" \n", | |
" key = tuple(sorted((a, b)))\n", | |
" if key in seen:\n", | |
" print('Seen:', end=' ')\n", | |
" \n", | |
" preds = model.predict_classes(query_enc, verbose=2) \n", | |
"\n", | |
" correct = str(a + b)\n", | |
" guess = ctable.decode(preds[0], calc_argmax=False) \n", | |
" error = int(guess) - int(correct)\n", | |
" print('Q:(', q[::-1] if REVERSE else q, ')', end=' ') \n", | |
" print('T:(', correct, ')', end=' ')\n", | |
" \n", | |
" if int(correct) == int(guess):\n", | |
" print(colors.ok + '☑' + colors.close, end=' ')\n", | |
" else:\n", | |
" print(colors.fail + '☒' + colors.close, end=' ')\n", | |
" print('G:(', guess, ')', end=' ')\n", | |
" print('E:(', error, ')')\n", | |
" \n", | |
" return {\n", | |
" \"error\" : error > 0, \n", | |
" \"seen\" : key in seen\n", | |
" }" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 159, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Q:( 388+791 ) T:( 1179 ) \u001b[92m☑\u001b[0m G:( 1179 ) E:( 0 )\n", | |
"Q:( 378+83 ) T:( 461 ) \u001b[91m☒\u001b[0m G:( 1593 ) E:( 1132 )\n", | |
"Q:( 677+562 ) T:( 1239 ) \u001b[92m☑\u001b[0m G:( 1239 ) E:( 0 )\n", | |
"Q:( 158+562 ) T:( 720 ) \u001b[92m☑\u001b[0m G:( 720 ) E:( 0 )\n", | |
"Q:( 901+829 ) T:( 1730 ) \u001b[91m☒\u001b[0m G:( 1720 ) E:( -10 )\n", | |
"Seen: Q:( 357+249 ) T:( 606 ) \u001b[92m☑\u001b[0m G:( 606 ) E:( 0 )\n", | |
"Q:( 852+967 ) T:( 1819 ) \u001b[92m☑\u001b[0m G:( 1819 ) E:( 0 )\n", | |
"Q:( 257+511 ) T:( 768 ) \u001b[92m☑\u001b[0m G:( 768 ) E:( 0 )\n", | |
"Q:( 328+674 ) T:( 1002 ) \u001b[92m☑\u001b[0m G:( 1002 ) E:( 0 )\n", | |
"Q:( 951+331 ) T:( 1282 ) \u001b[92m☑\u001b[0m G:( 1282 ) E:( 0 )\n", | |
"Q:( 747+56 ) T:( 803 ) \u001b[91m☒\u001b[0m G:( 1483 ) E:( 680 )\n", | |
"Q:( 959+794 ) T:( 1753 ) \u001b[91m☒\u001b[0m G:( 1743 ) E:( -10 )\n", | |
"Q:( 477+934 ) T:( 1411 ) \u001b[92m☑\u001b[0m G:( 1411 ) E:( 0 )\n", | |
"Q:( 769+396 ) T:( 1165 ) \u001b[91m☒\u001b[0m G:( 1155 ) E:( -10 )\n", | |
"Q:( 524+186 ) T:( 710 ) \u001b[92m☑\u001b[0m G:( 710 ) E:( 0 )\n", | |
"Q:( 338+210 ) T:( 548 ) \u001b[92m☑\u001b[0m G:( 548 ) E:( 0 )\n", | |
"Q:( 894+306 ) T:( 1200 ) \u001b[92m☑\u001b[0m G:( 1200 ) E:( 0 )\n", | |
"Q:( 137+32 ) T:( 169 ) \u001b[91m☒\u001b[0m G:( 1130 ) E:( 961 )\n", | |
"Q:( 912+264 ) T:( 1176 ) \u001b[92m☑\u001b[0m G:( 1176 ) E:( 0 )\n", | |
"Q:( 621+196 ) T:( 817 ) \u001b[92m☑\u001b[0m G:( 817 ) E:( 0 )\n", | |
"Q:( 464+898 ) T:( 1362 ) \u001b[92m☑\u001b[0m G:( 1362 ) E:( 0 )\n", | |
"Q:( 653+948 ) T:( 1601 ) \u001b[92m☑\u001b[0m G:( 1601 ) E:( 0 )\n", | |
"Q:( 959+289 ) T:( 1248 ) \u001b[92m☑\u001b[0m G:( 1248 ) E:( 0 )\n", | |
"Q:( 825+805 ) T:( 1630 ) \u001b[92m☑\u001b[0m G:( 1630 ) E:( 0 )\n", | |
"Q:( 569+718 ) T:( 1287 ) \u001b[92m☑\u001b[0m G:( 1287 ) E:( 0 )\n", | |
"Q:( 688+476 ) T:( 1164 ) \u001b[92m☑\u001b[0m G:( 1164 ) E:( 0 )\n", | |
"Q:( 62+950 ) T:( 1012 ) \u001b[91m☒\u001b[0m G:( 1602 ) E:( 590 )\n", | |
"Q:( 640+641 ) T:( 1281 ) \u001b[92m☑\u001b[0m G:( 1281 ) E:( 0 )\n", | |
"Seen: Q:( 694+65 ) T:( 759 ) \u001b[91m☒\u001b[0m G:( 1420 ) E:( 661 )\n", | |
"Q:( 419+281 ) T:( 700 ) \u001b[91m☒\u001b[0m G:( 600 ) E:( -100 )\n", | |
"Q:( 194+26 ) T:( 220 ) \u001b[91m☒\u001b[0m G:( 1261 ) E:( 1041 )\n", | |
"Q:( 551+526 ) T:( 1077 ) \u001b[92m☑\u001b[0m G:( 1077 ) E:( 0 )\n", | |
"Q:( 398+601 ) T:( 999 ) \u001b[91m☒\u001b[0m G:( 109 ) E:( -890 )\n", | |
"Q:( 226+285 ) T:( 511 ) \u001b[92m☑\u001b[0m G:( 511 ) E:( 0 )\n", | |
"Q:( 307+488 ) T:( 795 ) \u001b[92m☑\u001b[0m G:( 795 ) E:( 0 )\n", | |
"Q:( 234+924 ) T:( 1158 ) \u001b[92m☑\u001b[0m G:( 1158 ) E:( 0 )\n", | |
"Q:( 192+463 ) T:( 655 ) \u001b[92m☑\u001b[0m G:( 655 ) E:( 0 )\n", | |
"Q:( 875+544 ) T:( 1419 ) \u001b[92m☑\u001b[0m G:( 1419 ) E:( 0 )\n", | |
"Q:( 185+989 ) T:( 1174 ) \u001b[91m☒\u001b[0m G:( 1164 ) E:( -10 )\n", | |
"Seen: Q:( 624+40 ) T:( 664 ) \u001b[91m☒\u001b[0m G:( 1255 ) E:( 591 )\n", | |
"Q:( 184+988 ) T:( 1172 ) \u001b[92m☑\u001b[0m G:( 1172 ) E:( 0 )\n", | |
"Q:( 161+932 ) T:( 1093 ) \u001b[92m☑\u001b[0m G:( 1093 ) E:( 0 )\n", | |
"Q:( 589+563 ) T:( 1152 ) \u001b[92m☑\u001b[0m G:( 1152 ) E:( 0 )\n", | |
"Q:( 406+990 ) T:( 1396 ) \u001b[92m☑\u001b[0m G:( 1396 ) E:( 0 )\n", | |
"Q:( 425+153 ) T:( 578 ) \u001b[92m☑\u001b[0m G:( 578 ) E:( 0 )\n", | |
"Q:( 183+272 ) T:( 455 ) \u001b[92m☑\u001b[0m G:( 455 ) E:( 0 )\n", | |
"Q:( 488+608 ) T:( 1096 ) \u001b[92m☑\u001b[0m G:( 1096 ) E:( 0 )\n", | |
"Q:( 485+300 ) T:( 785 ) \u001b[92m☑\u001b[0m G:( 785 ) E:( 0 )\n", | |
"Q:( 480+424 ) T:( 904 ) \u001b[91m☒\u001b[0m G:( 804 ) E:( -100 )\n", | |
"Q:( 848+19 ) T:( 867 ) \u001b[91m☒\u001b[0m G:( 1278 ) E:( 411 )\n", | |
"Q:( 69+616 ) T:( 685 ) \u001b[91m☒\u001b[0m G:( 1275 ) E:( 590 )\n", | |
"Q:( 962+66 ) T:( 1028 ) \u001b[91m☒\u001b[0m G:( 1637 ) E:( 609 )\n", | |
"Q:( 859+934 ) T:( 1793 ) \u001b[92m☑\u001b[0m G:( 1793 ) E:( 0 )\n", | |
"Q:( 577+390 ) T:( 967 ) \u001b[92m☑\u001b[0m G:( 967 ) E:( 0 )\n", | |
"Q:( 514+486 ) T:( 1000 ) \u001b[91m☒\u001b[0m G:( 990 ) E:( -10 )\n", | |
"Q:( 341+845 ) T:( 1186 ) \u001b[92m☑\u001b[0m G:( 1186 ) E:( 0 )\n", | |
"Q:( 447+867 ) T:( 1314 ) \u001b[92m☑\u001b[0m G:( 1314 ) E:( 0 )\n", | |
"Q:( 156+246 ) T:( 402 ) \u001b[92m☑\u001b[0m G:( 402 ) E:( 0 )\n", | |
"Q:( 409+349 ) T:( 758 ) \u001b[92m☑\u001b[0m G:( 758 ) E:( 0 )\n", | |
"Q:( 453+718 ) T:( 1171 ) \u001b[92m☑\u001b[0m G:( 1171 ) E:( 0 )\n", | |
"Q:( 531+321 ) T:( 852 ) \u001b[92m☑\u001b[0m G:( 852 ) E:( 0 )\n", | |
"Seen: Q:( 186+12 ) T:( 198 ) \u001b[91m☒\u001b[0m G:( 1130 ) E:( 932 )\n", | |
"Q:( 435+819 ) T:( 1254 ) \u001b[92m☑\u001b[0m G:( 1254 ) E:( 0 )\n", | |
"Q:( 662+513 ) T:( 1175 ) \u001b[92m☑\u001b[0m G:( 1175 ) E:( 0 )\n", | |
"Q:( 267+167 ) T:( 434 ) \u001b[92m☑\u001b[0m G:( 434 ) E:( 0 )\n", | |
"Q:( 502+737 ) T:( 1239 ) \u001b[92m☑\u001b[0m G:( 1239 ) E:( 0 )\n", | |
"Q:( 187+688 ) T:( 875 ) \u001b[92m☑\u001b[0m G:( 875 ) E:( 0 )\n", | |
"Q:( 803+871 ) T:( 1674 ) \u001b[92m☑\u001b[0m G:( 1674 ) E:( 0 )\n", | |
"Seen: Q:( 96+174 ) T:( 270 ) \u001b[91m☒\u001b[0m G:( 770 ) E:( 500 )\n", | |
"Q:( 193+576 ) T:( 769 ) \u001b[92m☑\u001b[0m G:( 769 ) E:( 0 )\n", | |
"Q:( 821+965 ) T:( 1786 ) \u001b[92m☑\u001b[0m G:( 1786 ) E:( 0 )\n", | |
"Seen: Q:( 387+6 ) T:( 393 ) \u001b[91m☒\u001b[0m G:( 1013 ) E:( 620 )\n", | |
"Q:( 575+783 ) T:( 1358 ) \u001b[92m☑\u001b[0m G:( 1358 ) E:( 0 )\n", | |
"Q:( 657+457 ) T:( 1114 ) \u001b[92m☑\u001b[0m G:( 1114 ) E:( 0 )\n", | |
"Q:( 727+250 ) T:( 977 ) \u001b[92m☑\u001b[0m G:( 977 ) E:( 0 )\n", | |
"Q:( 515+845 ) T:( 1360 ) \u001b[91m☒\u001b[0m G:( 1350 ) E:( -10 )\n", | |
"Q:( 392+104 ) T:( 496 ) \u001b[92m☑\u001b[0m G:( 496 ) E:( 0 )\n", | |
"Q:( 296+998 ) T:( 1294 ) \u001b[91m☒\u001b[0m G:( 1285 ) E:( -9 )\n", | |
"Q:( 905+113 ) T:( 1018 ) \u001b[92m☑\u001b[0m G:( 1018 ) E:( 0 )\n", | |
"Q:( 766+154 ) T:( 920 ) \u001b[92m☑\u001b[0m G:( 920 ) E:( 0 )\n", | |
"Q:( 666+534 ) T:( 1200 ) \u001b[91m☒\u001b[0m G:( 1100 ) E:( -100 )\n", | |
"Q:( 193+991 ) T:( 1184 ) \u001b[92m☑\u001b[0m G:( 1184 ) E:( 0 )\n", | |
"Q:( 899+728 ) T:( 1627 ) \u001b[92m☑\u001b[0m G:( 1627 ) E:( 0 )\n", | |
"Q:( 430+130 ) T:( 560 ) \u001b[92m☑\u001b[0m G:( 560 ) E:( 0 )\n", | |
"Q:( 996+29 ) T:( 1025 ) \u001b[91m☒\u001b[0m G:( 1434 ) E:( 409 )\n", | |
"Q:( 557+281 ) T:( 838 ) \u001b[92m☑\u001b[0m G:( 838 ) E:( 0 )\n", | |
"Q:( 934+967 ) T:( 1901 ) \u001b[92m☑\u001b[0m G:( 1901 ) E:( 0 )\n", | |
"Q:( 197+596 ) T:( 793 ) \u001b[91m☒\u001b[0m G:( 783 ) E:( -10 )\n", | |
"Seen: Q:( 998+504 ) T:( 1502 ) \u001b[92m☑\u001b[0m G:( 1502 ) E:( 0 )\n", | |
"Q:( 406+672 ) T:( 1078 ) \u001b[92m☑\u001b[0m G:( 1078 ) E:( 0 )\n", | |
"Q:( 421+397 ) T:( 818 ) \u001b[92m☑\u001b[0m G:( 818 ) E:( 0 )\n", | |
"Q:( 698+428 ) T:( 1126 ) \u001b[92m☑\u001b[0m G:( 1126 ) E:( 0 )\n", | |
"Q:( 168+443 ) T:( 611 ) \u001b[92m☑\u001b[0m G:( 611 ) E:( 0 )\n", | |
"Q:( 891+653 ) T:( 1544 ) \u001b[92m☑\u001b[0m G:( 1544 ) E:( 0 )\n", | |
"Q:( 18+325 ) T:( 343 ) \u001b[91m☒\u001b[0m G:( 843 ) E:( 500 )\n", | |
"Seen: Q:( 2+791 ) T:( 793 ) \u001b[91m☒\u001b[0m G:( 1453 ) E:( 660 )\n", | |
"Q:( 431+593 ) T:( 1024 ) \u001b[92m☑\u001b[0m G:( 1024 ) E:( 0 )\n", | |
"Q:( 582+671 ) T:( 1253 ) \u001b[92m☑\u001b[0m G:( 1253 ) E:( 0 )\n", | |
"Q:( 810+80 ) T:( 890 ) \u001b[91m☒\u001b[0m G:( 130 ) E:( -760 )\n", | |
"Q:( 412+131 ) T:( 543 ) \u001b[91m☒\u001b[0m G:( 542 ) E:( -1 )\n", | |
"Errors: 16/100. Seen: 8\n" | |
] | |
} | |
], | |
"source": [ | |
"errors = 0\n", | |
"seens = 0\n", | |
"num_trials = 100\n", | |
"for i in range(0, num_trials):\n", | |
" res = calculate_add(np.random.randint(0, 999), np.random.randint(0, 999))\n", | |
" errors = errors + res['error']\n", | |
" seens = seens + (res['seen'] != False)\n", | |
"print(\"Errors: {}/{}. Seen: {}\".format(errors, num_trials, seens))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 173, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Seen: Q:( 0+791 ) T:( 791 ) \u001b[91m☒\u001b[0m G:( 1451 ) E:( 660 )\n", | |
"Seen: Q:( 1+791 ) T:( 792 ) \u001b[91m☒\u001b[0m G:( 1452 ) E:( 660 )\n", | |
"Seen: Q:( 2+791 ) T:( 793 ) \u001b[91m☒\u001b[0m G:( 1453 ) E:( 660 )\n", | |
"Seen: Q:( 3+791 ) T:( 794 ) \u001b[91m☒\u001b[0m G:( 1454 ) E:( 660 )\n", | |
"Seen: Q:( 4+791 ) T:( 795 ) \u001b[91m☒\u001b[0m G:( 1455 ) E:( 660 )\n", | |
"Seen: Q:( 5+791 ) T:( 796 ) \u001b[91m☒\u001b[0m G:( 1456 ) E:( 660 )\n", | |
"Seen: Q:( 6+791 ) T:( 797 ) \u001b[91m☒\u001b[0m G:( 1457 ) E:( 660 )\n", | |
"Seen: Q:( 7+791 ) T:( 798 ) \u001b[91m☒\u001b[0m G:( 1458 ) E:( 660 )\n", | |
"Seen: Q:( 8+791 ) T:( 799 ) \u001b[91m☒\u001b[0m G:( 1469 ) E:( 670 )\n", | |
"Seen: Q:( 9+791 ) T:( 800 ) \u001b[91m☒\u001b[0m G:( 1360 ) E:( 560 )\n", | |
"Q:( 10+791 ) T:( 801 ) \u001b[91m☒\u001b[0m G:( 1391 ) E:( 590 )\n", | |
"Q:( 11+791 ) T:( 802 ) \u001b[91m☒\u001b[0m G:( 1392 ) E:( 590 )\n", | |
"Q:( 12+791 ) T:( 803 ) \u001b[91m☒\u001b[0m G:( 1393 ) E:( 590 )\n", | |
"Seen: Q:( 13+791 ) T:( 804 ) \u001b[91m☒\u001b[0m G:( 1394 ) E:( 590 )\n", | |
"Seen: Q:( 14+791 ) T:( 805 ) \u001b[91m☒\u001b[0m G:( 1395 ) E:( 590 )\n", | |
"Q:( 15+791 ) T:( 806 ) \u001b[91m☒\u001b[0m G:( 1396 ) E:( 590 )\n", | |
"Seen: Q:( 16+791 ) T:( 807 ) \u001b[91m☒\u001b[0m G:( 1397 ) E:( 590 )\n", | |
"Q:( 17+791 ) T:( 808 ) \u001b[91m☒\u001b[0m G:( 1398 ) E:( 590 )\n", | |
"Q:( 18+791 ) T:( 809 ) \u001b[91m☒\u001b[0m G:( 1309 ) E:( 500 )\n", | |
"Q:( 19+791 ) T:( 810 ) \u001b[91m☒\u001b[0m G:( 1300 ) E:( 490 )\n", | |
"Q:( 20+791 ) T:( 811 ) \u001b[91m☒\u001b[0m G:( 1401 ) E:( 590 )\n", | |
"Seen: Q:( 21+791 ) T:( 812 ) \u001b[91m☒\u001b[0m G:( 1402 ) E:( 590 )\n", | |
"Seen: Q:( 22+791 ) T:( 813 ) \u001b[91m☒\u001b[0m G:( 1303 ) E:( 490 )\n", | |
"Q:( 23+791 ) T:( 814 ) \u001b[91m☒\u001b[0m G:( 1304 ) E:( 490 )\n", | |
"Q:( 24+791 ) T:( 815 ) \u001b[91m☒\u001b[0m G:( 1405 ) E:( 590 )\n", | |
"Seen: Q:( 25+791 ) T:( 816 ) \u001b[91m☒\u001b[0m G:( 1406 ) E:( 590 )\n", | |
"Q:( 26+791 ) T:( 817 ) \u001b[91m☒\u001b[0m G:( 1407 ) E:( 590 )\n", | |
"Seen: Q:( 27+791 ) T:( 818 ) \u001b[91m☒\u001b[0m G:( 1408 ) E:( 590 )\n", | |
"Q:( 28+791 ) T:( 819 ) \u001b[91m☒\u001b[0m G:( 1409 ) E:( 590 )\n", | |
"Q:( 29+791 ) T:( 820 ) \u001b[91m☒\u001b[0m G:( 1410 ) E:( 590 )\n", | |
"Q:( 30+791 ) T:( 821 ) \u001b[91m☒\u001b[0m G:( 1411 ) E:( 590 )\n", | |
"Q:( 31+791 ) T:( 822 ) \u001b[91m☒\u001b[0m G:( 1412 ) E:( 590 )\n", | |
"Q:( 32+791 ) T:( 823 ) \u001b[91m☒\u001b[0m G:( 1413 ) E:( 590 )\n", | |
"Q:( 33+791 ) T:( 824 ) \u001b[91m☒\u001b[0m G:( 1414 ) E:( 590 )\n", | |
"Seen: Q:( 34+791 ) T:( 825 ) \u001b[91m☒\u001b[0m G:( 1415 ) E:( 590 )\n", | |
"Q:( 35+791 ) T:( 826 ) \u001b[91m☒\u001b[0m G:( 1416 ) E:( 590 )\n", | |
"Seen: Q:( 36+791 ) T:( 827 ) \u001b[91m☒\u001b[0m G:( 1417 ) E:( 590 )\n", | |
"Seen: Q:( 37+791 ) T:( 828 ) \u001b[91m☒\u001b[0m G:( 1418 ) E:( 590 )\n", | |
"Q:( 38+791 ) T:( 829 ) \u001b[91m☒\u001b[0m G:( 1429 ) E:( 600 )\n", | |
"Seen: Q:( 39+791 ) T:( 830 ) \u001b[91m☒\u001b[0m G:( 1420 ) E:( 590 )\n", | |
"Q:( 40+791 ) T:( 831 ) \u001b[91m☒\u001b[0m G:( 1431 ) E:( 600 )\n", | |
"Q:( 41+791 ) T:( 832 ) \u001b[91m☒\u001b[0m G:( 1432 ) E:( 600 )\n", | |
"Q:( 42+791 ) T:( 833 ) \u001b[91m☒\u001b[0m G:( 1433 ) E:( 600 )\n", | |
"Q:( 43+791 ) T:( 834 ) \u001b[91m☒\u001b[0m G:( 1334 ) E:( 500 )\n", | |
"Q:( 44+791 ) T:( 835 ) \u001b[91m☒\u001b[0m G:( 1425 ) E:( 590 )\n", | |
"Seen: Q:( 45+791 ) T:( 836 ) \u001b[91m☒\u001b[0m G:( 1426 ) E:( 590 )\n", | |
"Q:( 46+791 ) T:( 837 ) \u001b[91m☒\u001b[0m G:( 1437 ) E:( 600 )\n", | |
"Q:( 47+791 ) T:( 838 ) \u001b[91m☒\u001b[0m G:( 1438 ) E:( 600 )\n", | |
"Q:( 48+791 ) T:( 839 ) \u001b[91m☒\u001b[0m G:( 1439 ) E:( 600 )\n", | |
"Q:( 49+791 ) T:( 840 ) \u001b[91m☒\u001b[0m G:( 1430 ) E:( 590 )\n", | |
"Q:( 50+791 ) T:( 841 ) \u001b[91m☒\u001b[0m G:( 1441 ) E:( 600 )\n", | |
"Q:( 51+791 ) T:( 842 ) \u001b[91m☒\u001b[0m G:( 1442 ) E:( 600 )\n", | |
"Seen: Q:( 52+791 ) T:( 843 ) \u001b[91m☒\u001b[0m G:( 1443 ) E:( 600 )\n", | |
"Seen: Q:( 53+791 ) T:( 844 ) \u001b[91m☒\u001b[0m G:( 1444 ) E:( 600 )\n", | |
"Q:( 54+791 ) T:( 845 ) \u001b[91m☒\u001b[0m G:( 1445 ) E:( 600 )\n", | |
"Seen: Q:( 55+791 ) T:( 846 ) \u001b[91m☒\u001b[0m G:( 1436 ) E:( 590 )\n", | |
"Q:( 56+791 ) T:( 847 ) \u001b[91m☒\u001b[0m G:( 1447 ) E:( 600 )\n", | |
"Q:( 57+791 ) T:( 848 ) \u001b[91m☒\u001b[0m G:( 1448 ) E:( 600 )\n", | |
"Q:( 58+791 ) T:( 849 ) \u001b[91m☒\u001b[0m G:( 1449 ) E:( 600 )\n", | |
"Q:( 59+791 ) T:( 850 ) \u001b[91m☒\u001b[0m G:( 1450 ) E:( 600 )\n", | |
"Seen: Q:( 60+791 ) T:( 851 ) \u001b[91m☒\u001b[0m G:( 1451 ) E:( 600 )\n", | |
"Q:( 61+791 ) T:( 852 ) \u001b[91m☒\u001b[0m G:( 1452 ) E:( 600 )\n", | |
"Q:( 62+791 ) T:( 853 ) \u001b[91m☒\u001b[0m G:( 1453 ) E:( 600 )\n", | |
"Seen: Q:( 63+791 ) T:( 854 ) \u001b[91m☒\u001b[0m G:( 1454 ) E:( 600 )\n", | |
"Q:( 64+791 ) T:( 855 ) \u001b[91m☒\u001b[0m G:( 1455 ) E:( 600 )\n", | |
"Q:( 65+791 ) T:( 856 ) \u001b[91m☒\u001b[0m G:( 1456 ) E:( 600 )\n", | |
"Seen: Q:( 66+791 ) T:( 857 ) \u001b[91m☒\u001b[0m G:( 1457 ) E:( 600 )\n", | |
"Q:( 67+791 ) T:( 858 ) \u001b[91m☒\u001b[0m G:( 1458 ) E:( 600 )\n", | |
"Seen: Q:( 68+791 ) T:( 859 ) \u001b[91m☒\u001b[0m G:( 1459 ) E:( 600 )\n", | |
"Q:( 69+791 ) T:( 860 ) \u001b[91m☒\u001b[0m G:( 1360 ) E:( 500 )\n", | |
"Q:( 70+791 ) T:( 861 ) \u001b[91m☒\u001b[0m G:( 1461 ) E:( 600 )\n", | |
"Q:( 71+791 ) T:( 862 ) \u001b[91m☒\u001b[0m G:( 1462 ) E:( 600 )\n", | |
"Q:( 72+791 ) T:( 863 ) \u001b[91m☒\u001b[0m G:( 1363 ) E:( 500 )\n", | |
"Q:( 73+791 ) T:( 864 ) \u001b[91m☒\u001b[0m G:( 1364 ) E:( 500 )\n", | |
"Q:( 74+791 ) T:( 865 ) \u001b[91m☒\u001b[0m G:( 1365 ) E:( 500 )\n", | |
"Q:( 75+791 ) T:( 866 ) \u001b[91m☒\u001b[0m G:( 1366 ) E:( 500 )\n", | |
"Q:( 76+791 ) T:( 867 ) \u001b[91m☒\u001b[0m G:( 1367 ) E:( 500 )\n", | |
"Q:( 77+791 ) T:( 868 ) \u001b[91m☒\u001b[0m G:( 1368 ) E:( 500 )\n", | |
"Seen: Q:( 78+791 ) T:( 869 ) \u001b[91m☒\u001b[0m G:( 1369 ) E:( 500 )\n", | |
"Q:( 79+791 ) T:( 870 ) \u001b[91m☒\u001b[0m G:( 1370 ) E:( 500 )\n", | |
"Q:( 80+791 ) T:( 871 ) \u001b[91m☒\u001b[0m G:( 1370 ) E:( 499 )\n", | |
"Seen: Q:( 81+791 ) T:( 872 ) \u001b[91m☒\u001b[0m G:( 1372 ) E:( 500 )\n", | |
"Q:( 82+791 ) T:( 873 ) \u001b[91m☒\u001b[0m G:( 1373 ) E:( 500 )\n", | |
"Q:( 83+791 ) T:( 874 ) \u001b[91m☒\u001b[0m G:( 1374 ) E:( 500 )\n", | |
"Q:( 84+791 ) T:( 875 ) \u001b[91m☒\u001b[0m G:( 1375 ) E:( 500 )\n", | |
"Seen: Q:( 85+791 ) T:( 876 ) \u001b[91m☒\u001b[0m G:( 1376 ) E:( 500 )\n", | |
"Q:( 86+791 ) T:( 877 ) \u001b[91m☒\u001b[0m G:( 1377 ) E:( 500 )\n", | |
"Q:( 87+791 ) T:( 878 ) \u001b[91m☒\u001b[0m G:( 1378 ) E:( 500 )\n", | |
"Seen: Q:( 88+791 ) T:( 879 ) \u001b[91m☒\u001b[0m G:( 1379 ) E:( 500 )\n", | |
"Q:( 89+791 ) T:( 880 ) \u001b[91m☒\u001b[0m G:( 1380 ) E:( 500 )\n", | |
"Seen: Q:( 90+791 ) T:( 881 ) \u001b[91m☒\u001b[0m G:( 1470 ) E:( 589 )\n", | |
"Q:( 91+791 ) T:( 882 ) \u001b[91m☒\u001b[0m G:( 1381 ) E:( 499 )\n", | |
"Seen: Q:( 92+791 ) T:( 883 ) \u001b[91m☒\u001b[0m G:( 1383 ) E:( 500 )\n", | |
"Q:( 93+791 ) T:( 884 ) \u001b[91m☒\u001b[0m G:( 1384 ) E:( 500 )\n", | |
"Q:( 94+791 ) T:( 885 ) \u001b[91m☒\u001b[0m G:( 1485 ) E:( 600 )\n", | |
"Q:( 95+791 ) T:( 886 ) \u001b[91m☒\u001b[0m G:( 1486 ) E:( 600 )\n", | |
"Q:( 96+791 ) T:( 887 ) \u001b[91m☒\u001b[0m G:( 1487 ) E:( 600 )\n", | |
"Q:( 97+791 ) T:( 888 ) \u001b[91m☒\u001b[0m G:( 1388 ) E:( 500 )\n", | |
"Seen: Q:( 98+791 ) T:( 889 ) \u001b[91m☒\u001b[0m G:( 1389 ) E:( 500 )\n", | |
"Q:( 99+791 ) T:( 890 ) \u001b[91m☒\u001b[0m G:( 1380 ) E:( 490 )\n", | |
"Seen: Q:( 100+791 ) T:( 891 ) \u001b[92m☑\u001b[0m G:( 891 ) E:( 0 )\n" | |
] | |
} | |
], | |
"source": [ | |
"for i in range(0,101):\n", | |
" calculate_add(i, 791)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.4.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment