コード例 #1
0
def test():
    assert len(sys.argv) == 2, "cantidad incorrecta de parametros"

    parametros = {}
    parametros['general'] = ['mnist']
    parametros['nombre'] = ['dbn']
    parametros['tipo'] = ['binaria']
    parametros['capas'] = []
    parametros['epocasTRN'] = [[50]]
    parametros['epocasFIT'] = [100]
    parametros['tambatch'] = [10]
    parametros['tasaAprenTRN'] = [0.01]
    parametros['tasaAprenFIT'] = [0.1]
    parametros['regularizadorL1'] = [0.0]
    parametros['regularizadorL2'] = [0.0]
    parametros['momentoTRN'] = [0.0]
    parametros['momentoFIT'] = [0.0]
    parametros['pasosGibbs'] = [5]
    parametros['porcentaje'] = [0.8]
    parametros['toleranciaError'] = [0.0]
    parametros['pcd'] = [True]
    parametros['directorio'] = ['dbn_mnist']
    parametros['dataset'] = [sys.argv[1]]
    parametros['capas'] = [[784, 500, 100, 10]]

    Grid = ParameterGrid(parametros)
    parametros = Grid[0]
    nombreArchivo = 'resultados_dbn_MNIST'
    print(
        "GUARDANDO LOS RESULTADOS EN EL ARCHIVO {}\n\n".format(nombreArchivo))

    ##
    ##
    tiempo_entrenar = 0
    tiempo_ajustar = 0
    tiempo_total = 0
    T = temporizador()
    inicio = T.tic()
    directorioActual = os.getcwd()  # directorio actual de ejecucion
    rutaDatos = str(directorioActual) + '/cupydle/data/DB_' + str(
        parametros['general']) + '/'  # donde se almacenan la base de datos

    print("****************************************************")
    print("PARAMETROS:")
    for k in sorted(parametros.keys()):
        print(str("{: >20} : {: <20}").format(k, str(parametros[k])))

    # creo la dbn
    d = dbn_base_test(**parametros)

    ###########################################################################
    ##   P R E P A R A N D O   L O S   D A T O S   E N T R E N A M I E N T O
    ###########################################################################

    # se cargan  los datos, debe ser un archivo comprimido, en el cual los
    # arreglos estan en dos keys, 'entrenamiento' y 'entrenamiento_clases'
    try:
        datos = np.load(rutaDatos + str(sys.argv[1]))
    except:
        assert False, "El dataset no existe en la ruta: " + rutaDatos + str(
            sys.argv[1])

    entrenamiento = datos['entrenamiento'].astype(np.float32)
    entrenamiento_clases = datos['entrenamiento_clases'].astype(np.int32)
    del datos  # libera memoria

    datosDBN = []
    datosDBN.append((entrenamiento, entrenamiento_clases))
    del entrenamiento, entrenamiento_clases

    ## se entrena
    tiempo_entrenar = d.entrenar(data=datosDBN)
    del datosDBN

    ###########################################################################
    ##   P R E P A R A N D O   L O S   D A T O S   A J U S T E  F I N O
    ###########################################################################
    try:
        datos = np.load(rutaDatos + str(sys.argv[1]))
    except:
        assert False, "El dataset no existe en la ruta: " + rutaDatos + str(
            sys.argv[1])

    entrenamiento = datos['entrenamiento'].astype(np.float32)
    entrenamiento_clases = datos['entrenamiento_clases'].astype(np.int32)
    validacion = datos['validacion'].astype(np.float32)
    validacion_clases = datos['validacion_clases'].astype(np.int32)
    testeo = datos['testeo'].astype(np.float32)
    testeo_clases = datos['testeo_clases'].astype(np.int32)
    del datos  # libera memoria

    datosMLP = []
    datosMLP.append((entrenamiento, entrenamiento_clases))
    datosMLP.append((validacion, validacion_clases))
    datosMLP.append((testeo, testeo_clases))
    del entrenamiento, entrenamiento_clases, validacion, validacion_clases, testeo, testeo_clases

    ## se ajustan
    costoTRN, costoVAL, costoTST, costoTST_final, tiempo_ajustar = d.ajustar(
        datos=datosMLP)
    del datosMLP
    #

    #almaceno los resultados generales
    _guardar(nombreArchivo=nombreArchivo,
             valor={
                 'parametros': parametros,
                 'costoTRN': costoTRN,
                 'costoVAL': costoVAL,
                 'costoTST': costoTST,
                 'costoTST_final': costoTST_final
             })
    print("\n\n")

    final = T.toc()
    tiempo_total = T.transcurrido(inicio, final)

    print("TIEMPOS [HH:MM:SS.ss]:")
    print("->  Entrenamiento: {}".format(T.transcurrido(0, tiempo_entrenar)))
    print("->  Ajuste:        {}".format(T.transcurrido(0, tiempo_ajustar)))
    print("->  Total:         {}".format(T.transcurrido(inicio, final)))
    return 0
