|
25 | 25 | "from tensorflow.keras.models import Sequential, load_model\n",
|
26 | 26 | "from keras.datasets import mnist\n",
|
27 | 27 | "import itertools\n",
|
28 |
| - "import random\n", |
29 |
| - "random.seed(42)" |
| 28 | + "import random" |
30 | 29 | ]
|
31 | 30 | },
|
32 | 31 | {
|
|
37 | 36 | "\n",
|
38 | 37 | "- **Task**: take as input two MNIST images and through a neural network return the value of the minimum digit\n",
|
39 | 38 | "\n",
|
40 |
| - "- **Parameters**: no intermediate values can be used, ie a classifier that reveals what digits the images represent cannot be followed by logic to choose the lowest value\n", |
| 39 | + "- **Restrictions**: no intermediate labels can be used, ie a classifier that reveals what digits the images represent cannot be followed by logic to choose the minimum value\n", |
41 | 40 | "\n",
|
42 | 41 | "- **Approach**: as a variation of Gonzalo's proposed method, place images side-by-side and then make the label of that combined image be the minimum value\n",
|
43 | 42 | "\n",
|
|
46 | 45 | },
|
47 | 46 | {
|
48 | 47 | "cell_type": "code",
|
49 |
| - "execution_count": 3, |
| 48 | + "execution_count": 2, |
50 | 49 | "metadata": {},
|
51 | 50 | "outputs": [],
|
52 | 51 | "source": [
|
| 52 | + "# Load data and split into training and test\n", |
53 | 53 | "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()"
|
54 | 54 | ]
|
55 | 55 | },
|
56 | 56 | {
|
57 | 57 | "cell_type": "code",
|
58 |
| - "execution_count": 4, |
| 58 | + "execution_count": 3, |
59 | 59 | "metadata": {},
|
60 | 60 | "outputs": [
|
61 | 61 | {
|
|
68 | 68 | {
|
69 | 69 | "data": {
|
70 | 70 | "text/plain": [
|
71 |
| - "<matplotlib.image.AxesImage at 0x103f4a940>" |
| 71 | + "<matplotlib.image.AxesImage at 0x10fb346d0>" |
72 | 72 | ]
|
73 | 73 | },
|
74 |
| - "execution_count": 4, |
| 74 | + "execution_count": 3, |
75 | 75 | "metadata": {},
|
76 | 76 | "output_type": "execute_result"
|
77 | 77 | },
|
|
96 | 96 | },
|
97 | 97 | {
|
98 | 98 | "cell_type": "code",
|
99 |
| - "execution_count": 5, |
| 99 | + "execution_count": 4, |
100 | 100 | "metadata": {},
|
101 | 101 | "outputs": [
|
102 | 102 | {
|
103 | 103 | "data": {
|
104 | 104 | "text/plain": [
|
105 |
| - "<matplotlib.image.AxesImage at 0x1136994f0>" |
| 105 | + "<matplotlib.image.AxesImage at 0x11f2e14f0>" |
106 | 106 | ]
|
107 | 107 | },
|
108 |
| - "execution_count": 5, |
| 108 | + "execution_count": 4, |
109 | 109 | "metadata": {},
|
110 | 110 | "output_type": "execute_result"
|
111 | 111 | },
|
|
129 | 129 | },
|
130 | 130 | {
|
131 | 131 | "cell_type": "code",
|
132 |
| - "execution_count": 6, |
| 132 | + "execution_count": 5, |
133 | 133 | "metadata": {},
|
134 | 134 | "outputs": [
|
135 | 135 | {
|
136 | 136 | "data": {
|
137 | 137 | "text/plain": [
|
138 |
| - "<matplotlib.image.AxesImage at 0x1136f8460>" |
| 138 | + "<matplotlib.image.AxesImage at 0x11f34d6a0>" |
139 | 139 | ]
|
140 | 140 | },
|
141 |
| - "execution_count": 6, |
| 141 | + "execution_count": 5, |
142 | 142 | "metadata": {},
|
143 | 143 | "output_type": "execute_result"
|
144 | 144 | },
|
|
162 | 162 | },
|
163 | 163 | {
|
164 | 164 | "cell_type": "code",
|
165 |
| - "execution_count": 7, |
| 165 | + "execution_count": 6, |
166 | 166 | "metadata": {},
|
167 | 167 | "outputs": [],
|
168 | 168 | "source": [
|
|
180 | 180 | },
|
181 | 181 | {
|
182 | 182 | "cell_type": "code",
|
183 |
| - "execution_count": 14, |
| 183 | + "execution_count": 7, |
184 | 184 | "metadata": {},
|
185 | 185 | "outputs": [],
|
186 | 186 | "source": [
|
|
219 | 219 | },
|
220 | 220 | {
|
221 | 221 | "cell_type": "code",
|
222 |
| - "execution_count": 15, |
| 222 | + "execution_count": 8, |
223 | 223 | "metadata": {},
|
224 | 224 | "outputs": [],
|
225 | 225 | "source": [
|
|
257 | 257 | },
|
258 | 258 | {
|
259 | 259 | "cell_type": "code",
|
260 |
| - "execution_count": 16, |
| 260 | + "execution_count": 9, |
| 261 | + "metadata": {}, |
| 262 | + "outputs": [ |
| 263 | + { |
| 264 | + "data": { |
| 265 | + "text/plain": [ |
| 266 | + "(400000, 28, 56)" |
| 267 | + ] |
| 268 | + }, |
| 269 | + "execution_count": 9, |
| 270 | + "metadata": {}, |
| 271 | + "output_type": "execute_result" |
| 272 | + } |
| 273 | + ], |
| 274 | + "source": [ |
| 275 | + "combo_train_X.shape" |
| 276 | + ] |
| 277 | + }, |
| 278 | + { |
| 279 | + "cell_type": "code", |
| 280 | + "execution_count": 10, |
261 | 281 | "metadata": {},
|
262 | 282 | "outputs": [],
|
263 | 283 | "source": [
|
264 | 284 | "# Reshape the data so they can be fed into the network, one-hot-encode the labels\n",
|
265 | 285 | "\n",
|
266 | 286 | "train_images = combo_train_X.reshape((combo_train_X.shape[0], 28, 56, 1))\n",
|
267 |
| - "train_images = train_images.astype('float32')/ 255\n", |
| 287 | + "train_images = train_images/ 255\n", |
268 | 288 | "\n",
|
269 | 289 | "val_images = combo_val_X.reshape((combo_val_X.shape[0], 28, 56, 1))\n",
|
270 |
| - "val_images = val_images.astype('float32')/255\n", |
| 290 | + "val_images = val_images/255\n", |
271 | 291 | "\n",
|
272 | 292 | "train_labels = to_categorical(combo_train_y)\n",
|
273 | 293 | "val_labels = to_categorical(combo_val_y)"
|
274 | 294 | ]
|
275 | 295 | },
|
276 | 296 | {
|
277 | 297 | "cell_type": "code",
|
278 |
| - "execution_count": 19, |
| 298 | + "execution_count": 11, |
279 | 299 | "metadata": {},
|
280 | 300 | "outputs": [
|
281 | 301 | {
|
|
323 | 343 | "model.add(layers.Conv2D(64, (3,3), activation = 'relu'))\n",
|
324 | 344 | "# Adding a NN Classifier\n",
|
325 | 345 | "model.add(layers.Flatten())\n",
|
326 |
| - "model.add(layers.Dropout(0.5))\n", |
327 | 346 | "model.add(layers.Dense(64, activation = 'relu'))\n",
|
328 | 347 | "model.add(layers.Dense(10, activation = 'softmax'))\n",
|
329 | 348 | "\n",
|
|
332 | 351 | },
|
333 | 352 | {
|
334 | 353 | "cell_type": "code",
|
335 |
| - "execution_count": 33, |
| 354 | + "execution_count": 12, |
336 | 355 | "metadata": {},
|
337 | 356 | "outputs": [],
|
338 | 357 | "source": [
|
|
345 | 364 | },
|
346 | 365 | {
|
347 | 366 | "cell_type": "code",
|
348 |
| - "execution_count": 14, |
| 367 | + "execution_count": 13, |
349 | 368 | "metadata": {},
|
350 | 369 | "outputs": [
|
351 | 370 | {
|
352 | 371 | "name": "stdout",
|
353 | 372 | "output_type": "stream",
|
354 | 373 | "text": [
|
355 |
| - "Epoch 1/4\n", |
356 |
| - "4688/4688 [==============================] - 255s 54ms/step - loss: 0.3645 - mae: 0.0359 - accuracy: 0.8823\n", |
357 |
| - "Epoch 2/4\n", |
358 |
| - "4688/4688 [==============================] - 251s 54ms/step - loss: 0.1282 - mae: 0.0127 - accuracy: 0.9599\n", |
359 |
| - "Epoch 3/4\n", |
360 |
| - "4688/4688 [==============================] - 257s 55ms/step - loss: 0.0884 - mae: 0.0086 - accuracy: 0.9722\n", |
361 |
| - "Epoch 4/4\n", |
362 |
| - "4688/4688 [==============================] - 257s 55ms/step - loss: 0.0697 - mae: 0.0067 - accuracy: 0.9779\n" |
| 374 | + "Epoch 1/8\n", |
| 375 | + "2734/6250 [============>.................] - ETA: 3:43 - loss: 0.5052 - mae: 0.0491 - accuracy: 0.8365" |
363 | 376 | ]
|
364 | 377 | },
|
365 | 378 | {
|
366 |
| - "data": { |
367 |
| - "text/plain": [ |
368 |
| - "<tensorflow.python.keras.callbacks.History at 0x11ca224c0>" |
369 |
| - ] |
370 |
| - }, |
371 |
| - "execution_count": 14, |
372 |
| - "metadata": {}, |
373 |
| - "output_type": "execute_result" |
| 379 | + "ename": "KeyboardInterrupt", |
| 380 | + "evalue": "", |
| 381 | + "output_type": "error", |
| 382 | + "traceback": [ |
| 383 | + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
| 384 | + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", |
| 385 | + "\u001b[0;32m<ipython-input-13-203dbf38761e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Fit model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m model.fit(train_images, \n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mtrain_labels\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mepochs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m batch_size = 64)\n", |
| 386 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1181\u001b[0m _r=1):\n\u001b[1;32m 1182\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_train_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1183\u001b[0;31m \u001b[0mtmp_logs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1184\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1185\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 387 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 887\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 888\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mOptionalXlaContext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jit_compile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 890\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 891\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 388 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 915\u001b[0m \u001b[0;31m# In this case we have created variables on the first call, so we run the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0;31m# defunned version which is guaranteed to never create variables.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 917\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateless_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# pylint: disable=not-callable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 918\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateful_fn\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 919\u001b[0m \u001b[0;31m# Release the lock early so that multiple threads can perform the call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 389 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 3021\u001b[0m (graph_function,\n\u001b[1;32m 3022\u001b[0m filtered_flat_args) = self._maybe_define_function(args, kwargs)\n\u001b[0;32m-> 3023\u001b[0;31m return graph_function._call_flat(\n\u001b[0m\u001b[1;32m 3024\u001b[0m filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access\n\u001b[1;32m 3025\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", |
| 390 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, args, captured_inputs, cancellation_manager)\u001b[0m\n\u001b[1;32m 1958\u001b[0m and executing_eagerly):\n\u001b[1;32m 1959\u001b[0m \u001b[0;31m# No tape is watching; skip to running the function.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1960\u001b[0;31m return self._build_call_outputs(self._inference_function.call(\n\u001b[0m\u001b[1;32m 1961\u001b[0m ctx, args, cancellation_manager=cancellation_manager))\n\u001b[1;32m 1962\u001b[0m forward_backward = self._select_forward_and_backward_functions(\n", |
| 391 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self, ctx, args, cancellation_manager)\u001b[0m\n\u001b[1;32m 589\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0m_InterpolateFunctionError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcancellation_manager\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 591\u001b[0;31m outputs = execute.execute(\n\u001b[0m\u001b[1;32m 592\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 593\u001b[0m \u001b[0mnum_outputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_outputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 392 | + "\u001b[0;32m/usr/local/lib/python3.9/site-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_initialized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 59\u001b[0;31m tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,\n\u001b[0m\u001b[1;32m 60\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 61\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 393 | + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " |
| 394 | + ] |
374 | 395 | }
|
375 | 396 | ],
|
376 | 397 | "source": [
|
|
383 | 404 | },
|
384 | 405 | {
|
385 | 406 | "cell_type": "code",
|
386 |
| - "execution_count": 20, |
| 407 | + "execution_count": null, |
387 | 408 | "metadata": {},
|
388 | 409 | "outputs": [],
|
389 | 410 | "source": [
|
|
0 commit comments