示例#1
0
    def transform(self, dataset):
        """
        Aplica estandarización sobre **dataset**.

        :param dataset: pyspark.rdd.RDD o numpy.ndarray o :class:`.LabeledDataSet`

        """
        labels = None  # Por si el dataset viene con labels
        type_dataset = type(dataset)
        if isinstance(dataset, LabeledDataSet):
            labels = dataset.labels
            dataset = dataset.features
        if self.model is not None:  # Se debe usar modelo de pyspark
            if not isinstance(dataset, pyspark.rdd.RDD):
                dataset = sc.parallelize(dataset)
            dataset = self.model.transform(dataset)
        else:
            if type(dataset) is not np.ndarray:
                dataset = np.array(dataset)
            if self.flag_mean is True:
                dataset -= self.mean  # Remove mean
            if self.flag_std is True:
                dataset /= self.std  # Scale unit variance
        if labels is not None:
            if type_dataset is DistributedLabeledDataSet:
                dataset = DistributedLabeledDataSet(labels.zip(dataset))
            else:
                dataset = LocalLabeledDataSet(zip(labels, dataset))
        return dataset
示例#2
0
    def transform(self, dataset):
        """
        Aplica estandarización sobre **dataset**.

        :param dataset: pyspark.rdd.RDD o numpy.ndarray o :class:`.LabeledDataSet`

        """
        labels = None  # Por si el dataset viene con labels
        type_dataset = type(dataset)
        if isinstance(dataset, LabeledDataSet):
            labels = dataset.labels
            dataset = dataset.features
        if self.model is not None:  # Se debe usar modelo de pyspark
            if not isinstance(dataset, pyspark.rdd.RDD):
                dataset = sc.parallelize(dataset)
            dataset = self.model.transform(dataset)
        else:
            if type(dataset) is not np.ndarray:
                dataset = np.array(dataset)
            if self.flag_mean is True:
                dataset -= self.mean  # Remove mean
            if self.flag_std is True:
                dataset /= self.std  # Scale unit variance
        if labels is not None:
            if type_dataset is DistributedLabeledDataSet:
                dataset = DistributedLabeledDataSet(labels.zip(dataset))
            else:
                dataset = LocalLabeledDataSet(zip(labels, dataset))
        return dataset
示例#3
0
    def __init__(self, data=None):
        self.with_lp = False  # Flag que indica si se almaceno entradas en forma de LabeledPoints
        if data is not None:
            if not isinstance(data, pyspark.rdd.RDD):
                data = sc.parallelize(data)
            if type(data.take(2)[0]) is LabeledPoint:
                self.with_lp = True
        self.data = data
        if self.with_lp is False and self.data is not None:  # Por ahora que quede etiquetado con LabeledPoints
            self._labeled_point()

        if self.data is not None:
            self.rows = self.data.count()
            self.cols = len(self.features.take(1)[0].toArray())
示例#4
0
    def __init__(self, data=None):
        self.with_lp = False  # Flag que indica si se almaceno entradas en forma de LabeledPoints
        if data is not None:
            if not isinstance(data, pyspark.rdd.RDD):
                data = sc.parallelize(data)
            if type(data.take(2)[0]) is LabeledPoint:
                self.with_lp = True
        self.data = data
        if self.with_lp is False and self.data is not None:  # Por ahora que quede etiquetado con LabeledPoints
            self._labeled_point()

        if self.data is not None:
            self.rows = self.data.count()
            self.cols = len(self.features.take(1)[0].toArray())
示例#5
0
 def test_activation(self):
     logger.info("Testeando la integración de funciones de activación...")
     activation = 'Tanh'
     fun = fun_activation[activation]
     res = self.matrix_neurons.activation(fun)
     fun_d = fun_activation_d[activation]
     res_d = self.matrix_neurons.activation(fun_d)
     assert np.array_equiv(res.matrix, fun(np.ones(self.matrix_neurons.shape)))
     assert np.array_equiv(res_d.matrix, fun_d(np.ones(self.matrix_neurons.shape)))
     # Test de softmax como funcion de activacion
     N = self.matrix_neurons.rows
     shape = (N,)
     x = LocalNeurons(sc.parallelize(range(N)), shape)  # Aprovecho para testear con RDD
     res = x.softmax()
     res = map(lambda e: e[0], res.matrix)
     exp_x = np.exp(range(N))
     y = exp_x / float(sum(exp_x))
     assert np.allclose(res, y)
     logger.info("OK")