コード例 #2
0
    print("Prueba con tecnicas de validacion cruzada...")
    print("Numero de particiones: ", folds)
    print("Porcentaje entrenamiento/validacion: ", porcentaje)

    errorTRN_conjunto = []
    errorVAL_conjunto = []
    errorTST_conjunto = []
    errorTST_conjunto_h = []

    ###########################################################################
    ##
    ##          P R E - E N T R E N A M I E N T O        R B M s
    ##
    ###########################################################################
    T = temporizador()
    inicio_todo = T.tic()

    for train_index, test_index in skf:

        contador += 1
        print("Particion < " + str(contador) + " >")

        datos = []
        cantidad = int(len(train_index) * porcentaje)
        datosTRN = (videos[train_index[:cantidad]],
                    clases[train_index[:cantidad]])
        datosVAL = (videos[train_index[cantidad:]],
                    clases[train_index[cantidad:]])
        datosTST = (videos[test_index], clases[test_index])
コード例 #3
0
ファイル: dbn_base.py プロジェクト: lerker/cupydle
def test():
    assert len(sys.argv) == 2, "cantidad incorrecta de parametros"
    parametros['dataset'] = [sys.argv[1]]
    parametros['capas'] = [[784, 100, 10]]
    #parametros['dataset'] = ["mnist_minmax.npz"]
    #parametros['capas'] = [[784, 100, 10], [85, 30, 6]]

    Grid = ParameterGrid(parametros)
    cantidad_combinaciones = len(Grid)
    cantidad_a_ejecutar = cantidad_combinaciones // 2

    nombreArchivo = 'resultados_dbnMNIST_gridSearch'
    print(
        "GUARDANDO LOS RESULTADOS EN EL ARCHIVO {} QUE CONTIENE {} ITERACIONES\n\n"
        .format(nombreArchivo, cantidad_a_ejecutar))

    T = temporizador()
    inicio = T.tic()

    for x in range(cantidad_a_ejecutar):
        T2 = temporizador()
        inicio2 = T2.tic()

        print("****************************************************")
        print("\n\n")
        print("Iteracion {} de {}".format(x, cantidad_a_ejecutar))
        print("PARAMETROS:")
        # modo random la eleccion de los parametros sobre el conjunto posible
        indice = np.random.randint(cantidad_combinaciones)
        # no tengo implementada el __setitem__ en ParameterGrid
        params = Grid[indice]
        params['directorio'] = 'dbn_grid_' + str(x)
        for k in sorted(params.keys()):
            print(str("{: >25} : {: <50}").format(k, str(params[k])))
        print("\n\n")
        d = dbn_base_test(**params)

        ##
        ###########################################################################
        ##
        ##   P R E P A R A N D O   L O S   D A T O S   E N T R E N A M I E N T O
        ##
        ###########################################################################

        # se cargan  los datos, debe ser un archivo comprimido, en el cual los
        # arreglos estan en dos keys, 'videos' y 'clases'
        directorioActual = os.getcwd()  # directorio actual de ejecucion
        rutaDatos = str(directorioActual) + '/cupydle/data/DB_' + str(
            parametros['general']
            [0]) + '/'  # donde se almacenan la base de datos
        try:
            datos = np.load(rutaDatos + str(sys.argv[1]))
        except:
            assert False, "El dataset no existe en la ruta: " + rutaDatos + str(
                sys.argv[1])

        entrenamiento = datos['entrenamiento'].astype(np.float32)
        entrenamiento_clases = datos['entrenamiento_clases'].astype(np.int32)
        del datos  # libera memoria

        datosDBN = []
        datosDBN.append((entrenamiento, entrenamiento_clases))
        del entrenamiento, entrenamiento_clases
        ##
        d.entrenar(data=datosDBN)
        del datosDBN

        ##
        ###########################################################################
        ##
        ##   P R E P A R A N D O   L O S   D A T O S   A J U S T E  F I N O
        ##
        ###########################################################################

        # se cargan  los datos, debe ser un archivo comprimido, en el cual los
        # arreglos estan en dos keys, 'videos' y 'clases'
        try:
            datos = np.load(rutaDatos + str(sys.argv[1]))
        except:
            assert False, "El dataset no existe en la ruta: " + rutaDatos + str(
                sys.argv[1])

        entrenamiento = datos['entrenamiento'].astype(np.float32)
        entrenamiento_clases = datos['entrenamiento_clases'].astype(np.int32)
        validacion = datos['validacion'].astype(np.float32)
        validacion_clases = datos['validacion_clases'].astype(np.int32)
        testeo = datos['testeo'].astype(np.float32)
        testeo_clases = datos['testeo_clases'].astype(np.int32)
        del datos  # libera memoria

        datosMLP = []
        datosMLP.append((entrenamiento, entrenamiento_clases))
        datosMLP.append((validacion, validacion_clases))
        datosMLP.append((testeo, testeo_clases))
        del entrenamiento, entrenamiento_clases, validacion, validacion_clases
        del testeo, testeo_clases
        ##
        costoTRN, costoVAL, costoTST, costoTST_final = d.ajustar(
            datos=datosMLP)
        del datosMLP
        #

        _guardar(nombreArchivo=nombreArchivo,
                 valor={
                     str(x): {
                         'parametros': params,
                         'costoTRN': costoTRN,
                         'costoVAL': costoVAL,
                         'costoTST': costoTST,
                         'costoTST_final': costoTST_final
                     }
                 })

        final2 = T2.toc()
        print("\n\nPaso de la grilla terminado, iteracion " + str(x + 1) +
              "\n\n")
        print("Tiempo: {}".format(T2.transcurrido(inicio2, final2)))
        print("****************************************************")
        print("\n\n")

    final = T.toc()
    print("\n\nGRID SEARCH  FINALIZADO\n\n")
    print("Tiempo total requerido: {}".format(T.transcurrido(inicio, final)))

    return 0
