示例#1
0
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
示例#2
0
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
示例#3
0
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)
示例#4
0
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)
示例#5
0
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 )
示例#6
0
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