示例#6
0
    def test_file_distributed():
        logger.info("Testeo de manejo de archivos de texto con DistributedLabeledDataSet...")
        filename = TEMP_PATH + "spark_data.txt"
        if os.path.exists(filename):
            shutil.rmtree(filename)

        rdd_data = sc.parallelize(zip(range(10), range(10, 20)))  # dummy data
        rdd_data = rdd_data.map(lambda (l, f): (l, [f]))
        distributed_data = DistributedLabeledDataSet(rdd_data)
        distributed_data.save_file(filename)  # Saving
        dataset = DistributedLabeledDataSet()
        dataset.load_file(filename, pos_label=0)  # Loading

        # LabeledPoints to tuple(l,f)
        distributed_data._labeled_point()
        dataset._labeled_point()

        res1 = sorted(distributed_data.collect(unpersist=True), key=lambda (l, f): l)
        res2 = sorted(dataset.collect(unpersist=True), key=lambda (l, f): l)
        assert res1 == res2
示例#7
0
 def test_activation(self):
     logger.info("Testeando la integración de funciones de activación...")
     activation = 'Tanh'
     fun = fun_activation[activation]
     res = self.matrix_neurons.activation(fun)
     fun_d = fun_activation_d[activation]
     res_d = self.matrix_neurons.activation(fun_d)
     assert np.array_equiv(res.matrix,
                           fun(np.ones(self.matrix_neurons.shape)))
     assert np.array_equiv(res_d.matrix,
                           fun_d(np.ones(self.matrix_neurons.shape)))
     # Test de softmax como funcion de activacion
     N = self.matrix_neurons.rows
     shape = (N, )
     x = LocalNeurons(sc.parallelize(range(N)),
                      shape)  # Aprovecho para testear con RDD
     res = x.softmax()
     res = map(lambda e: e[0], res.matrix)
     exp_x = np.exp(range(N))
     y = exp_x / float(sum(exp_x))
     assert np.allclose(res, y)
     logger.info("OK")
示例#8
0
    def _train(self, train_bc, mini_batch=50, parallelism=0, measure=None, optimizer_params=None,
               reproducible=False, evaluate=True, seeds=None):
        """
        Entrenamiento de la red neuronal sobre el conjunto *train_bc*.

        :param train_bc: *pyspark.Broadcast*, variable Broadcast de Spark correspondiente al conjunto de entrenamiento.
        :param mini_batch: int, cantidad de ejemplos a utilizar durante una época de la optimización.
        :param parallelism: int, cantidad de modelos a optimizar concurrentemente.
            Si es 0, es determinado por el nivel de paralelismo por defecto en Spark (variable *sc.defaultParallelism*),
            Si es -1, se setea como :math:`\\frac{N}{m}` donde *N* es la cantidad
            total de ejemplos de entrenamiento y *m* la cantidad de ejemplos para el mini-batch.
        :param optimizer_params: :class:`.OptimizerParameters`
        :param measure: string, key de alguna medida implementada en alguna de las métricas
         diponibles en :mod:`~learninspy.utils.evaluation`.
        :param reproducible: bool, si es True se indica que se debe poder reproducir exactamente el ajuste.
        :param evaluate: bool, si es True se evalua el modelo sobre el conjunto de entrenamiento.
        :return: float, resultado de evaluar el modelo final, o None si *evaluate* es False.
        """
        if parallelism == 0:
            parallelism = sc.defaultParallelism
        elif parallelism == -1:
            # Se debe entrenar un modelo por cada batch (aunque se pueden solapar)
            total = len(train_bc.value)
            parallelism = total / mini_batch

        # Funcion para minimizar funcion de costo sobre cada modelo del RDD
        minimizer = opt.optimize
        # TODO ver si usar sc.accumulator para acumular actualizaciones y despues aplicarlas (paper de mosharaf)

        if reproducible is True:
            self._set_initial_rndstate()  # Seteo estado inicial del RandomState (al generarse la instancia NeuralNetwork)

        if seeds is None:
            seeds = list(self.params.rng.randint(500, size=parallelism))

        # Paralelizo modelo actual en los nodos mediante parallelism (que define el n° de particiones o slices del RDD)
        # NOTA: se persiste en memoria serializando ya que se supone que son objetos grandes y no conviene cachearlos
        models_rdd = (sc.parallelize(zip([self] * parallelism, seeds), numSlices=parallelism)
                        .persist(StorageLevel.MEMORY_ONLY_SER)  # TODO: si o si este StorageLevel?
                      )
        # Minimizo el costo de las redes en paralelo
        # NOTA: persist() es importante porque se traza varias veces el grafo de acciones sobre el RDD results
        logger.debug("Training %i models in parallel.", parallelism)
        results = (models_rdd.map(lambda (model, seed):
                                  minimizer(model, train_bc.value, optimizer_params, mini_batch, seed))
                             .persist(StorageLevel.MEMORY_ONLY_SER)  # TODO: si o si este StorageLevel?
                   )
        # Junto modelos entrenados en paralelo, en base a un criterio de ponderacion sobre un valor objetivo
        logger.debug("Merging models ...")
        list_layers = opt.merge_models(results, optimizer_params.merge['criter'], optimizer_params.merge['goal'])
        # Copio el resultado de las capas mezcladas en el modelo actual
        self.list_layers = copy.copy(list_layers)
        # Quito de memoria
        logger.debug("Unpersisting replicated models ...")
        results.unpersist()
        models_rdd.unpersist()
        if evaluate is True:
            # Evaluo tasa de aciertos de entrenamiento
            hits = self.evaluate(train_bc.value, predictions=False, measure=measure)
        else:
            hits = None
        return hits