コード例 #4
0
def test(archivoResultados, noEntrenar, **parametrosd):
    """
    parametros = {}
    parametros['general']         = [general]
    parametros['nombre']          = ['dbn']
    parametros['tipo']            = ['binaria']
    parametros['capas']           = []
    parametros['epocasTRN']       = [[50]]
    parametros['epocasFIT']       = [100]
    parametros['tambatch']        = [10]
    parametros['tasaAprenTRN']    = [0.01]
    parametros['tasaAprenFIT']    = [0.1]
    parametros['regularizadorL1'] = [0.0]
    parametros['regularizadorL2'] = [0.0]
    parametros['momentoTRN']      = [0.0]
    parametros['momentoFIT']      = [0.0]
    parametros['pasosGibbs']      = [5]
    parametros['porcentaje']      = [0.08]
    parametros['toleranciaError'] = [0.0]
    parametros['pcd']             = [True]
    parametros['directorio']      = [directorio]
    parametros['dataset']         = [dataset]
    parametros['capas']           = capas
    """
    parametros = parametrosd

    validacionCruzada = False
    #parametros['folds'] = parametros['folds'][0] if isinstance(parametros['folds'],list) else parametros['folds']
    folds = parametros['folds'][0]
    if folds != 1:
        validacionCruzada = True
        errorTRN_conjunto = []
        errorVAL_conjunto = []
        errorTST_conjunto = []
        errorTST_conjunto_h = []

    Grid = ParameterGrid(parametros)
    parametros = Grid[0]
    print("GUARDANDO LOS RESULTADOS EN EL ARCHIVO {}\n\n".format(
        archivoResultados))

    ##
    ##
    if validacionCruzada:
        print("Prueba con tecnicas de validacion cruzada...")
        print("Numero de particiones: ", folds)
        print("Porcentaje entrenamiento/validacion: ",
              parametros['porcentaje'])

        tiempo_entrenar = 0
        tiempo_ajustar = 0
        tiempo_total = 0
        T = temporizador()
        inicio = T.tic()
        directorioActual = os.getcwd()  # directorio actual de ejecucion
        rutaDatos = str(directorioActual) + '/cupydle/data/DB_' + str(
            parametros['general']) + '/'  # donde se almacenan la base de datos

        carpetaConjunto = parametros['directorio'] + '_k_fold_'

        print("****************************************************")
        print("PARAMETROS:")
        for k in sorted(parametros.keys()):
            print(str("{: >20} : {: <20}").format(k, str(parametros[k])))

        try:
            datos = np.load(rutaDatos + dataset)
        except:
            assert False, "El dataset no existe en la ruta: " + rutaDatos + dataset

        KML = False
        if 'videos' in datos.keys():
            KML = True
        if KML:
            clases = datos[
                'clases'] - 1  # las clases estan desde 1..6, deben ser desde 0..5
            del datos
            skf = StratifiedKFold(clases, n_folds=folds)
            del clases
        else:
            # no se puede hacer por stratifiedFold porque no estan balanceadas las clases desde un principio
            #por lo que quedan mal cualquier configuracion de fold..
            # dividirlas variaas veces de forma random
            entrenamiento_clases = datos['entrenamiento_clases'].astype(
                np.int32)  #las clases creo que arrancan bien
            #validacion_clases    = datos['validacion_clases'].astype(np.int32)
            #testeo_clases        = datos['testeo_clases'].astype(np.int32)
            del datos
            #trn_clases = np.concatenate((entrenamiento_clases, validacion_clases))
            #skf = StratifiedKFold(trn_clases, n_folds=folds)
            # se hace esto para mantener la compativilidad con KML
            skf = StratifiedKFold(entrenamiento_clases, n_folds=folds)
            del entrenamiento_clases
            #del validacion_clases, testeo_clases

        contador = 0
        errorTRN_conjunto = []
        errorVAL_conjunto = []
        errorTST_conjunto = []
        errorTST_conjunto_h = []
        T = temporizador()
        inicio_todo = T.tic()

        for train_index, test_index in skf:

            contador += 1
            print("Particion < " + str(contador) + " >")

            # creo la dbn
            parametros['directorio'] = carpetaConjunto + str(contador)
            d = dbn_base_test(**parametros)

            ###########################################################################
            ##   P R E P A R A N D O   L O S   D A T O S   E N T R E N A M I E N T O
            ###########################################################################

            # se cargan  los datos, debe ser un archivo comprimido, en el cual los
            # arreglos estan en dos keys, 'entrenamiento' y 'entrenamiento_clases'
            try:
                datos = np.load(rutaDatos + dataset)
            except:
                assert False, "El dataset no existe en la ruta: " + rutaDatos + dataset

            KML = False
            if 'videos' in datos.keys():
                KML = True

            if KML:
                videos = datos['videos']
                clases = datos[
                    'clases'] - 1  # las clases estan desde 1..6, deben ser desde 0..5
                del datos

                X_train, y_train = videos[train_index], clases[train_index]
                del videos, clases

                datosDBN = []
                datosDBN.append((X_train, y_train))
                del X_train, y_train
            else:
                entrenamiento = datos['entrenamiento'].astype(np.float32)
                validacion = datos['validacion'].astype(np.float32)
                entrenamiento_clases = datos['entrenamiento_clases'].astype(
                    np.int32)
                validacion_clases = datos['validacion_clases'].astype(np.int32)
                del datos

                trn_val = np.concatenate((entrenamiento, validacion))
                trn_val_c = np.concatenate(
                    (entrenamiento_clases, validacion_clases))
                del entrenamiento, entrenamiento_clases, validacion, validacion_clases

                # cantidad de elementos que debe tener cada conjunto
                cantidad = len(trn_val_c) // folds
                while cantidad % parametros['tambatch'] != 0:
                    cantidad += 1

                # indices desde 0 hasta len; # = cantidad, sin repeticion (replace=False)
                indices = np.random.choice(a=len(trn_val_c),
                                           size=cantidad,
                                           replace=False)

                datosDBN = []
                datosDBN.append((trn_val[indices], trn_val_c[indices]))

            ## se entrena, puede negarse con la variable de entorno "ENTRENAR"
            if not noEntrenar:
                tiempo_entrenar = d.entrenar(data=datosDBN)
            del datosDBN
            ##

            ###########################################################################
            ##   P R E P A R A N D O   L O S   D A T O S   A J U S T E  F I N O
            ###########################################################################
            try:
                datos = np.load(rutaDatos + dataset)
            except:
                assert False, "El dataset no existe en la ruta: " + rutaDatos + dataset

            KML = False
            if 'videos' in datos.keys():
                KML = True

            if KML:
                videos = datos['videos']
                clases = datos[
                    'clases'] - 1  # las clases estan desde 1..6, deben ser desde 0..5
                del datos  # libera memoria

                # se debe dividir los subconjuntos para que quepan los minibatch
                cantidad = int(len(train_index) * porcentaje)
                while cantidad % parametros['tambatch'] != 0:
                    cantidad += 1

                datosMLP = []
                datosMLP.append((videos[train_index[:cantidad]],
                                 clases[train_index[:cantidad]]))
                datosMLP.append((videos[train_index[cantidad:]],
                                 clases[train_index[cantidad:]]))
                datosMLP.append((videos[test_index], clases[test_index]))
                del videos, clases

            else:
                entrenamiento = datos['entrenamiento'].astype(np.float32)
                validacion = datos['validacion'].astype(np.float32)
                testeo = datos['testeo'].astype(np.float32)
                entrenamiento_clases = datos['entrenamiento_clases'].astype(
                    np.int32)
                validacion_clases = datos['validacion_clases'].astype(np.int32)
                testeo_clases = datos['testeo_clases'].astype(np.int32)
                del datos

                trn_val = np.concatenate((entrenamiento, validacion))
                trn_val_c = np.concatenate(
                    (entrenamiento_clases, validacion_clases))
                #del entrenamiento, entrenamiento_clases, validacion, validacion_clases

                # cantidad de elementos que debe tener cada conjunto
                cantidad_conjunto = int(len(trn_val_c)) // folds
                while cantidad_conjunto % parametros['tambatch'] != 0:
                    cantidad_conjunto += 1

                # cantidad de cada subconjunto, deben complementarse
                cantidad_subconjunto = int(cantidad_conjunto * porcentaje)
                while cantidad_subconjunto % parametros['tambatch'] != 0:
                    cantidad_subconjunto += 1

                cantidad_subconjunto_complemento = cantidad_conjunto - cantidad_subconjunto

                cantidad_tst = len(testeo_clases) // folds

                # indices desde 0 hasta len; # = cantidad, sin repeticion (replace=False)
                indices_trn = np.random.choice(a=len(entrenamiento),
                                               size=cantidad_subconjunto,
                                               replace=False)
                indices_val = np.random.choice(
                    a=len(validacion),
                    size=cantidad_subconjunto_complemento,
                    replace=False)
                indices_tst = np.random.choice(a=len(testeo),
                                               size=cantidad_tst,
                                               replace=False)

                datosMLP = []
                datosMLP.append((entrenamiento[indices_trn],
                                 entrenamiento_clases[indices_trn]))
                datosMLP.append(
                    (validacion[indices_val], validacion_clases[indices_val]))
                datosMLP.append(
                    (testeo[indices_tst], testeo_clases[indices_tst]))
                del entrenamiento, entrenamiento_clases, validacion, validacion_clases, testeo, testeo_clases

            ## se ajustan
            #costoTRN, costoVAL, costoTST, costoTST_final = 0.0,0.0,0.0,0.0
            costoTRN, costoVAL, costoTST, costoTST_final, tiempo_ajustar = d.ajustar(
                datos=datosMLP)
            del datosMLP

            errorTRN_conjunto.append(costoTRN)
            errorVAL_conjunto.append(costoVAL)
            errorTST_conjunto.append(costoTST)
            errorTST_conjunto_h.append(costoTST_final)

            #almaceno los resultados generales
            _guardar(nombreArchivo=archivoResultados,
                     valor={
                         'parametros': parametros,
                         'costoTRN': costoTRN,
                         'costoVAL': costoVAL,
                         'costoTST': costoTST,
                         'costoTST_final': costoTST_final
                     })
            print("\n\n")

            final = T.toc()
            tiempo_total = T.transcurrido(inicio, final)

            print("TIEMPOS [HH:MM:SS.ss]:")
            print("->  Entrenamiento: {}".format(
                T.transcurrido(0, tiempo_entrenar)))
            print("->  Ajuste:        {}".format(
                T.transcurrido(0, tiempo_ajustar)))
            print("->  Total:         {}".format(T.transcurrido(inicio,
                                                                final)))
            ####

        final_todo = T.toc()

        print("===============================================")
        print("Tiempo total para entrenamiento: {}".format(
            T.transcurrido(inicio_todo, final_todo)))

        print("PROMEDIO de ERRORES para los {} conjuntos".format(contador))
        print("Error Entrenamiento:    {: <8}".format(
            np.mean(errorTRN_conjunto) * 100.))
        print("Error Validacion:       {: <8}".format(
            np.mean(errorVAL_conjunto) * 100.))
        print("Error Testeo:           {: <8}".format(
            np.mean(errorTST_conjunto) * 100.))
        print("Error Testeo FINAL:     {: <8}".format(
            np.mean(errorTST_conjunto_h) * 100.))

    else:
        tiempo_entrenar = 0
        tiempo_ajustar = 0
        tiempo_total = 0
        T = temporizador()
        inicio = T.tic()
        directorioActual = os.getcwd()  # directorio actual de ejecucion
        rutaDatos = str(directorioActual) + '/cupydle/data/DB_' + str(
            parametros['general']) + '/'  # donde se almacenan la base de datos

        print("****************************************************")
        print("PARAMETROS:")
        for k in sorted(parametros.keys()):
            print(str("{: >20} : {: <20}").format(k, str(parametros[k])))

        # creo la dbn
        d = dbn_base_test(**parametros)

        ###########################################################################
        ##   P R E P A R A N D O   L O S   D A T O S   E N T R E N A M I E N T O
        ###########################################################################

        # se cargan  los datos, debe ser un archivo comprimido, en el cual los
        # arreglos estan en dos keys, 'entrenamiento' y 'entrenamiento_clases'
        try:
            datos = np.load(rutaDatos + dataset)
        except:
            assert False, "El dataset no existe en la ruta: " + rutaDatos + dataset

        KML = False
        if 'videos' in datos.keys():
            KML = True

        if KML:
            videos = datos['videos']
            clases = datos[
                'clases'] - 1  # las clases estan desde 1..6, deben ser desde 0..5
            del datos  # libera memoria

            # divido todo el conjunto con 120 ejemplos para el test
            # separo con un 86% aprox
            X_train, _, y_train, _ = train_test_split(videos,
                                                      clases,
                                                      test_size=120,
                                                      random_state=42)
            del videos, clases

            datosDBN = []
            datosDBN.append((X_train, y_train))
            del X_train, y_train
        else:

            entrenamiento = datos['entrenamiento']
            entrenamiento_clases = datos[
                'entrenamiento_clases']  #las clases creo que arrancan bien
            del datos  # libera memoria

            entrenamiento = entrenamiento.astype(np.float32)
            entrenamiento_clases = entrenamiento_clases.astype(np.int32)
            datosDBN = []
            datosDBN.append((entrenamiento, entrenamiento_clases))
            del entrenamiento, entrenamiento_clases

        ## se entrena, puede negarse con la variable de entorno "ENTRENAR"
        if not noEntrenar:
            tiempo_entrenar = d.entrenar(data=datosDBN)
        del datosDBN

        ###########################################################################
        ##   P R E P A R A N D O   L O S   D A T O S   A J U S T E  F I N O
        ###########################################################################
        try:
            datos = np.load(rutaDatos + dataset)
        except:
            assert False, "El dataset no existe en la ruta: " + rutaDatos + dataset

        KML = False
        if 'videos' in datos.keys():
            KML = True

        if KML:
            videos = datos['videos']
            clases = datos[
                'clases'] - 1  # las clases estan desde 1..6, deben ser desde 0..5
            del datos  # libera memoria

            # divido todo el conjunto con 120 ejemplos para el test
            # separo con un 86% aprox
            X_train, X_test, y_train, y_test = train_test_split(
                videos, clases, test_size=120, random_state=42)
            del videos, clases

            # me quedaron 600 ejemplos, lo divido de nuevo pero me quedo con 100 ejemplos para validacion
            X_train_sub, X_valid, y_train_sub, y_valid = train_test_split(
                X_train, y_train, test_size=100, random_state=42)
            del X_train, y_train

            datosMLP = []
            datosMLP.append((X_train_sub, y_train_sub))
            datosMLP.append((X_valid, y_valid))
            datosMLP.append((X_test, y_test))
            del X_train_sub, X_valid, y_train_sub, y_valid, X_test, y_test
        else:
            entrenamiento = np.asarray(datos['entrenamiento'],
                                       dtype=np.float32)
            validacion = np.asarray(datos['validacion'], dtype=np.float32)
            testeo = np.asarray(datos['testeo'], dtype=np.float32)
            entrenamiento_clases = np.asarray(datos['entrenamiento_clases'],
                                              dtype=np.int32)
            validacion_clases = np.asarray(datos['validacion_clases'],
                                           dtype=np.int32)
            testeo_clases = np.asarray(datos['testeo_clases'], dtype=np.int32)
            del datos

            datosMLP = []
            datosMLP.append((entrenamiento, entrenamiento_clases))
            datosMLP.append((validacion, validacion_clases))
            datosMLP.append((testeo, testeo_clases))
            del entrenamiento, entrenamiento_clases, validacion, validacion_clases, testeo, testeo_clases

        ## se ajustan
        costoTRN, costoVAL, costoTST, costoTST_final, tiempo_ajustar = d.ajustar(
            datos=datosMLP)
        del datosMLP
        #

        #almaceno los resultados generales
        _guardar(nombreArchivo=archivoResultados,
                 valor={
                     'parametros': parametros,
                     'costoTRN': costoTRN,
                     'costoVAL': costoVAL,
                     'costoTST': costoTST,
                     'costoTST_final': costoTST_final
                 })
        print("\n\n")

        final = T.toc()
        tiempo_total = T.transcurrido(inicio, final)

        print("TIEMPOS [HH:MM:SS.ss]:")
        print("->  Entrenamiento: {}".format(T.transcurrido(
            0, tiempo_entrenar)))
        print("->  Ajuste:        {}".format(T.transcurrido(0,
                                                            tiempo_ajustar)))
        print("->  Total:         {}".format(T.transcurrido(inicio, final)))
    return 0
