多层神经网络

时间:2014-04-10 05:07:13

标签: python artificial-intelligence neural-network

下面是我试图用于多层神经网络的代码(取自互联网上的某个地方)。

import math
import random

BIAS = -1

"""
To view the structure of the Neural Network, type
print network_name
"""

class Neuron:
    def __init__(self, n_inputs ):
        self.n_inputs = n_inputs
        self.set_weights( [random.uniform(0,1) for x in range(0,n_inputs+1)] ) # +1 for bias weight

    def sum(self, inputs ):
        # Does not include the bias
        return sum(val*self.weights[i] for i,val in enumerate(inputs))

    def set_weights(self, weights ):
        self.weights = weights

    def __str__(self):
        return 'Weights: %s, Bias: %s' % ( str(self.weights[:-1]),str(self.weights[-1]) )

class NeuronLayer:
    def __init__(self, n_neurons, n_inputs):
        self.n_neurons = n_neurons
        self.neurons = [Neuron( n_inputs ) for _ in range(0,self.n_neurons)]

    def __str__(self):
        return 'Layer:\n\t'+'\n\t'.join([str(neuron) for neuron in self.neurons])+''

class NeuralNetwork:
    def __init__(self, n_inputs, n_outputs, n_neurons_to_hl, n_hidden_layers):
        self.n_inputs = n_inputs
        self.n_outputs = n_outputs
        self.n_hidden_layers = n_hidden_layers
        self.n_neurons_to_hl = n_neurons_to_hl

        # Do not touch
        self._create_network()
        self._n_weights = None
        # end

    def _create_network(self):
        if self.n_hidden_layers>0:
            # create the first layer
            self.layers = [NeuronLayer( self.n_neurons_to_hl,self.n_inputs )]

            # create hidden layers
            self.layers += [NeuronLayer( self.n_neurons_to_hl,self.n_neurons_to_hl ) for _ in range(0,self.n_hidden_layers)]

            # hidden-to-output layer
            self.layers += [NeuronLayer( self.n_outputs,self.n_neurons_to_hl )]
        else:
            # If we don't require hidden layers
            self.layers = [NeuronLayer( self.n_outputs,self.n_inputs )]

    def get_weights(self):
        weights = []

        for layer in self.layers:
            for neuron in layer.neurons:
                weights += neuron.weights

        return weights

    @property
    def n_weights(self):
        if not self._n_weights:
            self._n_weights = 0
            for layer in self.layers:
                for neuron in layer.neurons:
                    self._n_weights += neuron.n_inputs+1 # +1 for bias weight
        return self._n_weights

    def set_weights(self, weights ):
        assert len(weights)==self.n_weights, "Incorrect amount of weights."

        stop = 0
        for layer in self.layers:
            for neuron in layer.neurons:
                start, stop = stop, stop+(neuron.n_inputs+1)
                neuron.set_weights( weights[start:stop] )
        return self

    def update(self, inputs ):
        assert len(inputs)==self.n_inputs, "Incorrect amount of inputs."

        for layer in self.layers:
            outputs = []
            for neuron in layer.neurons:
                tot = neuron.sum(inputs) + neuron.weights[-1]*BIAS
                outputs.append( self.sigmoid(tot) )
            inputs = outputs   
        return outputs

    def sigmoid(self, activation,response=1 ):
        # the activation function
        try:
            return 1/(1+math.e**(-activation/response))
        except OverflowError:
            return float("inf")

    def __str__(self):
        return '\n'.join([str(i+1)+' '+str(layer) for i,layer in enumerate(self.layers)])

我的输入是一个包含多行的文本文件。每行包含一个维度为16的数据点(该行的前16个元素),第17个元素是该数据点所属的类。

INPUT.TXT

1,3,2,2,1,10,2,2,1,9,2,9,1,6,2,8,2
2,1,3,2,2,8,7,7,5,7,6,8,2,8,3,8,4
4,6,6,5,5,8,8,3,5,7,8,7,5,10,4,6,2
6,9,6,11,6,7,7,8,5,9,8,8,4,9,7,9,5
1,1,2,2,1,7,7,8,5,7,6,7,2,8,7,9,1
3,8,5,6,4,10,6,3,6,11,4,7,3,8,2,9,3
4,7,5,5,5,8,6,6,7,6,6,6,2,8,7,10,1
6,10,9,8,8,11,6,2,4,9,4,6,9,6,2,8,11

班级总是在[1,11]范围内 在学习输入之后,每个数据点的预期输出应该是其对应的类(它可能不总是正确的)。 我正在创建NeuralNetwork类的对象,然后尝试使用更新方法。 但是,我不清楚如何正确使用它。请指导我如何使用它进行上述输入。

1 个答案:

答案 0 :(得分:0)

这是我的开源代码

如何

您必须将新网络对象初始化为:network = NeuralNetwork(inputs, n_outputs, n_neurons_to_hl, n_hidden_layers)

inputs:          the number of input values                  (in your case: 16)
n_outputs:       the number of output values                 (in your case: 11)
n_neurons_to_hl: the number of neurons in each hidden layer
n_hidden_layers: the number of hidden layers

update( input_signals )方法是网络上的正向计算 - 即:这是您希望用于对输入实例进行分类的方法。