Created
May 14, 2018 02:45
-
-
Save trishume/99a161c5c3653c08edfbf9e1cd6d27a5 to your computer and use it in GitHub Desktop.
DEF CON Quals 2018 Flagsifier Notebook
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": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# DC Quals Flagsifier\n", | |
"\n", | |
"Summary of the solution for posterity: load up the EMNIST dataset and write functions to compose strings into images like the examples and run them through the net, find the category with the highest activation for `OOO` and then blank space, then go character by character choosing the character that gives the highest activation out of 30 random samples of that character from the dataset. Repeat this process starting from the previous result and tuning it up character by character, so any cross-character dependencies in the dense layer can be satisfied. Get a garbled mess with one intelligible word, everyone contributes to figuring out a meaningful english interpretation out of all the mistakes.\n", | |
"\n", | |
"Key tactics: I think stripping the softmax from the end so that there's more resolution in the feedback for hill climbing, and doing a second tuning pass were both necessary but they're non-obvious. I'm also guessing that it's hard to get deep dream to get you something readable, because otherwise someone would have done it, although it may be that it would only work with stripping the softmax and nobody tried that yet." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 155, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from keras.models import load_model\n", | |
"from keras.preprocessing import image\n", | |
"import keras\n", | |
"import numpy as np\n", | |
"from scipy import io as spio\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 177, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"conv2d_1 (Conv2D) (None, 26, 1062, 32) 320 \n", | |
"_________________________________________________________________\n", | |
"activation_1 (Activation) (None, 26, 1062, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"average_pooling2d_1 (Average (None, 13, 531, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_1 (Dropout) (None, 13, 531, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_2 (Conv2D) (None, 11, 529, 32) 9248 \n", | |
"_________________________________________________________________\n", | |
"activation_2 (Activation) (None, 11, 529, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"average_pooling2d_2 (Average (None, 5, 264, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_2 (Dropout) (None, 5, 264, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_3 (Conv2D) (None, 3, 262, 64) 18496 \n", | |
"_________________________________________________________________\n", | |
"activation_3 (Activation) (None, 3, 262, 64) 0 \n", | |
"_________________________________________________________________\n", | |
"average_pooling2d_3 (Average (None, 1, 131, 64) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_3 (Dropout) (None, 1, 131, 64) 0 \n", | |
"_________________________________________________________________\n", | |
"flatten_1 (Flatten) (None, 8384) 0 \n", | |
"_________________________________________________________________\n", | |
"dense_1 (Dense) (None, 512) 4293120 \n", | |
"_________________________________________________________________\n", | |
"activation_4 (Activation) (None, 512) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_4 (Dropout) (None, 512) 0 \n", | |
"_________________________________________________________________\n", | |
"dense_2 (Dense) (None, 40) 20520 \n", | |
"_________________________________________________________________\n", | |
"activation_5 (Activation) (None, 40) 0 \n", | |
"=================================================================\n", | |
"Total params: 4,341,704\n", | |
"Trainable params: 4,341,704\n", | |
"Non-trainable params: 0\n", | |
"_________________________________________________________________\n", | |
"<function linear at 0x1141b7268>\n", | |
"<keras.models.Sequential object at 0x124009da0>\n" | |
] | |
} | |
], | |
"source": [ | |
"# model_lin.h5 is just model.h5 with the JSON model description in the binary\n", | |
"# for the last layer patched from \"softmax\", to \"linear\" ,\n", | |
"# because of the way compilation works, patching was easiest\n", | |
"model = load_model('model_lin.h5')\n", | |
"model.summary()\n", | |
"print(model.get_layer(name='activation_5').activation)\n", | |
"print(model)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(None, 28, 1064, 1)" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"model.input_shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 170, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# model.get_layer(name='activation_5').activation = keras.activations.linear" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# EMNIST Loading" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 246, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"emnist = spio.loadmat(\"emnist/emnist-bymerge.mat\")\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 247, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(697932, 784)" | |
] | |
}, | |
"execution_count": 247, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# load training dataset\n", | |
"x_train = emnist[\"dataset\"][0][0][0][0][0][0]\n", | |
"x_train = x_train.astype(np.float32)\n", | |
"\n", | |
"# load training labels\n", | |
"y_train = emnist[\"dataset\"][0][0][0][0][0][1]\n", | |
"# load test dataset\n", | |
"x_test = emnist[\"dataset\"][0][0][1][0][0][0]\n", | |
"x_test = x_test.astype(np.float32)\n", | |
"\n", | |
"# load test labels\n", | |
"y_test = emnist[\"dataset\"][0][0][1][0][0][1]\n", | |
"\n", | |
"x_train.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 248, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(697932, 28, 28, 1)" | |
] | |
}, | |
"execution_count": 248, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# reshape using matlab order\n", | |
"x_train = x_train.reshape(x_train.shape[0], 28, 28, 1, order=\"A\")\n", | |
"x_test = x_test.reshape(x_test.shape[0], 28, 28, 1, order=\"A\")\n", | |
"x_train.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 249, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(697932, 1)" | |
] | |
}, | |
"execution_count": 249, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"y_train.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 250, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(281109, 28, 28, 1)" | |
] | |
}, | |
"execution_count": 250, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"x_uppercase = np.concatenate((x_train,x_test))\n", | |
"y_uppercase = np.concatenate((y_train,y_test))\n", | |
"\n", | |
"is_uppercase = (y_uppercase >= 10) & (y_uppercase <= 35)\n", | |
"x_uppercase = x_uppercase[is_uppercase[:,0]]\n", | |
"y_uppercase = y_uppercase[is_uppercase]\n", | |
"\n", | |
"x_uppercase.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 262, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# 10=A 35=Z\n", | |
"# samplei = np.where(y_uppercase == 35)[0][0]\n", | |
"samplei = 76230\n", | |
"img = x_uppercase[samplei]\n", | |
"\n", | |
"# visualize image\n", | |
"def showlet(img):\n", | |
" plt.imshow(img.reshape(img.shape[0],img.shape[1]), cmap='gray')\n", | |
"\n", | |
"showlet(img)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 259, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.image.AxesImage at 0x124e48048>" | |
] | |
}, | |
"execution_count": 259, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"sample_img = image.load_img('images/sample_0.png', target_size=(28, 1064), grayscale=True)\n", | |
"sample_img = image.img_to_array(sample_img)\n", | |
"i = 28*22\n", | |
"img = sample_img[0:28,i+0:i+28]\n", | |
"plt.imshow(img.reshape(img.shape[0],img.shape[1]), cmap='gray')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 260, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"76230\n" | |
] | |
} | |
], | |
"source": [ | |
"haystack = x_uppercase\n", | |
"for i in range(haystack.shape[0]):\n", | |
" img2 = haystack[i]\n", | |
" if np.array_equal(img, img2):\n", | |
" print(i)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Figuring out categories\n", | |
"\n", | |
"There's a 40 class categorical output, I have no idea what the classes are." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"index = {}\n", | |
"for i in range(10,36):\n", | |
" index[i] = np.where(y_uppercase == i)[0][0]\n", | |
"index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 280, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(array([[-10.2729225 , -6.246442 , 21.704496 , 9.9872465 ,\n", | |
" -1.4535668 , -11.526137 , -11.214999 , -8.216931 ,\n", | |
" -3.161952 , -6.9192376 , -10.277658 , -9.55106 ,\n", | |
" -1.7620567 , 0.70177466, -12.314412 , -8.018769 ,\n", | |
" -1.6116011 , -5.5214314 , -9.404995 , -7.675523 ,\n", | |
" -0.7550617 , -10.754059 , -1.7025601 , -0.04662082,\n", | |
" -12.097055 , -4.800998 , -5.375687 , -13.148593 ,\n", | |
" -6.128149 , -14.216559 , -1.9360402 , -12.2938595 ,\n", | |
" -0.99819237, -6.7235403 , -9.595497 , -11.14351 ,\n", | |
" -6.8396316 , -13.304192 , -4.475975 , -6.852819 ]],\n", | |
" dtype=float32), array([2]), 21.704496)" | |
] | |
}, | |
"execution_count": 280, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"space = np.zeros((28,28,1))\n", | |
"\n", | |
"def pick_letter(cls):\n", | |
" if cls == -23: # space\n", | |
" return -1\n", | |
" poss = np.where(y_uppercase == cls)[0]\n", | |
" return np.random.choice(poss)\n", | |
"\n", | |
"def compose_image(s, seed=42):\n", | |
" np.random.seed(seed)\n", | |
" classes = [ord(c)-ord('A')+10 for c in s]\n", | |
" indices = [pick_letter(c) for c in classes]\n", | |
" letters = [(x_uppercase[i] if i > 0 else space) for i in indices]\n", | |
" img = np.hstack(np.array(letters))\n", | |
" return img\n", | |
"\n", | |
"# s1 = 'MOLDERINGIINTELSDEDUCINGCOYNESSDEFIECT'\n", | |
"# s1 = ' ' * 38\n", | |
"s1 = 'OOOSNMFMWTASNJLOIWTCKLIUCWCCXSGTCUIETJ'\n", | |
"s2 = 'O' * len(s1)\n", | |
"i = 3\n", | |
"\n", | |
"# img = compose_image('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')\n", | |
"img = compose_image(s2[:i] + s1[i:])\n", | |
"showlet(img)\n", | |
"\n", | |
"probs = model.predict(np.expand_dims(img,axis=0) / 255.0)\n", | |
"classes = probs.argmax(axis=1)\n", | |
"probs2 = probs\n", | |
"(probs,classes,probs[0,classes[0]])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 300, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Starting\n", | |
"(30, 'OOOSOMEAUTHENTICINTELLIGENCEISRTQUIVCT', 327, 'R', 56.426052)\n", | |
"(31, 'OOOSOMEAUTHENTICINTELLIGENCEISRSQUIVCT', 348, 'S', 56.597042)\n", | |
"(32, 'OOOSOMEAUTHENTICINTELLIGENCEISRSDUIVCT', 350, 'D', 56.515118)\n", | |
"(33, 'OOOSOMEAUTHENTICINTELLIGENCEISRSDUIVCT', 325, 'U', 56.4094)\n" | |
] | |
}, | |
{ | |
"ename": "KeyboardInterrupt", | |
"evalue": "", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Starting\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0mseeds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m936\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m936\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m936\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m940\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m951\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m952\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m941\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m960\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m947\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m949\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m944\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m948\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m957\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m948\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m951\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m943\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m950\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m948\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m947\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m957\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m957\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m957\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m943\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m940\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m943\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m937\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m934\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m960\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m948\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m942\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m956\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m936\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m \u001b[0msearch_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'OOOSOMEAUTHENTICINTELLIGENCEISRTQUIVCT'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m40\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseed_base\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m323\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 64\u001b[0m \u001b[0;31m# OOOSNMFMWTASNJLOIWTCKLIUCWCCXSGTCUIETJ\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0;31m# OONJOMCMNTMSNTIUINTTILIGCWCCISKCONIRFT\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36msearch_all\u001b[0;34m(base, base_seeds, cls, tries, seed_base, start)\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0mseeds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase_seeds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m38\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 52\u001b[0;31m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mseed\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfind_best\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtries\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseed_base\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 53\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0mseeds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36mfind_best\u001b[0;34m(i, base_s, base_seeds, cls, tries, seed_base)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0mseeds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase_seeds\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 40\u001b[0m \u001b[0mseeds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mprob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtest_with\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseeds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mprob\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mmax_prob\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mbest_c\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36mtest_with\u001b[0;34m(s, seeds)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m# print(s)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mfull_seeds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseeds\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m38\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseeds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompose_image2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mljust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m38\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfull_seeds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 23\u001b[0m \u001b[0;31m# showlet(img)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0minp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36mcompose_image2\u001b[0;34m(s, seeds)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# print(s)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mclasses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mord\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mord\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m10\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mindices\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mpick_letter2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclasses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseeds\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 15\u001b[0m \u001b[0mletters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_uppercase\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mspace\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mletters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# print(s)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mclasses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mord\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mord\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m10\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mindices\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mpick_letter2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclasses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseeds\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 15\u001b[0m \u001b[0mletters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_uppercase\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mspace\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mletters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<ipython-input-300-8d5977e9b505>\u001b[0m in \u001b[0;36mpick_letter2\u001b[0;34m(cls, s)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# print(cls)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mposs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_uppercase\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchoice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mposs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m: " | |
] | |
} | |
], | |
"source": [ | |
"space = np.zeros((28,28,1))\n", | |
"\n", | |
"def pick_letter2(cls,s):\n", | |
" if cls == -23: # space\n", | |
" return -1\n", | |
"# print(cls)\n", | |
" poss = np.where(y_uppercase == cls)[0]\n", | |
" np.random.seed(s)\n", | |
" return np.random.choice(poss)\n", | |
"\n", | |
"def compose_image2(s, seeds):\n", | |
"# print(s)\n", | |
" classes = [ord(c)-ord('A')+10 for c in s]\n", | |
" indices = [pick_letter2(c,s) for c,s in zip(classes, seeds)]\n", | |
" letters = [(x_uppercase[i] if i > 0 else space) for i in indices]\n", | |
" img = np.hstack(np.array(letters))\n", | |
" return img\n", | |
"\n", | |
"def test_with(s, seeds):\n", | |
"# print(s)\n", | |
" full_seeds = seeds + [0]*(38-len(seeds))\n", | |
" img = compose_image2(s.ljust(38), full_seeds)\n", | |
"# showlet(img)\n", | |
" inp = np.expand_dims(img,axis=0)\n", | |
" inp /= 255\n", | |
" probs = model.predict(inp)\n", | |
" return probs[0]\n", | |
"\n", | |
"def find_best(i, base_s, base_seeds, cls, tries=10, seed_base=0):\n", | |
" best_c = ' '\n", | |
" best_seed = 0\n", | |
" max_prob = -10000000.0\n", | |
" for ci in range(ord('A'),ord('Z')):\n", | |
" for sample in range(tries):\n", | |
" c = chr(ci)\n", | |
" s = base_s[:]\n", | |
" s[i] = c\n", | |
" seed = sample+seed_base\n", | |
" seeds = base_seeds[:]\n", | |
" seeds[i] = seed\n", | |
" prob = test_with(''.join(s), seeds)[cls]\n", | |
" if prob > max_prob:\n", | |
" best_c = c\n", | |
" best_seed = seed\n", | |
" max_prob = prob\n", | |
" return (best_c, best_seed, max_prob)\n", | |
"\n", | |
"# class 2 was found to be the best class by looking at activations for\n", | |
"# strings starting with OOO\n", | |
"def search_all(base='', base_seeds=[], cls=2, tries=10, seed_base=0, start=0):\n", | |
" s = list(base)\n", | |
" seeds = base_seeds\n", | |
" for i in range(start,38):\n", | |
" c,seed,p = find_best(i, s, seeds, cls, tries, seed_base)\n", | |
" s[i] = c\n", | |
" seeds[i] = seed\n", | |
" print((i,''.join(s),seed,c,p))\n", | |
" return ''.join(s), seeds\n", | |
"\n", | |
"# test_with('OO')[2]\n", | |
"# find_best('OOOTN',2)\n", | |
"# find_best('OOO',2)\n", | |
"print(\"Starting\")\n", | |
"seeds = [936,936,936,940,937,951,952,941,960,937,947,949,944,937,948,957,948,937,937,951,943,950,948,947,957,937,957,957,943,940,943,937,934,960,948,942,956,936]\n", | |
"search_all('OOOSOMEAUTHENTICINTELLIGENCEISRTQUIVCT', seeds, tries=40, seed_base=323,start=30)\n", | |
"# OOOSNMFMWTASNJLOIWTCKLIUCWCCXSGTCUIETJ\n", | |
"# OONJOMCMNTMSNTIUINTTILIGCWCCISKCONIRFT\n", | |
"# OOOIOMCMUTMENTICIWTCILIGCWCCLIRCOUICFO\n", | |
"# OOOSOMGAUTHKNTICIWTTILIGCWCCISRTQUIVCT" | |
] | |
}, | |
{ | |
"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.6.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment