def propagation( p, n, q, W_input, W_hiddens, W_output, X ) : global Errors global ents # Número de capas ocultas m = len( n ) I = [] # Salida de las neuronas de la capa de entrada a = [] # Salida de las neuronas de la capa de salida O = [] # Salida de las neuronas de las capas ocultas # Capa de entrada ents_k = [] # Para cada Neurona for k in range( p ) : # Un solo peso ent_k = W_input[k][0] * X[k] I.append( g( ent_k ) ) # Guardar el valor de la sumatoria sin función de activación # para evitar doble cálculo en la función de retropropagación ents_k.append( ent_k ) ents.append( ents_k ) # Capas de ocultas for i in range( m ) : a_tmp = [] ents_j = [] # Para cada neurona for j in range( n[i] ) : ent_j = 0.0 # Primer capa oculta if i == 0 : for k in range( p ) : ent_j += W_hiddens[i][j][k] * I[k] # Demás capas ocultas else : for k in range( n[i-1] ) : ent_j += W_hiddens[i][j][k] * a[i-1][k] a_tmp.append( g( ent_j ) ) # Guardar el valor de la sumatoria sin función de activación # para evitar doble cálculo en la función de retropropagación ents_j.append( ent_j ) ents.append( ents_j ) a.append( a_tmp ) # Capa de salida ents_i = [] for i in range( q ) : ent_i = 0.0 for j in range( n[m-1] ) : ent_i += W_output[i][j] * a[m-1][j] O.append( g( ent_i ) ) ents_i.append( ent_i ) ents.append( ents_i ) # Calculando Error de aprendizaje de la imagen Err = 0.0 for i in range( q ) : # Error entre salida esperada y proporcionada por la neurona ev = myLib.getExpectedValue() Ti = (ev >> i) & 1 Err += ( Ti - O[i] ) * ( Ti - O[i] ) Err /= 4.0 Errors.append( Err ) return I,a,O
def propagation(p, n, q, W_input, W_hiddens, W_output, X): global Errors global ents # Número de capas ocultas m = len(n) I = [] # Salida de las neuronas de la capa de entrada a = [] # Salida de las neuronas de la capa de salida O = [] # Salida de las neuronas de las capas ocultas # Capa de entrada ents_k = [] # Para cada Neurona for k in range(p): # Un solo peso ent_k = W_input[k][0] * X[k] I.append(g(ent_k)) # Guardar el valor de la sumatoria sin función de activación # para evitar doble cálculo en la función de retropropagación ents_k.append(ent_k) ents.append(ents_k) # Capas de ocultas for i in range(m): a_tmp = [] ents_j = [] # Para cada neurona for j in range(n[i]): ent_j = 0.0 # Primer capa oculta if i == 0: for k in range(p): ent_j += W_hiddens[i][j][k] * I[k] # Demás capas ocultas else: for k in range(n[i - 1]): ent_j += W_hiddens[i][j][k] * a[i - 1][k] a_tmp.append(g(ent_j)) # Guardar el valor de la sumatoria sin función de activación # para evitar doble cálculo en la función de retropropagación ents_j.append(ent_j) ents.append(ents_j) a.append(a_tmp) # Capa de salida ents_i = [] for i in range(q): ent_i = 0.0 for j in range(n[m - 1]): ent_i += W_output[i][j] * a[m - 1][j] O.append(g(ent_i)) ents_i.append(ent_i) ents.append(ents_i) # Calculando Error de aprendizaje de la imagen Err = 0.0 for i in range(q): # Error entre salida esperada y proporcionada por la neurona ev = myLib.getExpectedValue() Ti = (ev >> i) & 1 Err += (Ti - O[i]) * (Ti - O[i]) Err /= 4.0 Errors.append(Err) return I, a, O
def backpropagation( basePath, p, n, q, T, miu ) : global NDIR global Error global Errors global ents # Número de capas ocultas m = len( n ) W_input = myLib.randomMatrix( p, 1 ) W_hiddens = myLib.randomMultiMatrix( p, n ) W_output = myLib.randomMatrix( q, n[m-1] ) for t in range( T ) : print( "Presentación ", t+1 ) while True : path = myLib.nextImage( basePath ) # No hay más imágenes if( path == "" ) : break X = myLib.loadImage( path ) # Valores de las sumatorias de cada capa sin función de activación ents = [] I, a, O = propagation( p, n, q, W_input, W_hiddens, W_output, X ) # Actalizando pesos de la i-ésima neurona de la capa de salida preDelta = [] # Para cada neurona de la capa de salida for i in range( q ) : # Error entre salida esperada y proporcionada por la neurona ev = myLib.getExpectedValue() Ti = (ev >> i) & 1 Err_i = Ti - O[i] # Sumatoria de salida para la i-ésima neurona de la capa de salida ent_i = ents[ len(ents) - 1 ][i] # Se obtiene Delta_i delta_i = Err_i * Dg( ent_i ) preDelta.append( delta_i ) # Se actualiza cada peso de la i-ésima neurona for j in range( n[m-1] ) : W_output[i][j] += miu * a[m-1][j] * delta_i # Para cada capa oculta actDelta = [] for l in range( m ) : if l != 0 : preDelta = actDelta actDelta = [] # Actalizando pesos de la j-ésima neurona de la l-ésima capa oculta for j in range( n[ m-l-1 ] ) : # Sumatoria de salida para la j-ésima neurona de la l-ésima capa oculta ent_j = ents[m-l][j] # Se calcula delta_j delta_j = 0.0 # Última capa oculta if l == 0 : for i in range( q ) : delta_j += W_output[i][j] * preDelta[i] # Capas intermedias else : for i in range( n[m-l] ) : delta_j += W_hiddens[m-l][i][j] * preDelta[i] delta_j *= Dg( ent_j ) actDelta.append( delta_j ) # Se actualiza cada peso de la j-ésima neurona de la l-ésima capa oculta # Para la primer capa oculta if l == m-1 : for k in range( p ) : W_hiddens[0][j][k] += miu * X[k] * delta_j # Para la capas ocultas intermedias else : for k in range( n[m-l-1] ) : W_hiddens[m-l-1][j][k] += miu * a[m-l-2][k] * delta_j # Capa de entrada preDelta = actDelta for k in range( p ) : # Se calcula ent_k ent_k = ents[0][k] # Se calcula delta_j delta_k = 0.0 for j in range( n[0] ) : delta_k += W_hiddens[0][j][k] * preDelta[j] delta_k *= Dg( ent_k ) # Se actualiza cada peso de la k-ésima neurona W_input[k][0] += miu * X[k] * delta_k # Calculando el error global por presentación del conjunto de imágenes tmp = 0.0 for e in Errors : tmp += e Error.append( tmp ) Errors = [] print( "Error =>" , Error[-1] ) # Reiniciar parámetros de lectura de las imágenes myLib.resetDirectory() return W_input, W_hiddens, W_output
def backpropagation(basePath, p, n, q, T, miu): global NDIR global Error global Errors global ents # Número de capas ocultas m = len(n) W_input = myLib.randomMatrix(p, 1) W_hiddens = myLib.randomMultiMatrix(p, n) W_output = myLib.randomMatrix(q, n[m - 1]) for t in range(T): print("Presentación ", t + 1) while True: path = myLib.nextImage(basePath) # No hay más imágenes if (path == ""): break X = myLib.loadImage(path) # Valores de las sumatorias de cada capa sin función de activación ents = [] I, a, O = propagation(p, n, q, W_input, W_hiddens, W_output, X) # Actalizando pesos de la i-ésima neurona de la capa de salida preDelta = [] # Para cada neurona de la capa de salida for i in range(q): # Error entre salida esperada y proporcionada por la neurona ev = myLib.getExpectedValue() Ti = (ev >> i) & 1 Err_i = Ti - O[i] # Sumatoria de salida para la i-ésima neurona de la capa de salida ent_i = ents[len(ents) - 1][i] # Se obtiene Delta_i delta_i = Err_i * Dg(ent_i) preDelta.append(delta_i) # Se actualiza cada peso de la i-ésima neurona for j in range(n[m - 1]): W_output[i][j] += miu * a[m - 1][j] * delta_i # Para cada capa oculta actDelta = [] for l in range(m): if l != 0: preDelta = actDelta actDelta = [] # Actalizando pesos de la j-ésima neurona de la l-ésima capa oculta for j in range(n[m - l - 1]): # Sumatoria de salida para la j-ésima neurona de la l-ésima capa oculta ent_j = ents[m - l][j] # Se calcula delta_j delta_j = 0.0 # Última capa oculta if l == 0: for i in range(q): delta_j += W_output[i][j] * preDelta[i] # Capas intermedias else: for i in range(n[m - l]): delta_j += W_hiddens[m - l][i][j] * preDelta[i] delta_j *= Dg(ent_j) actDelta.append(delta_j) # Se actualiza cada peso de la j-ésima neurona de la l-ésima capa oculta # Para la primer capa oculta if l == m - 1: for k in range(p): W_hiddens[0][j][k] += miu * X[k] * delta_j # Para la capas ocultas intermedias else: for k in range(n[m - l - 1]): W_hiddens[m - l - 1][j][k] += miu * a[m - l - 2][k] * delta_j # Capa de entrada preDelta = actDelta for k in range(p): # Se calcula ent_k ent_k = ents[0][k] # Se calcula delta_j delta_k = 0.0 for j in range(n[0]): delta_k += W_hiddens[0][j][k] * preDelta[j] delta_k *= Dg(ent_k) # Se actualiza cada peso de la k-ésima neurona W_input[k][0] += miu * X[k] * delta_k # Calculando el error global por presentación del conjunto de imágenes tmp = 0.0 for e in Errors: tmp += e Error.append(tmp) Errors = [] print("Error =>", Error[-1]) # Reiniciar parámetros de lectura de las imágenes myLib.resetDirectory() return W_input, W_hiddens, W_output