我试图做一个神经网络,我有几个问题:神经网络双曲线函数
我的双曲线函数是像一些
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)。
在HL2的HNS连接到在所有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.
刚刚创建的节点有值,名称和重量(随机开始)。
请发布您的'NeuralNetwork'的实现。 – Pradhan
看起来你并没有对每个节点的单独输入进行加权。此外,您通常不会对隐藏图层输出进行阈值处理(我知道这一点),但我不确定在使用GA进行训练时它将如何改变内容。 – AMacK
哦,该死的......我一直在这里抨击我几个小时,因为我忘记了这个小细节。 –