示例#9
0
    def _train(self, train_bc, mini_batch=50, parallelism=0, measure=None, optimizer_params=None,
               reproducible=False, evaluate=True, seeds=None):
        """
        Entrenamiento de la red neuronal sobre el conjunto *train_bc*.

        :param train_bc: *pyspark.Broadcast*, variable Broadcast de Spark correspondiente al conjunto de entrenamiento.
        :param mini_batch: int, cantidad de ejemplos a utilizar durante una época de la optimización.
        :param parallelism: int, cantidad de modelos a optimizar concurrentemente.
            Si es 0, es determinado por el nivel de paralelismo por defecto en Spark (variable *sc.defaultParallelism*),
            Si es -1, se setea como :math:`\\frac{N}{m}` donde *N* es la cantidad
            total de ejemplos de entrenamiento y *m* la cantidad de ejemplos para el mini-batch.
        :param optimizer_params: :class:`.OptimizerParameters`
        :param measure: string, key de alguna medida implementada en alguna de las métricas
         diponibles en :mod:`~learninspy.utils.evaluation`.
        :param reproducible: bool, si es True se indica que se debe poder reproducir exactamente el ajuste.
        :param evaluate: bool, si es True se evalua el modelo sobre el conjunto de entrenamiento.
        :return: float, resultado de evaluar el modelo final, o None si *evaluate* es False.
        """
        if parallelism == 0:
            parallelism = sc.defaultParallelism
        elif parallelism == -1:
            # Se debe entrenar un modelo por cada batch (aunque se pueden solapar)
            total = len(train_bc.value)
            parallelism = total / mini_batch

        # Funcion para minimizar funcion de costo sobre cada modelo del RDD
        minimizer = opt.optimize
        # TODO ver si usar sc.accumulator para acumular actualizaciones y despues aplicarlas (paper de mosharaf)

        if reproducible is True:
            self._set_initial_rndstate()  # Seteo estado inicial del RandomState (al generarse la instancia NeuralNetwork)

        if seeds is None:
            seeds = list(self.params.rng.randint(500, size=parallelism))

        # Paralelizo modelo actual en los nodos mediante parallelism (que define el n° de particiones o slices del RDD)
        # NOTA: se persiste en memoria serializando ya que se supone que son objetos grandes y no conviene cachearlos
        models_rdd = (sc.parallelize(zip([self] * parallelism, seeds), numSlices=parallelism)
                        .persist(StorageLevel.MEMORY_ONLY_SER)  # TODO: si o si este StorageLevel?
                      )
        # Minimizo el costo de las redes en paralelo
        # NOTA: persist() es importante porque se traza varias veces el grafo de acciones sobre el RDD results
        logger.debug("Training %i models in parallel.", parallelism)
        results = (models_rdd.map(lambda (model, seed):
                                  minimizer(model, train_bc.value, optimizer_params, mini_batch, seed))
                             .persist(StorageLevel.MEMORY_ONLY_SER)  # TODO: si o si este StorageLevel?
                   )
        # Junto modelos entrenados en paralelo, en base a un criterio de ponderacion sobre un valor objetivo
        logger.debug("Merging models ...")
        list_layers = opt.merge_models(results, optimizer_params.merge['criter'], optimizer_params.merge['goal'])
        # Copio el resultado de las capas mezcladas en el modelo actual
        self.list_layers = copy.copy(list_layers)
        # Quito de memoria
        logger.debug("Unpersisting replicated models ...")
        results.unpersist()
        models_rdd.unpersist()
        if evaluate is True:
            # Evaluo tasa de aciertos de entrenamiento
            hits = self.evaluate(train_bc.value, predictions=False, measure=measure)
        else:
            hits = None
        return hits