def trainKohonenNetowork1D( alfa, m, L, r, params ): """ @brief { Entrenamiento de la Red de Kohonen } param[in] <alfa> { Coeficiente de aprendizaje } param[in] <m> { Número de neuronas } param[in] <L> { Número de presentaciones } param[in] <params> { [coficiente de aprendizaje, Tipo de inicialización de pesos, Tipo de Distancia Euclidiana] } param[in] <r> { Radio } @return { Pesos de las neuronas } """ global basePath sizeVector = 784 if params[1] == 1 : W = myLib.randomMatrix( m, sizeVector ) else : W = myLib.constMatrix( m, sizeVector, 0.5 ) for l in range( L ) : print("Presentación: ", l+1) if params[0] == -1 : alfa = 1.0 / ( l + 2 ) while True : path = myLib.nextImage( basePath ) # No hay más imágenes if( path == "" ) : break X = myLib.loadImage( path ) minD = math.inf minN = -1; # Obteniendo la j-esima neurona mas cercana a X for j in range( m ) : d = distance( X, W[j], params[2] ) if minD > d : minD = d minN = j winnerNeuron = minN # No hay vecindarios, solo se actualiza la neurona ganadora for j in range( len( W ) ) : fphi = phi( winnerNeuron, j, r ) if fphi != 0 : for i in range( len( W[j] ) ) : W[j][i] += alfa * ( X[i] - W[j][i] ) * fphi # Reiniciar parámetros de lectura de las imágenes myLib.resetDirectory() return W
def trainKohonenNetowork1D(alfa, m, L, r, params): """ @brief { Entrenamiento de la Red de Kohonen } param[in] <alfa> { Coeficiente de aprendizaje } param[in] <m> { Número de neuronas } param[in] <L> { Número de presentaciones } param[in] <params> { [coficiente de aprendizaje, Tipo de inicialización de pesos, Tipo de Distancia Euclidiana] } param[in] <r> { Radio } @return { Pesos de las neuronas } """ global basePath sizeVector = 784 if params[1] == 1: W = myLib.randomMatrix(m, sizeVector) else: W = myLib.constMatrix(m, sizeVector, 0.5) for l in range(L): print("Presentación: ", l + 1) if params[0] == -1: alfa = 1.0 / (l + 2) while True: path = myLib.nextImage(basePath) # No hay más imágenes if (path == ""): break X = myLib.loadImage(path) minD = math.inf minN = -1 # Obteniendo la j-esima neurona mas cercana a X for j in range(m): d = distance(X, W[j], params[2]) if minD > d: minD = d minN = j winnerNeuron = minN # No hay vecindarios, solo se actualiza la neurona ganadora for j in range(len(W)): fphi = phi(winnerNeuron, j, r) if fphi != 0: for i in range(len(W[j])): W[j][i] += alfa * (X[i] - W[j][i]) * fphi # Reiniciar parámetros de lectura de las imágenes myLib.resetDirectory() return W
def test( filename, p, n, q ) : W_output = myLib.loadMatrix("Capas/CapaSalida") W_hiddens = [] for i in range( len( n ) ) : W_hiddens.append( myLib.loadMatrix( "Capas/CapaOculta" + str(i+1)) ) X = myLib.loadImage( filename ) a, O = propagation( p, n, q, W_hiddens, W_output, X ) print(O) for num in O : print( int(num+0.5) ) out = 0 for i in range( q ) : out = out | ( int( O[i] + 0.5 ) << i ) print("Valor proporcionado por la red: ", out)
def KohonenNetworkClassifier(W, m, distanceType): """ @brief { Entrenamiento de la Red de Kohonen } param[in] <W> { Pesos de las neuronas } param[in] <m> { Número de neuronas } param[in] <distanceType> { Tipo de Distancia Euclidiana} @return { Neurona ganadora } """ global basePath distributionClass = {} distributionClass2 = [] for j in range(m): distributionClass["Clase " + str(j)] = 0 distributionClass2.append(0) while True: path = myLib.nextImage(basePath) # No hay más imágenes if (path == ""): break X = myLib.loadImage(path) minD = math.inf minN = -1 for j in range(m): d = distance(X, W[j], distanceType) if minD > d: minD = d minN = j distributionClass["Clase " + str(minN)] += 1 distributionClass2[minN] += 1 myLib.saveOImage( X, "representantes/" + "Clase " + str(minN) + "-" + str(minD) + ".jpg") myLib.resetDirectory() print(distributionClass) print(distributionClass2)
def KohonenNetworkClassifier( W, m, distanceType ) : """ @brief { Entrenamiento de la Red de Kohonen } param[in] <W> { Pesos de las neuronas } param[in] <m> { Número de neuronas } param[in] <distanceType> { Tipo de Distancia Euclidiana} @return { Neurona ganadora } """ global basePath distributionClass = {} distributionClass2 = [] for j in range( m ): distributionClass[ "Clase " + str(j) ] = 0 distributionClass2.append(0) while True : path = myLib.nextImage( basePath ) # No hay más imágenes if( path == "" ) : break X = myLib.loadImage( path ) minD = math.inf minN = -1 for j in range( m ) : d = distance( X, W[j], distanceType ) if minD > d : minD = d minN = j distributionClass[ "Clase " + str(minN) ] += 1 distributionClass2[ minN ] += 1 myLib.saveOImage( X, "representantes/" + "Clase " + str(minN) + "-" + str(minD) + ".jpg" ) myLib.resetDirectory() print( distributionClass ) print( distributionClass2 )
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