コード例 #5
0
def test(archivoResultados, noEntrenar, **parametrosd):
    """
    parametros = {}
    parametros['general']         = [general]
    parametros['nombre']          = ['dbn']
    parametros['tipo']            = ['binaria']
    parametros['capas']           = []
    parametros['epocasTRN']       = [[50]]
    parametros['epocasFIT']       = [100]
    parametros['tambatch']        = [10]
    parametros['tasaAprenTRN']    = [0.01]
    parametros['tasaAprenFIT']    = [0.1]
    parametros['regularizadorL1'] = [0.0]
    parametros['regularizadorL2'] = [0.0]
    parametros['momentoTRN']      = [0.0]
    parametros['momentoFIT']      = [0.0]
    parametros['pasosGibbs']      = [5]
    parametros['porcentaje']      = [0.08]
    parametros['toleranciaError'] = [0.0]
    parametros['pcd']             = [True]
    parametros['directorio']      = [directorio]
    parametros['dataset']         = [dataset]
    parametros['capas']           = capas
    """
    parametros=parametrosd
    Grid = ParameterGrid(parametros)
    parametros = Grid[0]
    print("GUARDANDO LOS RESULTADOS EN EL ARCHIVO {}\n\n".format(archivoResultados))

    ##
    ##
    tiempo_entrenar = 0; tiempo_ajustar = 0; tiempo_total = 0
    T = temporizador() ; inicio = T.tic()
    directorioActual = os.getcwd() # directorio actual de ejecucion
    rutaDatos = str(directorioActual) + '/cupydle/data/DB_' + str(parametros['general']) +'/' # donde se almacenan la base de datos

    print("****************************************************")
    print("PARAMETROS:")
    for k in sorted(parametros.keys()):
        print(str("{: >20} : {: <20}").format(k, str(parametros[k])))

    # creo la dbn
    d = dbn_base_test(**parametros)

    ###########################################################################
    ##   P R E P A R A N D O   L O S   D A T O S   E N T R E N A M I E N T O
    ###########################################################################

    # se cargan  los datos, debe ser un archivo comprimido, en el cual los
    # arreglos estan en dos keys, 'entrenamiento' y 'entrenamiento_clases'
    try:
        datos = np.load(rutaDatos + parametros['dataset'])
    except:
        assert False, "El dataset no existe en la ruta: " + rutaDatos + parametros['dataset']

    KML = False
    if 'videos' in datos.keys():
        KML = True

    if KML:
        videos = datos['videos']
        clases = datos['clases'] - 1 # las clases estan desde 1..6, deben ser desde 0..5
        del datos # libera memoria

        # divido todo el conjunto con 120 ejemplos para el test
        # separo con un 86% aprox
        X_train, _, y_train, _ = train_test_split(videos, clases, test_size=120, random_state=np.random.randint(2**30))
        del videos, clases

        datosDBN = []; datosDBN.append((X_train, y_train))
        del X_train, y_train
    else:

        entrenamiento = datos['entrenamiento']
        entrenamiento_clases = datos['entrenamiento_clases'] #las clases creo que arrancan bien
        del datos # libera memoria

        entrenamiento = entrenamiento.astype(np.float32)
        entrenamiento_clases = entrenamiento_clases.astype(np.int32)
        datosDBN = []; datosDBN.append((entrenamiento, entrenamiento_clases))
        del entrenamiento, entrenamiento_clases

    ## se entrena, puede negarse con la variable de entorno "ENTRENAR"
    if not noEntrenar:
        tiempo_entrenar = d.entrenar(data=datosDBN)
    del datosDBN

    ###########################################################################
    ##   P R E P A R A N D O   L O S   D A T O S   A J U S T E  F I N O
    ###########################################################################
    try:
        datos = np.load(rutaDatos + parametros['dataset'])
    except:
        assert False, "El dataset no existe en la ruta: " + rutaDatos + parametros['dataset']

    KML = False
    if 'videos' in datos.keys():
        KML = True

    if KML:
        videos = datos['videos']
        clases = datos['clases'] - 1 # las clases estan desde 1..6, deben ser desde 0..5
        del datos # libera memoria

        # divido todo el conjunto con 120 ejemplos para el test
        # separo con un 86% aprox
        X_train, X_test, y_train, y_test = train_test_split(videos, clases, test_size=120, random_state=np.random.randint(2**30))
        del videos, clases

        # me quedaron 600 ejemplos, lo divido de nuevo pero me quedo con 100 ejemplos para validacion
        X_train_sub, X_valid, y_train_sub, y_valid = train_test_split(X_train, y_train, test_size=100, random_state=np.random.randint(2**30))
        del X_train, y_train

        datosMLP = []
        datosMLP.append((X_train_sub,y_train_sub)); datosMLP.append((X_valid,y_valid)); datosMLP.append((X_test,y_test))
        del X_train_sub, X_valid, y_train_sub, y_valid, X_test, y_test
    else:
        entrenamiento = np.asarray(datos['entrenamiento'], dtype=np.float32)
        validacion    = np.asarray(datos['validacion'], dtype=np.float32)
        testeo        = np.asarray(datos['testeo'], dtype=np.float32)
        entrenamiento_clases = np.asarray(datos['entrenamiento_clases'], dtype=np.int32)
        validacion_clases    = np.asarray(datos['validacion_clases'], dtype=np.int32)
        testeo_clases        = np.asarray(datos['testeo_clases'], dtype=np.int32)
        del datos

        datosMLP = []
        datosMLP.append((entrenamiento,entrenamiento_clases)); datosMLP.append((validacion,validacion_clases))
        datosMLP.append((testeo,testeo_clases))
        del entrenamiento,entrenamiento_clases,validacion,validacion_clases,testeo,testeo_clases

    ## se ajustan
    costoTRN, costoVAL, costoTST, costoTST_final, tiempo_ajustar = d.ajustar(datos=datosMLP)
    del datosMLP
    #

    #almaceno los resultados generales
    _guardar(nombreArchivo=archivoResultados, valor={'parametros':parametros, 'costoTRN':costoTRN, 'costoVAL':costoVAL, 'costoTST':costoTST, 'costoTST_final':costoTST_final })
    print("\n\n")

    final = T.toc()
    tiempo_total = T.transcurrido(inicio, final)

    print("TIEMPOS [HH:MM:SS.ss]:")
    print("->  Entrenamiento: {}".format(T.transcurrido(0,tiempo_entrenar)))
    print("->  Ajuste:        {}".format(T.transcurrido(0,tiempo_ajustar)))
    print("->  Total:         {}".format(T.transcurrido(inicio, final)))
    return costoTRN, costoVAL, costoTST, costoTST_final
