神经网络sigmoid函数

时间:2014-07-26 04:18:32

标签: python neural-network

我试图建立一个神经网络,我有几个问题:

我的sigmoid功能就像一些

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

self.values是连接节点的数组,例如HL(隐藏层)1 中的 HN(隐藏节点)连接到所有输入节点,因此它是' s self.values是sum(inputnodes.values)。

HL2中的 HN 连接到HL1中的所有HN,它的self.values是sum(HL.values)

问题是,每个节点的值都是1,没有重量(除非它太高,如0.90~0.99)

我的神经网络设置如下:

(inputs,num_hidden_​​layers,num_hidden_​​nodes_per_layer,num_output_nodes) inputs是二进制值列表:

这是显示此行为的日志。

>>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

注意第3层中的节点y3,唯一一个在sigmoid之后返回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 个答案:

答案 0 :(得分:3)

您正在将几个不同的NN概念混合在一起。

逻辑函数(它是sigmoid的广义形式)已经作为阈值。具体而言,它是可区分的阈值,对于反向传播学习算法是必不可少的。所以你不需要那个分段阈值函数(if语句)。

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

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