Python反向传播-如何初始化启动激活?

Python反向传播-如何初始化启动激活?,python,networking,neural-network,backpropagation,Python,Networking,Neural Network,Backpropagation,我在实现这个backprop网络时遇到了一些问题。我真的不知道如何开始,因为在这个网络中,我的第一层只有8个节点。但我的提示在训练集中给了我10分 例如,在第一组中,我有 [0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0] 但只有8个节点,所以我可以为每个节点分配一个启动激活,否则我将剩下2个 ####################################################################################

我在实现这个backprop网络时遇到了一些问题。我真的不知道如何开始,因为在这个网络中,我的第一层只有8个节点。但我的提示在训练集中给了我10分

例如,在第一组中,我有

[0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0] 
但只有8个节点,所以我可以为每个节点分配一个启动激活,否则我将剩下2个

#######################################################################################
# 
#                               Preparations 
# 
#######################################################################################

import random
import math
import pygame
import sys
network1 = []
network2 = []
layer1 = []
layer2 = []
layer3 = []
set1 = []
set2 = []
set3 = []
mu = .5
eta = .1

#######################################################################################
# 
#                                   Node Class
# 
#######################################################################################

class Node(object): 

    def __init__(self,name=None): 
        self.name = name
        self.error = None
        self.activation_threshold = 0.0
        self.net_input = 0.0
        self.net_output = 0.0
        self.outgoing_connections = [] 
        self.incoming_connections = []
        self.activation = None

    def __str__(self):
        return self.name

    def addin(self,sender,weight=random.random):
        self.incoming_connections.append(Connection(sender,self,weight=random.random))
    def addout(self,sender,weight=random.random):
        self.outgoing_connections.append(Connection(sender,self,weight=random.random)) 

    def update_input(self): 
        self.net_input=0.0
        for conn in self.incoming_connections:
            self.net_input += conn.weight * conn.sender.activation

    def update_output(self): 
        self.net_output=0.0
        for conn in self.outgoing_connections: 
            self.net_output += conn.weight * self.activation

    def update_activation(self):
        self.activation = 1 / (1 + math.exp(-self.net_input))

    def update_weight(self):
        for i in self.incoming_connections:
            i.weight = (2*i.reciever.activation - 1)*(2*i.sender.activation-1)
        for i in self.outgoing_connections:
            i.weight = (2*i.reciever.activation - 1)*(2*i.sender.activation-1)

    def update_error(self):
        pass

#######################################################################################
# 
#                                   Connection Class
# 
#######################################################################################

class Connection(object): 
    def __init__(self, sender, reciever, weight=random.random): 
        self.weight=weight 
        self.sender=sender 
        self.reciever=reciever

    def __str__(self):
        string = "Connection from " + str(self.sender) + " to " + str(self.reciever) + ", weight = " + str(self.weight)
        return string

#######################################################################################
# 
#                                     Creating Nodes & Connections 
# 
#######################################################################################

for i in xrange(8): 
    layer1.append(Node(str(i)))
network1.append(layer1)
for i in xrange(3):
    layer2.append(Node(str(i)))
network1.append(layer2)
for i in xrange(8): 
    layer3.append(Node(str(i)))
network1.append(layer3)

for i in xrange(8):
    for j in xrange(3):
        layer1[i].addin(layer2[j])
for i in xrange(3):
    for j in xrange(8):
        layer2[i].addin(layer3[j])

#######################################################################################
#
#                                         Training Patterns
#
#######################################################################################

"""Non-Overlapping Categories"""
cata11=[0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0]
set1.append(cata11)
cata12=[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0]
set1.append(cata12)
catb11=[0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0]
set1.append(catb11)
catb12=[0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0]
set1.append(catb12)
catc11=[0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0]
set1.append(catc11)
catc12=[0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]
set1.append(catc12)
catd11=[0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0]
set1.append(catd11)
catd12=[1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0]
set1.append(catd12)

"""Linearly Independent Instances and Linearly Separable Categories"""
cata21=[1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0]
set2.append(cata21)
cata22=[1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0]
set2.append(cata22)
catb21=[1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0]
set2.append(catb21)
catb22=[1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0]
set2.append(catb22)
catc21=[1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0]
set2.append(catc21)
catc22=[1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0]
set2.append(catc22)
catd21=[1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0]
set2.append(catd21)
catd22=[1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0]
set2.append(catd22)

"""Not Linearly Separable Categories"""
cata31=[1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0]
set3.append(cata31)
cata32=[0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0]
set3.append(cata32)
catb31=[1.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0]
set3.append(catb31)
catb32=[0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0]
set3.append(catb32)

##set_activations(cata11)
for i in network1:
    i.update_weight()
##for thing in node1:
##    thing.update_weight()
##set_activations(cata12)
##for thing in node1:
##    thing.update_weight()
##set_activations(catb11)
##for thing in node1:
##    thing.update_weight()
##set_activations(catb12)
##for thing in node1:
##    thing.update_weight()
##set_activations(catc11)
##for thing in node1:
##    thing.update_weight()
##set_activations(catc12)
##for thing in node1:
##    thing.update_weight()
##set_activations(catd11)
##for thing in node1:
##    thing.update_weight()
##set_activations(catd12)
##for thing in node1:
##    thing.update_weight()

#######################################################################################
#
#                                        Updating Network
#
#######################################################################################

for i in layer1:
    i.update_input()
    print 'Node', str(i), 'Input : ', i.net_input
for i in layer1:
    i.update_activation()
    print 'Act:', i.activation
for i in layer1:
    i.update_output()
    print 'Output', i.net_output
for i in layer2:
    i.update_input()
    print 'Node', str(i), 'Input : ', i.net_input
for i in layer2:
    i.update_activation()
    print 'Act:', i.activation
神经网络结构 我相信你误解了神经网络结构是如何建立的。你所有的输入值都应该发送到下一层的所有神经元。因此,你的10个输入信号都应该发送到所有8个神经元。请看附图。我只包括了一些神经元的连接,以使绘图更容易理解

图形表示法