コード例 #6
0
    def ajuste(self,
               datos,
               listaPesos=None,
               fnActivacion='sigmoidea',
               tambatch=10,
               semillaRandom=None):
        """
        construye un perceptron multicapa, y ajusta los pesos por medio de un
        entrenamiento supervisado.
        """
        bias = None
        if listaPesos is None:
            print("Cargando los pesos almacenados...") if DBN.DEBUG else None
            pesos = self._cargar(clave='pesos')
            bias = self._cargar(clave='bias')
            if pesos == []:
                print("PRECAUCION!!!, esta ajustando la red sin entrenarla!!!"
                      ) if DBN.DEBUG else None
                pesos = [None] * self.n_layers
                bias = [None] * self.n_layers
        else:
            pesos = listaPesos

        if bias == None:
            bias = [None] * self.n_layers

        activaciones = []
        if fnActivacion is not None:
            if isinstance(fnActivacion, list):
                assert len(fnActivacion) == len(
                    pesos), "No son suficientes funciones de activacion"
                activaciones = fnActivacion
            else:
                activaciones = [fnActivacion] * len(pesos)
        else:
            assert False, "Debe proveer una funcion de activacion"

        # se construye un mlp para el ajuste fino de los pesos con entrenamiento supervisado
        clasificador = MLP(clasificacion=True,
                           rng=semillaRandom,
                           ruta=self.ruta)

        ## solo cargo las keys del ajuste cargadas en las DBN al MLP buscando coincidencias y filtrando lo que no interesa
        tmp = clasificador.parametrosEntrenamiento
        clasificador.setParametroEntrenamiento(
            {k: self._cargar(clave=k)
             for k in tmp})
        del tmp

        # cargo en el perceptron multicapa los pesos en cada capa
        # como el fit es de clasificacion, las primeras n-1 capas son del tipo
        # 'logisticas' luego la ultima es un 'softmax'
        #assert False, "aca entra para cuando es custom pero no para el caso normal de una sola capa... debe entrar siempre"
        cantidadPesos = len(pesos) - 1 if DBN.DBN_custom else len(pesos)
        for i in range(0, cantidadPesos):
            clasificador.agregarCapa(unidadesEntrada=self.capas[i].n_visible,
                                     unidadesSalida=self.capas[i].n_hidden,
                                     clasificacion=False,
                                     activacion=activaciones[i],
                                     pesos=pesos[i],
                                     biases=bias[i])

        if DBN.DBN_custom:
            # en este tipo carga la red y entrena con los pesos tal cual fue preentrenada.
            print("Ajustando con metodo \'custom\'")
            clasificador.agregarCapa(unidadesEntrada=self.capas[-1].n_visible,
                                     unidadesSalida=self.capas[-1].n_hidden,
                                     clasificacion=True,
                                     activacion=activaciones[-1],
                                     pesos=pesos[-1],
                                     biases=bias[-1])
        else:
            # w = numpy.zeros((self.capas[-1].n_visible, self.capas[-1].n_hidden),dtype=theanoFloat)
            clasificador.agregarCapa(unidadesEntrada=self.capas[-1].n_visible,
                                     unidadesSalida=self.capas[-1].n_hidden,
                                     clasificacion=True,
                                     activacion=activaciones[-1],
                                     pesos=None,
                                     biases=None)

        T = temporizador()
        inicio = T.tic()

        costoTRN, costoVAL, costoTST, costoTST_final = 0.0, 0.0, 0.0, 0.0
        costoTRN, costoVAL, costoTST, costoTST_final = clasificador.entrenar(
            trainSet=datos[0],
            validSet=datos[1],
            testSet=datos[2],
            batch_size=tambatch)

        final = T.toc()
        print("Tiempo total para el ajuste de DBN: {}".format(
            T.transcurrido(inicio, final)))

        # se guardan los estadisticos
        self._guardar(diccionario={
            'costoTRN': costoTRN,
            'costoVAL': costoVAL,
            'costoTST': costoTST
        })

        # dibujar estadisticos
        clasificador.dibujarEstadisticos(mostrar=False,
                                         guardar=clasificador.ruta +
                                         'estadisticosMLP')
        clasificador.score(datos=datos[2],
                           guardar='Matriz de Confusion',
                           mostrar=False)

        return costoTRN, costoVAL, costoTST, costoTST_final, final - inicio
