예제 #1
0
    def visualize(self):
        self.ubi = Ubigraph(self.C)
        # Color the input and output neurons
        self.ubi.set_properties({
            "color": "#1E90FF"
        }, self.input_neurons)

        self.ubi.set_properties({
            "color": "#FFD700"
        }, self.output_neurons)
예제 #2
0
class Brain(object):
    """
    The brain class for openbrain.
    """

    def __init__(self, num_input, num_hidden, num_output, density=0.5):
        """
        Constructs an open brain object.
        :param num_input: The number of inputs
        :param num_output: The number of outputs
        :param num_hidden: The number of hidden neurons.
        """
        self.initialize_graph(num_input,num_hidden, num_output,  density=0.5)
        self.visualize()


    def initialize_graph(self, num_input, num_hidden,  num_output,density):
        """
        Initializes the open brain graph.
        :param num_input:
        :param num_hidden:
        :param num_output:
        :param density:
        :return:
        """
        self.num_neurons = num_input + num_output + num_hidden
        self.C = np.zeros((self.num_neurons, self.num_neurons))

        adjacency_list = self.define_toplogy(num_input, num_hidden,  num_output, density)

        for i, adjacent in enumerate(adjacency_list):
            for node in adjacent:
                self.C[i, node] = np.random.rand(1)*0.9

        self.C = gpu.garray(self.C)

    def define_toplogy(self, num_input, num_hidden,  num_output, density):
        """
        Defines the topology of the OpenBrain network.
        :param num_input:
        :param num_hidden:
        :param num_output:
        :param density:
        :return:
        """
        topo = networkx.DiGraph(networkx.watts_strogatz_graph(self.num_neurons, 5, density, seed=None)).to_directed()
        adjacency_list = topo.adjacency_list()


        # Pick the output neurons to be those with highest in degree
        in_deg = np.array([topo.in_degree(x) for x,_ in enumerate(adjacency_list)])
        self.output_neurons = np.argpartition(in_deg, -num_output)[-num_output:]
        print(self.output_neurons)
        print([topo.in_degree(x) for x in self.output_neurons])

        # Pick the input neurons to be those with highest out degree
        out_deg = np.array([topo.out_degree(x) if x not in self.output_neurons else -1
                            for x,_ in enumerate(adjacency_list)])
        self.input_neurons = np.argpartition(out_deg, -num_input)[-num_input:]

        # Output neurons do not fire out.
        for adjacent_neurons in adjacency_list:
            for out_neuron in self.output_neurons:
                if out_neuron in adjacent_neurons:
                    adjacent_neurons.remove(out_neuron)

        # Disconnect input -> output
        for out in self.output_neurons:
            for inp in self.input_neurons:
                if out in adjacency_list[inp]: adjacency_list[inp].remove(out)
                if inp in adjacency_list[out]: adjacency_list[out].remove(inp)


        for i, adjacent in enumerate(adjacency_list):
            if i not in self.input_neurons and i not in self.output_neurons:
                for n in adjacent:
                    if i in adjacency_list[n]:
                        if np.random.rand(1)>0.5:
                            adjacent.remove(n)
                        else:
                            adjacency_list[n].remove(i)

        # Let nothing enter the input neurons
        for inp in self.input_neurons:
            adjacency_list[inp] = []

        return adjacency_list


    def visualize(self):
        self.ubi = Ubigraph(self.C)
        # Color the input and output neurons
        self.ubi.set_properties({
            "color": "#1E90FF"
        }, self.input_neurons)

        self.ubi.set_properties({
            "color": "#FFD700"
        }, self.output_neurons)