我用 Python 写了一个多层感知器。我试图让它做非线性分类。它有两个隐藏层,所以它应该是完全有能力的。不幸的是,它似乎只能线性分类。我不愿称其为“欠拟合”,因为我尚未正确实现非线性分类,甚至是欠拟合的非线性分类。在下图中,我尝试对正弦函数上方和下方的点进行分类,但它只是在数据集上画了一条直线。
不确定点(输出约为 0.5)为黄色。
我使用 sigmoid 作为激活函数,很简单1/(1+((math.e) ** (-sum)))。
我使用两个输入节点,两个隐藏层中的二十个隐藏节点(每个十个)和一个输出节点。我对每个隐藏层和输出节点都有一个偏差。我的输入没有标准化。
我前馈数百个随机点并计算输出和期望之间的差异。我计算均方误差并在每一代进化算法中保持最低均方误差。我不会在这里展示它,因为它似乎可以很好地降低错误,尽管我的 MSE 函数可能不正确。
d=0
error = 0
while d < (tPoints): # while all the points in the list have not been feedforwarded
output1 = feedForward(n, [xValsAbove[d], yValsAbove[d]]) # feedforwards a point above the function, returns output (0,1)
output2 = feedForward(n, [xValsBelow[d], yValsBelow[d]]) # feedforwards a point below the function, returns output (0,1)
if output1 < 0.99:
error += (output1)**2
if output2 > 0.01:
error += (1-output2)**2
d+=1
error = error/tPoints
return error # return mean-squared error
我的神经元做线性回归线就好了。因为我有一个有几层的 MLP,所以我写了一个前馈算法。它只是将前一层的输出作为下一层的输入。
def feedForward(n, inputs): # (inputs, inputList, hidden1, hidden2, outputs, bias):
inputList = n.getNeuronList()[0]
hidden1 = n.getNeuronList()[1]
hidden2 = n.getNeuronList()[2]
outputs = n.getNeuronList()[3]
bias = n.getNeuronList()[4]
FFInputs = []
FFHidden1 = []
FFHidden2 = []
FFOutputs = []
for inp in inputList:
FFInputs.append(inp.feedForward(inp.getWeights(), inp.getInputs()))
for hidden in hidden1:
FFHidden1.append(hidden.feedForward(hidden.getWeights(), FFInputs, bias[0]))
for hidden in hidden2:
FFHidden2.append(hidden.feedForward(hidden.getWeights(), FFHidden1, bias[1]))
for out in outputs:
FFOutputs.append(out.feedForward(out.getWeights(), FFHidden2, bias[2]))
return FFOutputs
用 matplotlib 完成的图形。
有人工神经网络经验的人知道为什么会这样做吗?我应该只使用一层吗?我正在用进化算法进化权重,所以我应该做更多代吗?我应该使用不同的激活函数吗?
