Last active
June 22, 2018 23:12
-
-
Save davidalves1/098b2bcc5d1272a0efb3f67baad15239 to your computer and use it in GitHub Desktop.
Exemplo de rede neural sem peso utilizando o algoritmo WiSARD
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
import random | |
import bisect | |
def convert_toBinary(x): | |
temp = 1 | |
sum_ = 0 | |
for i in x: | |
sum_ += i*temp | |
temp *= 2 | |
return sum_ | |
class WiSARD: | |
# Mapping associa uma posição da matriz de tuplas com o pixel que ele representa | |
def __init__(self, retina_x, retina_y, tuple_size): | |
self.retina_x = retina_x | |
self.retina_y = retina_y | |
self.tuple_size = tuple_size | |
if( (retina_x*retina_y)%tuple_size !=0 ): | |
print("Invalid tuple size") | |
self.M = (retina_x*retina_y)//tuple_size | |
self.tuples = [] | |
self.mapping = [] | |
self.discriminators = {} | |
self.max_bleaching = 0 | |
def random_mapping(self): | |
self.mapping = [] | |
temp = [] | |
for i in range(0, self.retina_x): | |
for j in range(0, self.retina_y): | |
temp.append((i, j)) | |
for i in range(0, self.M): | |
temp_array = [] | |
for j in range(0, self.tuple_size): | |
element = random.choice(temp) | |
temp.remove(element) | |
temp_array.append(element) | |
self.mapping.append(temp_array) | |
def set_mapping(self, mapping): | |
self.mapping = mapping | |
def get_mapping(self): | |
return self.mapping | |
def set_discriminators(self, ds): | |
self.discriminators = ds | |
def get_discriminators(self): | |
return self.discriminators | |
def fit_class(self, labels,retinas): | |
if(len(retinas) != len(labels) ): | |
print("Size error") | |
return 0 | |
for i in range(len(labels)): | |
if(labels[i] not in self.discriminators): | |
self.discriminators[labels[i]] = [{} for x in range(self.M)] | |
for j in range(self.M): | |
pos_ram = 0 | |
for k in range(self.tuple_size): | |
pixel = self.mapping[j][k] | |
pos_ram += retinas[i][pixel[0]][pixel[1]]* (2**k) | |
if(pos_ram not in self.discriminators[labels[i]][j]): | |
self.discriminators[labels[i]][j][pos_ram] = 0 | |
self.discriminators[labels[i]][j][pos_ram] += 1 | |
self.max_bleaching = max(self.max_bleaching, self.discriminators[labels[i]][j][pos_ram]) | |
# necessário pelo menos duas classes para que possa classificar | |
def classify(self, retinas): | |
ret = [] | |
for retina in retinas: | |
ram_count = {} | |
for classes in self.discriminators: | |
ram_count[classes] = [] | |
for i in range(self.M): | |
pos_ram=0 | |
for j in range(self.tuple_size): | |
pixel = self.mapping[i][j] | |
pos_ram += retina[pixel[0]][pixel[1]] * (2**j) | |
if(pos_ram in self.discriminators[classes][i]): | |
ram_count[classes].append(self.discriminators[classes][i][pos_ram]) | |
ram_count[classes].sort() | |
for bleaching in range(1, self.max_bleaching+1): | |
results = [] | |
for classes in self.discriminators: | |
R = len(ram_count[classes]) - bisect.bisect_right(ram_count[classes], bleaching) | |
results.append((R, classes)) | |
results.sort() | |
if( (results[-1][0] > results[-2][0]) or (bleaching == self.max_bleaching) ): | |
# confidence = (results[-1][0] - results[-2][0])/results[-1][0] | |
# print(bleaching) | |
ret.append(results[-1][1]) | |
break | |
return ret | |
def classes_images(self): | |
ret = [] | |
for classes in self.discriminators: | |
image = [[0 for y in range(self.retina_y)] for x in range(retina_x)] | |
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": [ | |
"### Implementação basica da Rede Neural sem peso WiSARD" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"1. Importa a classe com os métodos para realizar as operações:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 94, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import Wisard as wi" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"2. Inicia a classe passando, respectivamente, os valores do eixo x, os valores do eixo y e a quantidade de pixels que serão armazenados em cada posição da Tupla. A Tupla será usada para mapear os pixels para a memória RAM" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 95, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"test = wi.WiSARD(4, 4, 4)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"3. Realiza o mapeamento. O mapeamento é a associação de um pixel do input com uma posição em uma das tuplas. O material de input será dividido em M tuplas, onde cada tupla possuirá N pixels representados." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 96, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"test.random_mapping()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"4. Exibe os valores distribuídos" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 97, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[[(2, 1), (0, 1), (0, 2), (2, 0)],\n", | |
" [(1, 3), (0, 3), (1, 1), (3, 1)],\n", | |
" [(2, 3), (3, 2), (3, 3), (3, 0)],\n", | |
" [(0, 0), (2, 2), (1, 0), (1, 2)]]" | |
] | |
}, | |
"execution_count": 97, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test.mapping" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"5. A rede será treinada considerando o valor 0 como preto e 1 como branco" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"x_train = [\n", | |
" [[0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1]],\n", | |
"\n", | |
" [[0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1]],\n", | |
"\n", | |
" [[0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1]],\n", | |
"\n", | |
" [[0, 0, 1, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1]],\n", | |
"\n", | |
" [[0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 1, 1]],\n", | |
"\n", | |
" [[0, 1, 0, 1],\n", | |
" [0, 1, 1, 1],\n", | |
" [0, 1, 1, 1],\n", | |
" [0, 1, 0, 1]],\n", | |
"\n", | |
" [[1, 0, 1, 0],\n", | |
" [1, 1, 1, 0],\n", | |
" [1, 0, 1, 0],\n", | |
" [1, 0, 1, 0]],\n", | |
"\n", | |
" [[0, 1, 0, 1],\n", | |
" [0, 1, 1, 1],\n", | |
" [0, 1, 0, 1],\n", | |
" [0, 1, 0, 1]],\n", | |
"\n", | |
" [[0, 1, 0, 1],\n", | |
" [0, 1, 0, 1],\n", | |
" [0, 1, 1, 1],\n", | |
" [0, 1, 0, 1]],\n", | |
"\n", | |
" [[1, 0, 1, 0],\n", | |
" [1, 1, 1, 0],\n", | |
" [1, 0, 1, 0],\n", | |
" [1, 0, 1, 0]],\n", | |
" \n", | |
" [[0, 1, 1, 1],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 1, 1]],\n", | |
"\n", | |
" [[1, 1, 1, 0],\n", | |
" [1, 0, 0, 0],\n", | |
" [1, 0, 0, 0],\n", | |
" [1, 1, 1, 0]],\n", | |
"\n", | |
" [[0, 1, 1, 1],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 0, 1],\n", | |
" [0, 1, 1, 1]],\n", | |
"\n", | |
" [[0, 1, 1, 1],\n", | |
" [0, 1, 1, 0],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 1, 1]],\n", | |
"\n", | |
" [[0, 1, 1, 1],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 1, 1]],\n", | |
"\n", | |
"]\n", | |
"\n", | |
"y_train = ['i','i','i','i','i','H','H','H','H','H', 'C', 'C', 'C', 'C', 'C']\n", | |
"\n", | |
"test.fit_class(y_train, x_train)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"6. Com o modelo treinado já é possível realizar a classificação" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 99, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['i']" | |
] | |
}, | |
"execution_count": 99, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test.classify(\n", | |
" [[[0, 0, 0, 1],\n", | |
" [0, 0, 1, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 0, 1]]]\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 100, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['C']" | |
] | |
}, | |
"execution_count": 100, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test.classify(\n", | |
" [[[0, 1, 1, 1],\n", | |
" [0, 1, 0, 1],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 1, 1]]]\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"7. Importa as bibliotecas necessárias e cria a função para plotar as imagens" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 101, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"from random import randint\n", | |
"\n", | |
"def plot_item(pixels): \n", | |
" pixels = np.array(pixels, dtype='uint8')\n", | |
" pixels = pixels.reshape((4, 4))\n", | |
" \n", | |
" classified = test.classify([pixels])\n", | |
" \n", | |
" plt.title('A Letra é {label}'.format(label=classified[0]))\n", | |
" plt.imshow(pixels, cmap='gray')\n", | |
" plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"8. Plota as imagens de acordo com a matriz passada pelo loop" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 102, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQoAAAEICAYAAACnA7rCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADuBJREFUeJzt3X+MZWV9x/H3p8sKtigo2LJZtqCBGqmpKAQxakNEKxDLkkhbrBUw2m1MqT9SWo0mNDWlxabVaDAaCggoKijWbi0trhGrpsWySxYqUHQ1qcuK8ntxI4UMfPvHPeg4zuwz7D177p2Z9ys5mXvOfe55npuZ+5nz655vqgpJ2p1fmPQAJE0/g0JSk0EhqcmgkNRkUEhqMigkNRkUmlpJPpzk/N08//okXxxyTCuVQbGMJflKkgeS7LuIdm/ew/U/6dctct0bgEer6j0LtamqK6vqt/ZG//pZ+0x6ANo7khwOvBzYCZwKfGYCY9inqmb25LVVdVHf49Gec4ti+ToTuAG4DDhrT1eS5Pgk/5HkwSQ3JzmhW34+oyC6MMmuJBd2yyvJHyf5NvDtbtkHk2xP8lCSLUlevpv+9k3yd0m+l+SHST6a5KkLtD07ydf39L1p8QyK5etM4MpuenWSX3myK0iyFvgX4K+AZwLnAtckeVa3S/A14Jyq2r+qzpn10tOAFwNHdfM3Akd36/gk8Jkk+y3Q7QXAr3XtjwDWAuc92bGrXwbFMpTkZcBhwNVVtQX4DvD7e7CqPwCuraprq+rxqtoEbAZOabzub6rq/qp6GKCqPlFV91XVTFX9PbAv8Nx5xh1gA/CO7vU/Av4aOGMPxq4eGRTL01nAF6vq3m7+k+zZ7sdhwO90ux0PJnkQeBmwpvG67bNnkpyb5PYkO7t1HAAcPM/rngX8IrBlVn//1i3XBHkwc5np9ud/F1iV5Afd4n2BA5O8oKpufhKr2w58vKr+cIHnF/rq8U+Wd8cj/hw4Ebi1qh5P8gCQeV53L/Aw8OtVteNJjFN7mVsUy89pwGOMjg8c3U3PY3Q84czdvG6fJPvNmlYDnwB+O8mrk6zqlp+Q5NDuNT8EntMYz9OAGeCero/zgKfP17CqHgf+AfhAkl+G0XGSJK9exPvWXmRQLD9nAR+rqu9V1Q+emIALgdcnWWgr8iOM/ps/MX2sqrYD64F3M/qgbwf+jJ/+3XwQOL27VuNDC6z3Oka7D98C/hf4P+bsmszxTmAbcEOSh4AvMc/xDA0r3rhGUotbFJKaxgqKJM9MsinJt7ufz1ig3WNJtnbTxnH6lDS8sXY9kvwtcH9VXZDkXcAzquqd87TbVVX7jzFOSRM0blDcAZxQVXclWQN8parmu5DGoJCWsHGD4sGqOrB7HOCBJ+bntJsBtjI6TXZBVX1+gfVtYHRlHsAxezwwqUfHHLN8/xS3bNlyb1U1L2hrBkWSLwGHzPPUe4DLZwdDkgeq6ueOUyRZW1U7kjwH+DJwYlV9p9Gvp2M0FZbzmcEkW6rq2Fa75pWZVfXK3XTywyRrZu163L3AOnZ0P7+b5CvACxl9/0DSEjDu6dGN/PQ7BGcB/zS3QZJnPHHjlCQHAy8FbhuzX0kDGjcoLgBe1d174JXdPEmOTXJx1+Z5wOYkNwPXMzpGYVBIS8jUXpnpMQpNi2n9jPRhsccovDJTUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqamXoEhyUpI7kmzrKobNfX7fJFd1z38jyeF99CtpGGMHRZJVwIeBk4GjgNclOWpOszcxKg50BPAB4H3j9itpOH1sURwHbKuq71bVo8CngfVz2qwHLu8efxY4sassJmkJ6CMo1gLbZ83f2S2bt01VzQA7gYN66FvSAJqVwoY0p/aopCnRxxbFDmDdrPlDu2XztkmyD3AAcN/cFVXVRVV17GLqDEgaTh9BcSNwZJJnJ3kKcAajUoOzzS49eDrw5VrOVVWkZWbsXY+qmklyDnAdsAq4tKpuTfJeYHNVbQQuAT6eZBtwP6MwkbREWFJQapjWz0gfLCkoqTcGhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlLTULVHz05yT5Kt3fTmPvqVNIyx78I9q/boqxhVCbsxycaqum1O06uq6pxx+5M0vKFqj0pawoaqPQrw2iS3JPlsknXzPE+SDUk2J9ncw7gk9WSog5n/DBxeVb8BbOKnlc1/hiUFpek0SO3Rqrqvqh7pZi8GjumhX0kDGaT2aJI1s2ZPBW7voV9JAxmq9uhbk5wKzDCqPXr2uP1KGo61R6WGaf2M9MHao5J6Y1BIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhq6quk4KVJ7k7yzQWeT5IPdSUHb0nyoj76lTSMvrYoLgNO2s3zJwNHdtMG4CM99StpAL0ERVV9ldHdtReyHriiRm4ADpxzC39JU2yoYxSLKjtoSUFpOo1d16NPVXURcBF4u35pmgy1RdEsOyhpeg0VFBuBM7uzH8cDO6vqroH6ljSmXnY9knwKOAE4OMmdwF8AqwGq6qPAtcApwDbgx8Ab++hX0jAsKSg1TOtnpA+WFJTUG4NCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JS01AlBU9IsjPJ1m46r49+JQ2jr7oelwEXAlfsps3Xquo1PfUnaUBDlRSUtIQNWSnsJUluBr4PnFtVt85tkGQDoyLGWoKW892qV7qhguIm4LCq2pXkFODzjCqb/wxLCkrTaZCzHlX1UFXt6h5fC6xOcvAQfUsa3yBBkeSQJOkeH9f1e98QfUsa31AlBU8H3pJkBngYOKPcoZWWDEsKqjfT+rekhVlSUFJvDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNYwdFknVJrk9yW5Jbk7xtnjZJ8qEk25LckuRF4/YraTh93Fx3BvjTqropydOALUk2VdVts9qczKiOx5HAi4GPdD8lLQFjb1FU1V1VdVP3+EfA7cDaOc3WA1fUyA3AgUnWjNu3pGH0eowiyeHAC4FvzHlqLbB91vyd/HyYkGRDks1JNvc5Lknj6a2kYJL9gWuAt1fVQ3uyDksKStOply2KJKsZhcSVVfW5eZrsANbNmj+0WyZpCejjrEeAS4Dbq+r9CzTbCJzZnf04HthZVXeN27ekYfSx6/FS4A3AfyfZ2i17N/Cr8JOSgtcCpwDbgB8Db+yhX0kDsaSgejOtf0tamCUFJfXGoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNQ0VEnBE5LsTLK1m84bt19JwxmqpCDA16rqNT30J2lgQ5UUlLSE9VYpDHZbUhDgJUluBr4PnFtVt87z+g3Ahj7HpOGMSrwsP95dvMfb9XclBf8dOH9utbAkTwcer6pdSU4BPlhVRzbW529HU2E5B8Wgt+tvlRSsqoeqalf3+FpgdZKD++hb0t43SEnBJId07UhyXNfvfeP2LWkYQ5UUPB14S5IZ4GHgjFrO23PSMmNJQalhWj8jfbCkoKTeGBSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKa+ri57n5J/ivJzV1Jwb+cp82+Sa5Ksi3JN7r6H5KWiD62KB4BXlFVLwCOBk5KcvycNm8CHqiqI4APAO/roV9JA+mjpGA9UbMDWN1Nc+9Guh64vHv8WeDELNeyUtIy1FcBoFXdrfrvBjZV1dySgmuB7QBVNQPsBA7qo29Je18vQVFVj1XV0cChwHFJnr8n60myIcnmJJv7GJekfvR61qOqHgSuB06a89QOYB1Akn2AA5inUlhVXVRVxy6mzoCk4fRx1uNZSQ7sHj8VeBXwP3OabQTO6h6fDnzZSmHS0tFHScE1wOVJVjEKnqur6gtJ3gtsrqqNjGqTfjzJNuB+4Iwe+pU0EEsKSg3T+hnpgyUFJfXGoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqGqr26NlJ7kmytZvePG6/kobTx124n6g9uivJauDrSf61qm6Y0+6qqjqnh/4kDWzsoOjqc7Rqj0pawvrYoqCr6bEFOAL48Dy1RwFem+Q3gW8B76iq7fOsZwOwoZvdBdzRx/gW6WDg3gH7G4rva0wTqKc95O/ssMU06rWuR1cx7B+BP6mqb85afhCwq6oeSfJHwO9V1St667gHSTYvx1KGvq+lZxrf2yC1R6vqvqp6pJu9GDimz34l7V2D1B5NsmbW7KnA7eP2K2k4Q9UefWuSU4EZRrVHz+6h375dNOkB7CW+r6Vn6t7b1NYelTQ9vDJTUpNBIalpxQdFkpOS3JFkW5J3TXo8fUlyaZK7k3yz3XrpSLIuyfVJbuu+MvC2SY+pD4v5KsQkrehjFN0B2G8xOlNzJ3Aj8Lqqum2iA+tBd3HbLuCKqnr+pMfTl+4M2pqquinJ0xhd6HfaUv+dZXRV1y/N/ioE8LZ5vgoxESt9i+I4YFtVfbeqHgU+Dayf8Jh6UVVfZXSGaVmpqruq6qbu8Y8YnWpfO9lRja9GpvarECs9KNYCsy8lv5Nl8Ee3UiQ5HHghMN9XBpacJKuSbAXuBjYt8FWIiVjpQaElKsn+wDXA26vqoUmPpw9V9VhVHQ0cChyXZGp2GVd6UOwA1s2aP7RbpinW7cNfA1xZVZ+b9Hj6ttBXISZppQfFjcCRSZ6d5CnAGcDGCY9Ju9Ed9LsEuL2q3j/p8fRlMV+FmKQVHRRVNQOcA1zH6KDY1VV162RH1Y8knwL+E3hukjuTvGnSY+rJS4E3AK+Ydce0UyY9qB6sAa5Pcgujf2CbquoLEx7TT6zo06OSFmdFb1FIWhyDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmv4f0tTWu+uKVFMAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQoAAAEICAYAAACnA7rCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAD11JREFUeJzt3X+sX3V9x/Hna6WiAycqbDalBQ3MH3MTpEGMuhCZEYmjJuKG2wSMrIuR+SNj02jCMjM3XDaNWqNx/gJ/ouJc57q5GjFqHI5bUpjA0Go2S0UpBYuNiCm+98f3FK/Xe/u59Ht6vt97+3wkJ/ec8/18z+fzzb199XzPr3eqCkk6kF+a9AAkTT+DQlKTQSGpyaCQ1GRQSGoyKCQ1GRSaKknemeRNkx6Hfp5Bscwk+WKSu5McuYh2Fx/k9h/0+xa57Q3AT6rqDQdoc1GSr8yz/n+T/M6hGJfgiEkPQP1JciLwLGAPcC7wyQmM4Yiq2ncw762q9/Q9HvXDPYrl5QLgWuCDwIUHu5EkZyT5apIfJLkhyZnd+jcxCqKNSfYm2ditrySvSPJN4Jvdurcl2ZHkniRbkzzrAP0dmeTvk3wnyfeTvDvJww52/OqfQbG8XAB8pJuem+TXHuwGkqwG/hX4a+BRwKXA1UmO674SfBm4pKqOrqpLZr31BcDTgCd1y9cBp3Tb+CjwySQPXaDby4Ff79qfBKwGLnuwY9ehY1AsE0meCZwAfKKqtgLfAv7gIDb1R8DmqtpcVT+tqi3ADHBO431/W1V3VdW9AFX14araXVX7quofgCOBx88z7gAbgNd07/8h8DfA+Qfo64xub+eBCVj74D+qFsugWD4uBP6jqu7slj/KwX39OAF40Zx/hM8EVjXet2P2QpJLk9ySZE+3jUcAx87zvuOAXwa2zurv37v1C7m2qo6ZPQHfWeTn00HwYOYy0H2f/z1gRZLvdauPBI5J8pSquuFBbG4H8KGq+uMFXl/oduMH1nfHI/4COAu4qap+muRuIPO8707gXuA3qmrngxinBuQexfLwAuB+RscHTummJzI6nnDBAd53RJKHzppWAh8GfjfJc5Os6NafmeT47j3fBx7XGM/DgX3Arq6Py4Bfma9hVf0U+EfgrUl+FUbHSZI8dxGfWwMxKJaHC4EPVNV3qup7+ydgI/CHSRbac3wXo//N908fqKodwHrg9Yz+oe8A/pyf/a28DTivu1bj7Qts93OMvj58A/g/4MfM+Woyx2uB7cC1Se4BPs88xzM0OfHBNZJa3KOQ1DRWUCR5VJItSb7Z/XzkAu3uT7KtmzaN06ek4Y311SPJ3wF3VdXlSV4HPLKqXjtPu71VdfQY45Q0QeMGxa3AmVV1e5JVwBerar6LagwKaQkbNyh+0F3ssv8Ku7v3L89ptw/YxuiU2eVV9ZkFtreB0VV6HHXUUac94QlPOOixTautW7dOegiHzGmnnTbpIRwSy/l3BtxZVQe6uA1YRFAk+TzwmHleegNwxexgSHJ3Vf3CcYokq6tqZ5LHAV8Azqqqbx2o33Xr1tXMzExr/EvOKE+Xp+V6Bm05/86ArVW1rtWoeWVmVS14j393p9+qWV897lhgGzu7n99O8kXgVEb3IkhaAsY9PbqJn91PcCHwz3MbJHnk/oeoJDkWeAZw85j9ShrQuEFxOfCc7jkEv9Mtk2Rdkvd2bZ4IzCS5AbiG0TEKg0JaQsa6KayqdjO68Wfu+hng4m7+q8BvjtOPpMnyykxJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNBoWkpl6CIsnZSW5Nsr2rGDb39SOTXNW9/rUkJ/bRr6RhjB0USVYA7wSeBzwJeHGSJ81p9jJGxYFOAt4KvHncfiUNp489itOB7VX17ar6CfBxYP2cNuuBK7r5TwFnZZlXVZGWkz6CYjWwY9bybd26edtU1T5gD/DoHvqWNICpOpiZZEOSmSQzu3btmvRwJHX6CIqdwJpZy8d36+Ztk+QI4BHA7rkbqqr3VNW6qlp33HHNuqmSBtJHUFwHnJzksUkeApzPqNTgbLNLD54HfKGWa0VbaRkaq1IYjI45JLkE+BywAnh/Vd2U5I3ATFVtAt4HfCjJduAuRmEiaYkYOygAqmozsHnOustmzf8YeFEffUka3lQdzJQ0nQwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpKahao9elGRXkm3ddHEf/UoaxtgP151Ve/Q5jKqEXZdkU1XdPKfpVVV1ybj9SRreULVHJS1hQ9UeBXhhkhuTfCrJmnlet6SgNKWGOpj5L8CJVfVbwBZ+Vtn851hSUJpOg9QerardVXVft/he4LQe+pU0kEFqjyZZNWvxXOCWHvqVNJChao++Msm5wD5GtUcvGrdfScPJtBYVX7duXc3MzEx6GL1LMukhHDLT+rc0ruX8OwO2VtW6ViOvzJTUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhq6quk4PuT3JHk6wu8niRv70oO3pjkqX30K2kYfe1RfBA4+wCvPw84uZs2AO/qqV9JA+glKKrqS4yerr2Q9cCVNXItcMycR/hLmmJDHaNYVNlBSwpK02mqDmZaUlCaTkMFRbPsoKTpNVRQbAIu6M5+nAHsqarbB+pb0pjGLikIkORjwJnAsUluA/4SWAlQVe8GNgPnANuBHwEv7aNfScPoJSiq6sWN1wt4RR99SRreVB3MlDSdDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaQmg0JSk0EhqcmgkNRkUEhqMigkNRkUkpoMCklNQ5UUPDPJniTbuumyPvqVNIxenpnJqKTgRuDKA7T5clU9v6f+JA1oqJKCkpawvvYoFuPpSW4AvgtcWlU3zW2QZAOjIsasXbt2wKENZ/RAcmlpGepg5vXACVX1FOAdwGfma2RJQWk6DRIUVXVPVe3t5jcDK5McO0TfksY3SFAkeUySdPOnd/3uHqJvSeMbqqTgecDLk+wD7gXOL7+sS0vGUCUFNzI6fSppCfLKTElNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmgwKSU0GhaSmsYMiyZok1yS5OclNSV41T5skeXuS7UluTPLUcfuVNJw+npm5D/izqro+ycOBrUm2VNXNs9o8Dzi5m54GvKv7KWkJGHuPoqpur6rru/kfArcAq+c0Ww9cWSPXAsckWTVu35KG0esxiiQnAqcCX5vz0mpgx6zl2/jFMCHJhiQzSWZ27drV59AkjaG3oEhyNHA18OqquudgtmFJQWk69RIUSVYyComPVNWn52myE1gza/n4bp2kJaCPsx4B3gfcUlVvWaDZJuCC7uzHGcCeqrp93L4lDaOPsx7PAF4C/HeSbd261wNr4YGSgpuBc4DtwI+Al/bQr6SBjB0UVfUVII02Bbxi3L4kTYZXZkpqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1DVVS8Mwke5Js66bLxu1X0nCGKikI8OWqen4P/Uka2FAlBSUtYX3sUTzgACUFAZ6e5Abgu8ClVXXTPO/fAGwAWLt2bZ9DmxqjMijL0+hh61qOhiopeD1wQlU9BXgH8Jn5tmFJQWk6DVJSsKruqaq93fxmYGWSY/voW9KhN0hJwSSP6dqR5PSu393j9i1pGEOVFDwPeHmSfcC9wPnlF1ppyRiqpOBGYOO4fUmaDK/MlNRkUEhqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGrq4+G6D03yX0lu6EoK/tU8bY5MclWS7Um+1tX/kLRE9LFHcR/w7K5mxynA2UnOmNPmZcDdVXUS8FbgzT30K2kgfZQUrP01O4CV3TT3CdvrgSu6+U8BZ2U5l8ySlpm+CgCt6B7VfwewparmlhRcDewAqKp9wB7g0X30LenQ6yUoqur+qjoFOB44PcmTD2Y7STYkmUkys2vXrj6GJqkHvZ71qKofANcAZ895aSewBiDJEcAjmKdSmLVHpenUx1mP45Ic080/DHgO8D9zmm0CLuzmzwO+YKUwaenoo6TgKuCKJCsYBc8nquqzSd4IzFTVJka1ST+UZDtwF3B+D/1KGkgfJQVvBE6dZ/1ls+Z/DLxo3L4kTYZXZkpqMigkNRkUkpoMCklNBoWkJoNCUpNBIanJoJDUZFBIajIoJDUZFJKaDApJTQaFpCaDQlKTQSGpyaCQ1GRQSGoyKCQ1GRSSmoaqPXpRkl1JtnXTxeP2K2k4fTyFe3/t0b1JVgJfSfJvVXXtnHZXVdUlPfQnaWB9PIW7gFbtUUlLWB97FHQ1PbYCJwHvnKf2KMALk/w28A3gNVW1Y57tbAA2dIt7k9zax/gW6VjgzgH7G8pgn2vgutPL9fcFw362ExbTKH0W7Ooqhv0T8KdV9fVZ6x8N7K2q+5L8CfD7VfXs3jruQZKZqlo36XH0zc+19EzjZxuk9mhV7a6q+7rF9wKn9dmvpENrkNqjSVbNWjwXuGXcfiUNZ6jao69Mci6wj1Ht0Yt66Ldv75n0AA4RP9fSM3WfrddjFJKWJ6/MlNRkUEhqOuyDIsnZSW5Nsj3J6yY9nr4keX+SO5J8vd166UiyJsk1SW7ubhl41aTH1IfF3AoxSYf1MYruAOw3GJ2puQ24DnhxVd080YH1oLu4bS9wZVU9edLj6Ut3Bm1VVV2f5OGMLvR7wVL/nWV0tdpRs2+FAF41z60QE3G471GcDmyvqm9X1U+AjwPrJzymXlTVlxidYVpWqur2qrq+m/8ho1Ptqyc7qvHVyNTeCnG4B8VqYPal5LexDP7oDhdJTgROBea7ZWDJSbIiyTbgDmDLArdCTMThHhRaopIcDVwNvLqq7pn0ePpQVfdX1SnA8cDpSabmK+PhHhQ7gTWzlo/v1mmKdd/hrwY+UlWfnvR4+rbQrRCTdLgHxXXAyUkem+QhwPnApgmPSQfQHfR7H3BLVb1l0uPpy2JuhZikwzooqmofcAnwOUYHxT5RVTdNdlT9SPIx4D+Bxye5LcnLJj2mnjwDeAnw7FlPTDtn0oPqwSrgmiQ3MvoPbEtVfXbCY3rAYX16VNLiHNZ7FJIWx6CQ1GRQSGoyKCQ1GRSSmgwKSU0GhaSm/wczdPwbKYwSyAAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"samples = [\n", | |
" [[0, 1, 1, 1],\n", | |
" [0, 1, 0, 0],\n", | |
" [0, 1, 1, 0],\n", | |
" [0, 1, 1, 1]],\n", | |
" \n", | |
" [[0, 0, 0, 1],\n", | |
" [0, 0, 0, 1],\n", | |
" [0, 0, 1, 1],\n", | |
" [0, 0, 0, 1]],\n", | |
" \n", | |
" [[1, 0, 1, 0],\n", | |
" [1, 0, 1, 0],\n", | |
" [1, 1, 1, 0],\n", | |
" [1, 0, 1, 0]]\n", | |
"]\n", | |
"\n", | |
"for item in samples:\n", | |
" plot_item(item)" | |
] | |
}, | |
{ | |
"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