geekdoc-python-zh/docs/askpython/single-perceptron-neural-ne...

6.3 KiB
Raw Permalink Blame History

构建单一感知器神经网络

原文:https://www.askpython.com/python/examples/single-perceptron-neural-network

欢迎光临。今天,我们将讨论如何构建一个基本的单感知器神经网络。

我想让这成为我们深入探究一切的系列文章的第一篇——CNN、迁移学习等等。因此请务必将该网站加入书签并经常查看。此外这将包括一些数学所以系好安全带。

什么是感知器?

它是神经网络(NN)的最基本单元。在一个复杂的神经网络中,所有的数据都要经过其中的几个环节,这些环节通常同时进行,并扮演不同的角色。但我们稍后会谈到这一点。

目前,什么是感知机?

在监督学习中,感知器是一种线性分类器。因此,任何可以被一条直线分割的数据集都可以使用感知器进行分类,即任何看起来像这样的数据集:

Linearly Separable Dataset Examples

Linearly Separable Dataset Examples

最后一条不能被认为是线性可分的,因为它不是一条可以近似分离数据库的直线。

Perceptron

Perceptron

构建单一感知器神经网络

今天让我们继续构建我们的第一个单感知器神经网络。为此,我们将从创建数据开始。

1.创建我们的数据集

首先,我们需要数据集,在我们的例子中是一个 2D 数组。打开你的代码编辑器Jupyter 笔记本,或者 Google Colab。

import pandas as pd
import numpy as np
import random

让我们制作数据。我在这个例子中考虑一个 20*20 的平面,以保持我们的结果小而简洁。

#Dataset
df = pd.DataFrame()
df['x'] = [random.randint(1,20) for x in range(10)]
df['y'] = [random.randint(1,20) for x in range(10)]
df.head()

现在,我们需要给这些贴上标签。所以我们会根据一条线过滤掉(我考虑的是 y=x)。所以线下面的每个点都是 y<x。

label=[]
for i in range(df.shape[0]):
  if df.iloc[i,0] < df.iloc[i,1]:
    label.append(1)
  else:
    label.append(-1)

df['label'] = label
df

Dataset With Labels For Neural Nets Perceptron Model

Dataset With Labels For Neural Nets Perceptron Model

2.初始化值的权重

现在我们可以初始化权重。我们不能使用零值,所以我们将对权重采用随机均匀分布:

#weights and bias
weights = [np.round(random.uniform(-0.99,0.99),2) for i in range(2)]

然后,我们将权重乘以输入数据点并求和:

w = weights.copy()
X = [[df.iloc[i,0],df.iloc[i,1]] for i in range(df.shape[0])]
wx = [X[i][0]*w[0]+X[i][1]*w[1] for i in range(df.shape[0])]

现在,我们有了每个点的权重和输入的总和。

那么程序是什么,我们将把所有这些值一次一个地插入到激活函数中,然后基于输出我们将修改权重。

3.创建激活函数

现在我们来看激活函数。感知器处理总和,给我们一个标签,我们与原始标签进行比较,确定是否正确。如果不正确,则找到错误并调整权重,使得我们的解* 在原始方向上移动 *。

我们将使用 signum 函数:

如果 wx <=0则输出为 0。否则输出为 1。

for i in range(df.shape[0]):
  if wx[i]<=0:
    pred = 0
  else:
    pred = 1

记住,我们只有两个输入:x 和 y而不是整个数据帧。因此我们将扩展这个激活函数一次接收一个数据点然后找出误差并调整误差:

for i in range(df.shape[0]):
  if wx[i]<=0:
    pred = -1
  else:
    pred = 1
  if pred != df['label'][i] :
    err = df['label'][i] - pred
    w[0] = w[0] + err
    w[1] = w[1] + err

这个现在工作得很好。为了清楚地看到输出,我们将输入一组打印语句:

for i in range(df.shape[0]):
  print('wx : ',wx[i])
  if wx[i]<=0:
    pred = -1
  else:
    pred = 1
  print('label=',df['label'][i])
  print('pred = ',pred)
  if pred != df['label'][i] :
    err = df['label'][i] - pred
    print('err',err)
    print('before', w[0],w[1])
    w[0] = w[0] + err
    w[1] = w[1] + err
    print('after',w[0],w[1])
  else:
    print('w_i', w[0],w[1])

现在如果我们运行这个:

Updating Weights Single Perceptron Neural Network

Updating Weights Single Perceptron Neural Network

一个简单的打印格式语句给出了最终的重量。

Final Weights Single Perceptron Neural Network

Final Weights Single Perceptron Neural Network

4.在另一个数据库上测试我们的模型

类似于我们如何进行训练-测试-分割,我们将在这里使用不同的数据库进行测试。

#Test Dataset
new_df = pd.DataFrame()
new_df['x'] = [random.randint(1,20) for x in range(100)]
new_df['y'] = [random.randint(1,20) for x in range(100)]
new_df.head()

然后,我们基于 y=x 线和权重之和*输入生成标签:

label_text = []
for i in range(new_df.shape[0]):
  if new_df.iloc[i,0] < new_df.iloc[i,1]:
    label_text.append(1)
  else:
    label_text.append(-1)
new_wX = w[0]*new_df['x']+w[1]*new_df['y']

这是我的:

New Weight Sums Neural Net

New Weight Sums Neural Net

那么,现在是关键时刻,我们应用我们的激活函数,然后我们可以比较给定的标签和预测的标签:

new_df['given label'] = label_text
pred_label_text = []

for i in range(new_df.shape[0]):
  if new_wX[i]>=0:
    pred_label_text.append(-1)
  else:
    pred_label_text.append(1)

new_df['predicted labels'] = pred_label_text

Predicted Labels For New Dataset

Predicted Labels For New Dataset

如你所见,我们自己做得很好🙂

结论

祝贺您完成本教程。我希望这能让你对“感知机”有更多的了解。与我们保持联系,阅读我们未来的教程。