Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
DEF CON Quals 2018 Flagsifier Notebook
{
"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": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAAsCAYAAAB1yUN9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAEnpJREFUeJztnX9snEV6x7+zP7xe51pCuvEl5A4Ws8QVsZKcsVoQlUgaOK5HHNhiRUVWa1oiKlQosVyVSyNniaIiFS+9XNDpFJTiSqvqDuIQaBAqlHCRUiEna4iJSZx17D2KuWD7XIWwWpt9vTvf/vH+YH+867Udxybr+UiP7Hdm3nln5pl55pl5931fQRIKhUKhuP5xLHYBFAqFQjE/KIOuUCgUZYIy6AqFQlEmKIOuUCgUZYIy6AqFQlEmKIOuUCgUZcJVGXQhxI+EEDEhxKAQ4ifzVSiFQqFQzB4x19+hCyGcAAYA3A/gcwBRAI+SPD9/xVMoFArFTLkaD/2PAAySjJPUAPwKwEPzUyyFQqFQzJarMehrAAxnHX9uhCkUCoViEXBd6wsIIZ4A8IRxeOe1vp7iGzweD9LpNDKZzDW/VkVFBTRNu+bXUSwtXC4X0un0Yhfj28A4yZWlEl2Nh/5bAN/POv6eEZYDyZdJNpBsyA6vrq5Gd3c3nE6nbeafffYZRkZG0NjYWLIgQgjbcI/Hg2g0Cikl0uk0NE1Df3//tHndcMMNcDhm1yxOpxOjo6OQUoIkpJQYGBiYVR6zZd26dQgEAmhtbcXmzZvh9/tz4kOhEFKpFKampmzP9/l8GB0dRSwWQzQaRVdXF6qrq0tet5jRTiQS0563YcMGBAKBovFutxuBQABut3va9t++fTtcrtn7IX6/H5qmIZVKob+/H6FQyJL8PiaEwMDAAC5dulQy3/7+/qLlicViM+5LmqbB5/PNKK0dTqcTHR0diMVi2LJlixXucDhw8OBB2/Q7d+60zcvv9+P06dMlrxkIBHD06FFrDPv9frS3t8+q3OvXr0c0GsW9996bE15ZWYmjR4+WHK8ulwuBQACrV68uaOuqqirU1dXB4/Fg06ZNJcsyPDw8rb159913S+YxHWYfN6WY3cpOHwwG4fF4AOB/Z3QRknMS6N59HMCtACoAfAxgXYlzaEomk6GUko899hizwwHQ5/NxcnKSUkqOjY3x6NGjBWlMeeihh3j27Fn6fD5euHCBHo/HihseHmY6nea+ffvo9/tZVVXFBx98sGheLpeLiUSCAwMDVpjD4Sia3pRgMEgpJZuamnjTTTexoqKCUkrbtHfeeSfb29sphLCNb2xsLHqdBx98kMFgkOFw2Gq/0dHRgvy6u7v55ptvEgBHR0dt8zpz5gyllNQ0zZKnn366ZF1jsVhBmBDCNjy/bQOBQEG42+1mZ2cnNU1jPB7n+Pg40+k0X3nlFdt8urq66HK5csICgYClM7fbXdCXANDj8TCVSjGVSnFycpKxWIzRaJShUKigzSORCNPpNDOZTMn2mC6Npmkz6j8+n48TExMF4U6nkytWrCh5/oYNG5hIJHjzzTezpqYmRxcul8s6bmxs5GuvvWbbjkII7t+/n1JKmuS3c3Z7f/HFF2xqauIbb7yREzcyMmL9X1VVNW2dBwcHKaXk4cOHC9pp37591v/5cWNjY4zFYsxkMgwEAnS5XJaYaTZv3sxjx47x7bff5smTJ9nW1lZQhlAoVBA2ODhoW163200pJf1+f9E6BYNB9vf3M5lMsq+vj7fccotV/kOHDjGVSjGdTlNKyXQ6zccff9xq+9dff53JZJKhUIjj4+NsbW3Nr1PPjOzyXA26YaB/DP2XLkMAds8gvdWxTIM9NTVl23EuXrxoDdJIJMLTp08XpIlEIjxz5gxdLheFEOzr6+PatWtzOs25c+f45JNPsr6+3lYJ1dXVPHHiBIUQdDgcHBsbo6ZpVvzU1BRXrlzJpqYm1tXVWQYiW7q6uqxzTCUsW7asIF1nZydHRkY4Pj7OY8eOMZVK8dSpU1b85OQkm5ubuXv3br788ssEwMrKSmtAbtu2jbFYjC+99BIzmUzRSUFKyZUrV1plK5amrq6upLHIlvr6etbU1BSEJxIJVldXlzzfzqB3dnZak4+ps+effz5HB9liF+5yuawJdGRkhP39/db/pgEzZXR01HYgm1JVVcVMJsNVq1Zx3bp109ansbGRhw8fLhpfbFLPl2g0yj179ti269atWwmAV65csT3X6XQykUjQ7/czEAhQSplTv/r6eqv/SCnZ3t5OIHciEkLkOFAnTpwoatA7OzutfmNXv7a2NqvvTU1N2Za5srKSk5OTHBkZsR0n2WPCTkwDn+145ctzzz3Hjz76iJWVlbxw4QLvv//+gjTvv/9+QVg4HLbNb+3atTnjKl9CoRBTqRT37dtHr9dbEL9161a2trZak+aBAwdynM9sMftvnsyPQYe+rfJrAOcBnAPwjBH+HPQtll5DfjxTgx4KhRgKhVhTU8Px8XFGo9GCThGJRHLC4vF4jkF47733cuIrKiqYTqeLKtjv9/PixYvcsGFDwaA5duwYJycnOTAwUDAgwuEwJyYmuHnzZkopGY/HmclkcvIxvRrT443FYozFYjmTS2dnJ4eGhuh0OpnJZLh7924eOXLEMriTk5Osq6vj0aNHKaWk1+ul0+mklLJgYPX29hbtePkDzRzA+TIyMkJN05jJZDg4OMjNmzdPO4jMMuaHuVwunjx5suS5xTz0VCpVEB4IBDg2Nlaybtl5Syn5wQcfkCSDwSAjkQiPHz9ekFbTNNbW1hYtZ09PDx955JGS9amurqaUkmvXrmU4HKamaTnem8vlYiqVKplPTU0NpZQFk3MwGGRTUxMBfZKTUlqrj+3bt1vp9uzZw71791rHa9asycknFAoxEAiwqamJGzduZDgc5qVLl3Ick6GhIUopuWrVKgL6JPHCCy/Y9hnz/3vvvZeVlZW2dRodHaWmadOuQqWUjEajtsbP7LPhcJgrV65kIBCwNfLBYLCoIxEKhXjs2LGCMmR7+19++WXBeU6n0za/bKctX8wxm0wmGY1GizqPAFhbW0tN06Z1Kvbs2cOKior88Hkz6KsB1Bv//x50j/wO6Ab9H2bp0VuNfeTIEWupnr9ETCaTdLvddDgcXL58Oaurq6lpmmXYli9fnmNEqqureeXKFW7ZsqWo8gB92XT+/Hnr2Ov1MplM0uv1sq2tjefPn2dbW1tOJzh48KDV+c2luWmUzTQkuXHjxqIK8nq91DSNbrebhw4dYktLCxsbGzkxMWF1ICklpZTs7OzkAw88wN7eXkopbZfsUsppPWJzYslkMtQ0jevXr5+2bA0NDUW3ZpLJJJ1OJ5ctW2brjfr9/qKeWH5HtjPo+/fvZ29vb06bL1++nMPDw7b5xOPxgjCXy2VNqFJKXr582dZImobfrhym9PT0sLOz0zq+7777bNNlMhleuXKFQ0ND7OjoKNBTbW3ttJOuKXv37rX1NP1+v7U0l1JyZGTEql/2ajUUCk17nVgsZuUVCATY19dX0IYXLlxgOp22tkicTie9Xm/OJH/PPfdMu92QLaYTNF2ampoadnV1UUrJXbt25cTZGbtkMmmbTyKRKJr/6OgoN23aRK/XS7/fz8cee4xPPfVUTjnzt+iKSTwet+175oS8Y8cOa3VezIsHdGellEE3+2Fe2LXZcgHwJvSHiZ7DHA262cHi8XiBQh0OBwcHB3nkyBGOjY1RSslMJsNt27ZZaZxOJ4eHhzk1NcXLly/z3LlzvO2223IaYOvWrdQ0jQ0NDfT5fHS5XGxpaWFvb29O4+YvyWcq5uTicDhKLq19Pl9O+QHdw7HbvgF0z6OYEfZ6vSWvl+9J5BubYDDIjz/+mLW1tfT7/dyxY4ft1kwymbQMfbHVj7nUNI1PsTK9+OKLtoa0srKSX331FScmJhgOhxkOh5lIJIp6f9neaLYupJSMRCKMxWKUUrK5udl2MJVqO7NvvvTSS0wmkwX7pkIIRiIRNjc3s729PWe7KFt6e3t54MABdnR0MBQK2W4ZOp1OTk5OsqGhwTYPh8NBr9dr6c/hcBSs1qqrq/n111/b1hfQveVIJMKWlhbu3LmTJAv6VmtrqzVZmI6AeWxet5h3aieJRILNzc0FE5XP52M8HrecOHMfPHtMmmW262d21xoaGip6n+Lhhx+27Ec6nWY8Hs+ZpJxOJ4eGhnLO6ejosO1fmqbZjpHu7u6cttM0rdiWidUHU6lUwcp5586d1v+7d++2WyHNv0EH4AfwGYDfh27QPwVwFsArAG6cqUEHwEceeYThcNjWcPn9fqZSKWqaxp6enqLe6KpVq4reuDE7u3kjTErJ3t7enCWVEKLoPtZMxVxRXE0esxG/32+795ct+UYrfzA0NDQwmUwymUyyq6uL3d3dOe3g8XiYyWRybiQWu1apPWlTzp07N+0NwpqaGoZCIba2thZd9k7n/ZhGt7Ky0nYZD2MwzeRGZ0tLC9PpNPv7+wuWz2vWrLGMsxCCmUyG3d3dBXlomsapqSnLcNkZg1dffTVn5TlXqampYU9PD/v6+tjX15fTzplMxlpBORyOopPu+vXrGY1GrfLu3buXwWDQiu/o6KCmaUwmk7x06RKfffZZ1tfX2+rUPK+5uTnH0fJ4PAXXaG9vL9D3yZMnmU6nmU6nqWnatKuq6cavEILBYJDt7e1cu3atrQPV3NxMKSVjsRg1TbP9AYbD4eCpU6dmdJ+olLjdbgYCAdtyd3V1MRQKFavT/Bp0AN8B8CGAPzeOvwvACf2nj/8M4JUi5z0BoMeQq26Qb6PM5JcMi1meYiuB+ahPIBCY8bJVydKTq52sTLnWfWy+ynkNZUYGfUbvchFCuAG8BeAdkv9qE+8H8BbJuhL5JADESl6wPPEBGF/sQiwSqu5LE1X3+eMWzuDBopJPaAj91+//BqA/25gLIVaT/MI4DAL4ZAaFijHvAaOlghCiR9V96aHqruq+kMzkkbt7APwlgD4hRK8R9k8AHhVCbIS+HPgUwN9ekxIqFAqFYkaUNOgk/weA3TOqb89/cRQKhUIxVxb6i0UvL/D1vk2oui9NVN2XJotS9zl/4EKhUCgU3y7UN0UVCoWiTFgwg17O3x8VQnxfCPFrIcR5IcQ5IcQzRvgKIcR/CyEuGn9vNMKFEOKA0RZnhRD1i1uDq0cI4RRCnBFCvGUc3yqEOGXU8VUhRIUR7jGOB414/2KW+2oRQiwXQnQJIS4IIfqFEHcvFb0LIVqN/v6JEOKXQojKctW7EOIVIcSYEOKTrLBZ61kI0WKkvyiEaJnvci6IQTe+P/pzAH8G/T0wjwoh7liIay8QaQBtJO8AcBeAvzPq9xMAx0neDuC4cQzo7XC7IU8A+MXCF3neeQZA9sur/wXAT0kGAFwG8LgR/jiAy0b4T4101zM/A/BfJP8QwAbobVD2ehdCrAHw9wAajOdPnAD+AuWr938H8KO8sFnpWQixAkAIwB9D/4RnyJwE5o3ZvstlLgLgbugPJZnHuwDsWohrL4bgm/fdxACsNsJWQ/8dPgAchP5BbTO9le56FOgfNzkO4E+hP4AmoD9U4crXP4B3ANxt/O8y0onFrsMc630DgN/kl38p6B3ffIJyhaHHtwA8UM56h/7qk0/mqmcAjwI4mBWek24+ZKG2XJbM90eNpeQPAJwC8F1+8/DVCPTXJQDl1x77AfwjAGkc/wGAL0ma3w7Lrp9VdyP+ipH+euRWAL8D0GlsNx0SQizDEtA7yd8CCEN/t9MX0PX4IZaG3k1mq+drrn91U3QeEUJ8B8ARADtJfpUdR31KLrufFAkhtgIYI/nhYpdlEXABqAfwC5I/AJDEN8tuAGWt9xsBPAR9UrsJwDIUbkksGb4tel4ogz6j749ezxjvuzkC4D9Ivm4EjwohVhvxqwGMGeHl1B73ANgmhPgUwK+gb7v8DMByIYT54Fp2/ay6G/E3APi/hSzwPPI5gM9JnjKOu6Ab+KWg9/sA/Ibk70hOAXgdel9YCno3ma2er7n+F8qgRwHcbtwBr4B+8+Q/F+ja15xi77uBXkfzTnYL9L11M/yvjLvhdwG4krV0u64guYvk90j6oev1fZLN0L9y1WQky6+72SZNRvpF92zmAskRAMNCiFojaAv0L3uVvd6hb7XcJYSoMvq/Wfey13sWs9XzOwB+KIS40Vjh/NAImz8W8IbCrL4/ej0JgD+Bvtw6i6xP8kHfIzwO4CKA9wCsMNIL6L/6GQLQB/2XAotej3loh03Q37oJADUATgMYBHAYgMcIrzSOB434msUu91XWeSP0V0OfBfAGgBuXit4B7AVwAfqL+SIAPOWqdwC/hH6vYAr6yuzxuegZwN8YbTAI4K/nu5zqSVGFQqEoE9RNUYVCoSgTlEFXKBSKMkEZdIVCoSgTlEFXKBSKMkEZdIVCoSgTlEFXKBSKMkEZdIVCoSgTlEFXKBSKMuH/Ab8blGNrABQ+AAAAAElFTkSuQmCC\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