2014-07-26 78 views
1

我试图做一个神经网络,我有几个问题:神经网络双曲线函数

我的双曲线函数是像一些

s = 1/(1+(2.7183**(-self.values))) 
if s > self.weight: 
     self.value = 1 
    else: 
     self.value = 0 

的self.values是的一个阵列连接的节点,例如HL(隐藏层)1中的HN(隐藏节点)连接到所有输入节点,所以它是self.values是sum(inputnodes.values)。

在HL2HNS连接到在所有HL1 HNS,它的self.values是总和(HL.values)

的问题是,每个节点是越来越1的值,没有马瑟它们的权重(除非它是太高了,像0.90〜0.99)

我的神经网络的设置,像这样:

(输入,num_hidden_​​layers,num_hidden_​​nodes_per_layer,num_output_nodes) 输入的二进制值的列表:

下面是显示此行为的日志。

>>NeuralNetwork([1,0,1,1,1,0,0],3,3,1)# 3 layers, 3 nodes each, 1 output 
Layer1 
Node: y1 Sum: 4, Sigmoid: 0.98, Weight: 0.10, self.value: 1 
Node: y2 Sum: 4, Sigmoid: 0.98, Weight: 0.59, self.value: 1 
Node: y3 Sum: 4, Sigmoid: 0.98, Weight: 0.74, self.value: 1 
Layer2 
Node: y1 Sum: 3, Sigmoid: 0.95, Weight: 0.30, self.value: 1 
Node: y2 Sum: 3, Sigmoid: 0.95, Weight: 0.37, self.value: 1 
Node: y3 Sum: 3, Sigmoid: 0.95, Weight: 0.80, self.value: 1 
Layer3 
Node: y1 Sum: 3, Sigmoid: 0.95, Weight: 0.70, self.value: 1 
Node: y2 Sum: 3, Sigmoid: 0.95, Weight: 0.56, self.value: 1 
Node: y3 Sum: 3, Sigmoid: 0.95, Weight: 0.28, self.value: 1 

即使我尝试输入使用浮动点原来是一样的:在三层

>>NeuralNetwork([0.64, 0.57, 0.59, 0.87, 0.56],3,3,1) 
Layer1 
Node: y1 Sum: 3.23, Sigmoid: 0.96, Weight: 0.77, self.value: 1 
Node: y2 Sum: 3.23, Sigmoid: 0.96, Weight: 0.45, self.value: 1 
Node: y3 Sum: 3.23, Sigmoid: 0.96, Weight: 0.83, self.value: 1 
Layer2 
Node: y1 Sum: 3, Sigmoid: 0.95, Weight: 0.26, self.value: 1 
Node: y2 Sum: 3, Sigmoid: 0.95, Weight: 0.39, self.value: 1 
Node: y3 Sum: 3, Sigmoid: 0.95, Weight: 0.53, self.value: 1 
Layer3 
Node: y1 Sum: 3, Sigmoid: 0.95, Weight: 0.43, self.value: 1 
Node: y2 Sum: 3, Sigmoid: 0.95, Weight: 0.52, self.value: 1 
Node: y3 Sum: 3, Sigmoid: 0.95, Weight: 0.96, self.value: 0 

注德节点Y3,即乙状结肠后返回一个0,唯一的一个

我做错了什么?

此外,是否真的有必要将每个节点与上一层中的每个其他节点连接起来?让它变得随机是不是更好?

编辑: 忘了提及,这是一个正在开发的NN,我将使用遗传算法来训练网络。

EDIT2:

class NeuralNetwork: 
    def __init__(self, inputs, num_hidden_layers, num_hidden_nodes_per_layer, num_output): 
     self.input_nodes = inputs 
     self.num_inputs = len(inputs) 
     self.num_hidden_layers = num_hidden_layers 
     self.num_hidden_nodes_per_layer = num_hidden_nodes_per_layer 
     self.num_output = num_output 

     self.createNodes() 
     self.weights = self.getWeights() 
     self.connectNodes() 
     self.updateNodes() 

    def createNodes(self): 
     self._input_nodes = [] 
     for i, v in enumerate(self.input_nodes): 
      node = InputNode("x"+str(i+1),v) 
      self._input_nodes.append(node) 

     self._hidden_layers = [] 
     for n in xrange(self.num_hidden_layers): 
      layer = HiddenLayer("Layer"+str(n+1),self.num_hidden_nodes_per_layer) 
      self._hidden_layers.append(layer) 

    def getWeights(self): 
     weights = [] 
     for node in self._input_nodes: 
      weights.append(node.weight) 

     for layer in self._hidden_layers: 
      for node in layer.hidden_nodes: 
       weights.append(node.weight) 
     return weights 

    def connectNodes(self): 
     for i,layer in enumerate(self._hidden_layers): 
      for hidden_node in layer.hidden_nodes: 
       if i == 0: 
        for input_node in self._input_nodes: 
         hidden_node.connections.append(input_node) 
       else: 
        for previous_node in self._hidden_layers[i-1].hidden_nodes: 
          hidden_node.connections.append(previous_node) 

    def updateNodes(self): 
     for layer in self._hidden_layers: 
      for node in layer.hidden_nodes: 
       node.updateValue() 

而这里的节点updateValue()方法:

def updateValue(self): 
    value = 0 
    for node in self.connections: 
     value += node.value 
    self.sigmoid(value) # the function at the beginning of the question. 

刚刚创建的节点有值,名称和重量(随机开始)。

+1

请发布您的'NeuralNetwork'的实现。 – Pradhan

+0

看起来你并没有对每个节点的单独输入进行加权。此外,您通常不会对隐藏图层输出进行阈值处理(我知道这一点),但我不确定在使用GA进行训练时它将如何改变内容。 – AMacK

+0

哦,该死的......我一直在这里抨击我几个小时,因为我忘记了这个小细节。 –

回答

3

您正在混合使用几个不同的NN概念。

逻辑函数(它是sigmoid的一般形式)已经用作阈值。具体来说,这是一个可微差门限,对于反向传播学习算法是必不可少的。所以你不需要分段阈值函数(如果语句)。

权重是突触强度的类似物,并在求和(或前馈传播)期间应用。因此,一对节点之间的每个连接都具有乘以发送节点的激活级别(阈值函数的输出)的权重。

最后,即使有了这些变化,具有所有正权重的全连接神经网络仍然可能产生全部为1的输出。您可以包含与抑制节点相对应的负权重,或显着减少连通性(例如,第n层中的节点连接到第n + 1层中的节点的概率为0.1)。

+0

这就是当你没有任何计算机科学背景,并试图用一堆不同的方法自学。谢谢,我会尽力解决这些问题。我还有一个简单的问题,3个输入有多少权重,5个隐藏节点和1个输出有3个层次?我做的每种方法都是19(输入,隐藏和输出)。但我想这可能也是错误的。 –

+0

具有3个输入,3个5个节点和1个输出的完全连接的网络总共有15 + 25 + 25 + 5 = 70个权重,并且这些应该在训练之前从-1到1随机变化。 – Tim