コード例 #7
0
    def entrenar(self,
                 dataTrn,
                 dataVal=None,
                 pcd=True,
                 guardarPesosIniciales=False,
                 filtros=True):
        """
        :type dataTrn: narray
        :param dataTrn: datos de entrenamiento

        :type dataVal: narray
        :param dataTrn: datos de validacion

        :type guardarPesosIniciales: boolean
        :param guardarPesosIniciales: si se requiere almacenar los pesos iniciales antes de aplicar la rbm
        """
        assert self.n_layers > 0, "No hay nada que computar"
        self.x = dataTrn

        T = temporizador()
        inicio = T.tic()
        cantidadCapas = self.n_layers if DBN.DBN_custom else self.n_layers - 1
        print("Entrenando con metodo \'custom\'") if DBN.DBN_custom else None
        for i in range(cantidadCapas):
            # deben diferenciarse si estamos en presencia de la primer capa o de una intermedia
            if i == 0:
                layer_input = self.x
                del dataTrn
            else:
                layer_input = self._cargar(clave='activacionesOcultas')[
                    -1]  # al entrada es la anterior, la que ya se entreno

            # una carpeta para alojar los datos de la capa intermedia
            directorioRbm = self.ruta + 'rbm_capa{}/'.format(i + 1)
            os.makedirs(
                directorioRbm) if not os.path.exists(directorioRbm) else None

            # creo la red
            if self.capas[i].tipo == "binaria":
                capaRBM = BRBM(n_visible=self.capas[i].n_visible,
                               n_hidden=self.capas[i].n_hidden,
                               w=self.capas[i].w,
                               ruta=directorioRbm)
                BRBM.DEBUG = DBN.DEBUG
            elif self.capas[i].tipo == 'gaussiana':
                capaRBM = GRBM(n_visible=self.capas[i].n_visible,
                               n_hidden=self.capas[i].n_hidden,
                               w=self.capas[i].w,
                               ruta=directorioRbm)
                GRBM.DEBUG = DBN.DEBUG
            else:
                raise NotImplementedError('RBM no implementada')
            # configuro la capa, la rbm
            # si un parametro es None lo paso como una lista vacia...
            capaRBM.setParametros({
                k: v if v is not None else []
                for k, v in self.capas[i].getParametrosEntrenamiento.items()
            })

            # se entrena capa por capa
            print("Entrenando la capa:", i + 1)
            self._guardar(diccionario={'pesos_iniciales': capaRBM.getW
                                       }) if guardarPesosIniciales else None

            capaRBM.entrenamiento(data=layer_input,
                                  tamMiniBatch=self.capas[i].tamMiniBatch,
                                  pcd=pcd,
                                  gibbsSteps=self.capas[i].pasosGibbs,
                                  filtros=filtros)

            # en caso de debug guardo la capa entera
            if DBN.DEBUG:
                print("Guardando la capa..")
                filename = self.name + "_capa" + str(i + 1)
                capaRBM.guardarObjeto(nombreArchivo=filename)

            # ahora debo tener las entras que son las salidas del modelo anterior (activaciones de las ocultas)
            # [probabilidad_H1, muestra_V1, muestra_H1]
            if DBN.ACT_OCULTAS:
                print(
                    "Activaciones Ocultas \"Muestreo\"") if DBN.DEBUG else None
                [_, _, hiddenAct] = capaRBM.muestra(muestraV=layer_input)
            else:
                print("Activaciones Ocultas \"Probabilidad\""
                      ) if DBN.DEBUG else None
                [hiddenAct, _, _] = capaRBM.muestra(muestraV=layer_input)

            # por ahora no lo utilizo
            if dataVal is not None:
                [_, _, dataVal] = capaRBM.muestra(muestraV=dataVal)

            # se guardan las activaciones ocultas para la siguiente iteracion
            # de la siguiente capa oculta
            print("Guardando las muestras para la siguiente capa.."
                  ) if DBN.DEBUG else None
            self._guardar(diccionario={'activacionesOcultas': hiddenAct})
            del hiddenAct

            # se guardan los pesos para el ajuste fino y los bias
            self._guardar(diccionario={'pesos': capaRBM.getW})
            self._guardar(diccionario={'bias': capaRBM.getOculto})

            del capaRBM
        # FIN FOR

        final = T.toc()
        print("Tiempo total para pre-entrenamiento DBN: {}".format(
            T.transcurrido(inicio, final)))
        return final - inicio