Skip to content

Instantly share code, notes, and snippets.

@davidalves1
Last active June 22, 2018 23:12
Show Gist options
  • Save davidalves1/098b2bcc5d1272a0efb3f67baad15239 to your computer and use it in GitHub Desktop.
Save davidalves1/098b2bcc5d1272a0efb3f67baad15239 to your computer and use it in GitHub Desktop.
Exemplo de rede neural sem peso utilizando o algoritmo WiSARD
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)]
Display the source blob
Display the rendered blob
Raw
{
"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": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\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