-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcamada.py
118 lines (95 loc) · 4.49 KB
/
camada.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from neuronio import Neuronio
# from settings import ultimo_id_neuronio
import random
class Camada:
'''Classe que define uma camada contendo
uma lista de neuronios, a quantidade de neuronios
e o identificador do último neuronio inserido na
lista, para controle.
'''
def __init__(self, quantos_neuronios):
self.neuronios = []
self.quantos_neuronios = quantos_neuronios
self.id_ultimo_neuronio = 0
'''Método que lê as entradas e cria os neurônios de acordo
nome_arquivo : string
quantas_entradas : int
ultimo_id_neuronio : int
learning_rate : float
momentum : float
'''
def le_camada_entrada(self, nome_arquivo, quantas_entradas, ultimo_id_neuronio, learning_rate,momentum ):
with open(nome_arquivo, 'r') as arquivo_leitura_entrada:
quantos_leu = 0
for linha in arquivo_leitura_entrada:
linha_quebrada = linha.split(' ')
for i in linha_quebrada[0]: # pega as ENTRADAS somente (desconsidera saída esperada AINDA)
n = Neuronio(ultimo_id_neuronio,i, learning_rate, momentum) # passando peso -1 como teste apenas
n.entradas = [float(i)]
n.saida = float(i) # coloca entrada na saída para primeira camada
self.neuronios.append(n)
ultimo_id_neuronio += 1
quantos_leu += 1
if(quantos_leu == quantas_entradas):
self.exibe_neuronios()
break
return ultimo_id_neuronio
'''Método que lê as entradas
nome_arquivo : string
quantas_entradas : int
ultimo_id_neuronio : int
learning_rate : float
momentum : float
'''
def le_entrada(self,nome_arquivo, quantas_entradas,qual_pos_le):
with open(nome_arquivo, 'r') as arquivo_leitura_entrada:
quantos_leu = 0
indice_neuronio=0
linha_leitura=0
for linha in arquivo_leitura_entrada:
if(linha_leitura==qual_pos_le):
linha_quebrada = linha.split(' ')
for i in linha_quebrada[0]: # pega as ENTRADAS somente (desconsidera saída esperada AINDA)
self.neuronios[indice_neuronio].saida = i
indice_neuronio += 1
quantos_leu += 1
if(quantos_leu == quantas_entradas):
break
else:
linha_leitura += 1
def __gera_peso_aleatorio__(self):
return round(random.uniform(0,0.1),4)
def exibe_neuronios(self):
for neuronio in self.neuronios:
print(neuronio)
def fator_erro_camada_intermediaria(self,proxima_camada):
for i in range(len(self.neuronios)):
fator_erro = 0
for j in range(len(proxima_camada.neuronios)):
indice_neuronio_conexao = proxima_camada.neuronios[j].retorna_indice_neuronio_entrada_por_id(self.neuronios[i].id)
fator_erro += (proxima_camada.neuronios[j].erro * proxima_camada.neuronios[j].pesos[indice_neuronio_conexao])
self.neuronios[i].fator_erro = fator_erro
return self.neuronios
def atualiza_neuronios(self, novos_neuronios):
for novo_neuronio in novos_neuronios:
for i in range(len(self.neuronios)):
self.neuronios[i].atualiza_entrada_por_id(novo_neuronio)
def update_pesos(self):
for i in range(len(self.neuronios)):
self.neuronios[i].update_pesos()
def calculo_fator_erro_erro(self, proxima_camada):
self.neuronios = self.fator_erro_camada_intermediaria(proxima_camada)
for i in range(len(self.neuronios)):
self.neuronios[i].calculo_erro()
def update_saida(self):
for i in range(len(self.neuronios)):
self.neuronios[i].summation_unit()
self.neuronios[i].transfer_function()
def retorna_saida_neuronios_formatada(self):
saida_formatada = self.__formata_saida_neuronios__()
return ''.join(saida_formatada)
def print_saida_neuronios(self):
print(self.retorna_saida_neuronios_formatada())
def __formata_saida_neuronios__(self):
valor_maximo = max(neuronio.saida for neuronio in self.neuronios)
return [ '1' if neuronio.saida >= valor_maximo else '0' for neuronio in self.neuronios ]