Ejemplo n.º 1
0
    def define(self, connectiontype, inputs, hiddenlayers, neurons, outputs):
        """
        Определяем нейронную сеть в автоматическом режиме.

        :param connectiontype:  вариант соединения нейронов между слоями
                fullconnect  -   между каждыми соседними слоями все нейроны соеденены каждый с каждым

        :param inputs:          кол-во нейронов во входном слое
        :param hiddenlayers:    кол-во промежуточных слоев
        :param neurons:         кол-во нейронов в каждом из промежуточных слоев
        :param outputs:         кол-во нейронов в выходном слое

        :return:
        """

        if connectiontype == 'fullconnect':

            # ------------------------------------------ Создаем входной слой
            input_layer = Layer(name='Input layer')

            self.add_inp_layer(layer=input_layer)

            bias = Neuron(name='Bias', bias_flag=True, globalname='INB')
            input_layer.add_neuron(bias)

            input_neuron = [None] * inputs

            for n in xrange(inputs):
                input_neuron[n] = Neuron(name=str(n), globalname='input_' + str(n))
                input_layer.add_neuron(input_neuron[n])

            # ------------------------------------------ Промежуточные слои
            hidden_layer = [None] * hiddenlayers

            for i in xrange(hiddenlayers):
                hidden_layer[i] = Layer(name='Hidden layer ' + str(i))

                self.add_layer(layer=hidden_layer[i], layer_position=i)

                for n in xrange(neurons):

                    hidden_neuron = [None] * neurons

                    hidden_neuron[n] = Neuron(name=str(n), globalname='hidden_' + str(i) + str(n))
                    hidden_layer[i].add_neuron(hidden_neuron[n])

            # ------------------------------------------ Создаем выходной слой
            output_layer = Layer(name='Output layer')

            # ------------------------------------------ Добавляем нейроны в выходной слой
            self.add_out_layer(layer=output_layer)

            output_neuron = [None] * outputs

            for n in xrange(outputs):
                output_neuron[n] = Neuron(name=str(n), globalname='output_' + str(n))
                output_layer.add_neuron(output_neuron[n])

            # ------------------------------------------- Соединяем ранее созданные нейроны между собой

            # Каждый нейрон первого скрытого слоя соединяем с нейронами входного слоя
            i = Utils.get_first(self.inp_layers)    # Обращаемся к первому из входных слоев
            h = Utils.get_by_pos(self.layers, 0)    # Обращаемся к первому из скрытых слоев

            for hid_n in h.neurons:                             # Идем по каждому нейрону первого промежуточного слоя

                for inp_n in i.neurons:                         # Идем по каждому нейрону входного слоя
                    hid_n.set_inp_link(inp_n)                   # Соединяем вход нейрона из скрытого слоя с нейроном из
                                                                # входного слоя

            # Проходим по остальным скрытым слоям
            if hiddenlayers > 1:

                prev_layer = h                                  # Запонминаем первый промежуточный слой как предыдущий

                for i in xrange(1, hiddenlayers):               # Перемещаемся по каждому следующему промежуточному слою

                    cur_layer = Utils.get_by_pos(self.layers, i)        # Запоминаем слой

                    for n in cur_layer.neurons:

                        for p in prev_layer.neurons:

                            n.set_inp_link(p)

                    prev_layer = cur_layer

                cur_layer = Utils.get_first(self.out_layers)    # Берем выходной слой

                for n in cur_layer.neurons:

                    for p in prev_layer.neurons:
                        n.set_inp_link(p)


                print 'Нейроны соеденены'