使用paddle2.0实现单层感知机

简介: 大家好,这里是三岁,给大家带来的是简单感知机(单层感知机)的paddle2.0 实现

项目地址:https://aistudio.baidu.com/aistudio/projectdetail/1546134

大家好,这里是三岁,给大家带来的是简单感知机(单层感知机)的paddle2.0 实现


感知机



感知机也被指为单层的神经网络,作为一种线性分类器,(单层)感知机可说是最简单的前向人工神经网络形式。尽管结构简单,感知机能够学习并解决相当复杂的问题。

感知机主要的本质缺陷是它不能处理线性不可分问题。


感知器



感知器(英语:Perceptron)又译为感知机是Frank Rosenblatt在1957年就职于康奈尔航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈神经网络,是一种二元线性分类器。


感知机的灵感由来


感知机是生物神经细胞的简单抽象。神经细胞结构大致可分为:树突、突触、细胞体及轴突。单个神经细胞可被视为一种只有两种状态的机器——激动时为‘’,而未激动时为‘’。


神经细胞的状态取决于从其它的神经细胞收到的输入信号量,及突触的强度(抑制或加强)。当信号量总和超过了某个阈值时,细胞体就会激动,产生电脉冲。


电脉冲沿着轴突并通过突触传递到其它神经元。为了模拟神经细胞行为,与之对应的感知机基础概念被提出,如权量(突触)、偏置(阈值)及激活函数(细胞体)。


dc847b0c10168f66b9ba3dfb506f29e6.jpg


定义

感知器使用特征向量来表示的前馈神经网络,它是一种二元分类器,把矩阵上的输入x(实数值向量)映射到输出值 f(x) 上(一个二元的值)。


e7b7ecf6051e11909c06052440363db6.jpg


w是实数的表示权重的向量, w * x 是点积。b是偏置,一个不依赖于任何输入值的常数。偏置可以认为是激励函数的偏移量,或者给神经元一个基础活跃等级。


f(x)(0或1)用于对x进行分类,看它是肯定的还是否定的,这属于二元分类问题。如果b是负的,那么加权后的输入必须产生一个肯定的值并且大于


-b,这样才能令分类神经元大于阈值0。从空间上看,偏置改变了决策边界的位置(虽然不是定向的)。


由于输入直接经过权重关系转换为输出,所以感知器可以被视为最简单形式的前馈式人工神经网络。


举例


此处我们以下图为例子进行代码举例:


31719bb7d61d39bb464a188b1b6c4092.jpg


# 导入第三方库
import paddle
import numpy as np


解析


我们以维基百科中的单层神经网络为依据

以公式y=x1*w1+x2+w2+b进行举例

假设公式为:y = 2 * x1 + 4 * x2 + 5


y x1 x2
15 1 2
21 2 3
27 3 4
33 4 5
31 3 5
29 2 4
31 3 4


用这个数据进行学习,查看

# 对数据进行定义
x_data = paddle.to_tensor([[1., 2.], [2., 3.], [3., 4.], [4., 5.], [3., 5.], [2., 4.], [3., 4.]])
y_data = paddle.to_tensor([[15.], [21.], [27.], [33.], [31.], [29.], [31.]])
print(f'x_data:{x_data}')
print(f'y_data:{y_data}')


x_data:Tensor(shape=[7, 2], dtype=float32, place=CPUPlace, stop_gradient=True,
       [[1., 2.],
        [2., 3.],
        [3., 4.],
        [4., 5.],
        [3., 5.],
        [2., 4.],
        [3., 4.]])
y_data:Tensor(shape=[7, 1], dtype=float32, place=CPUPlace, stop_gradient=True,
       [[15.],
        [21.],
        [27.],
        [33.],
        [31.],
        [29.],
        [31.]])


数据的定义(使用to_tensorAPI)


to_tensorAPI可以把数据进行处理,转变成paddle能够处理的张量

利用该API可以把np、列表等数据进行转换


API官网传送门

三岁白话Paddle Tensor第一话

三岁白话Paddle Tensor第二话


# 定义初始化神经网络
linear = paddle.nn.Linear(in_features=2, out_features=1)
# 查看网络
paddle.summary(linear, (2,))
---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================
   Linear-1            [[2]]                 [1]                 3       
===========================================================================
Total params: 3
Trainable params: 3
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
---------------------------------------------------------------------------
 {'total_params': 3, 'trainable_params': 3}


对网络进行定义(使用Linear


paddle.nn.Linear

线性变换层 。对于每个输入Tensor X ,计算公式为:

Out=XW+b

官网传送门

paddle.summary:

函数能够打印网络的基础结构和参数信息

官网传送门


# 查看初始化值
w1_before_opt = linear.weight.numpy()[0].item()  # 获取w1的值
w2_before_opt = linear.weight.numpy()[1].item()  # 获取w1的值
b_before_opt = linear.bias.numpy().item()  # 获取b的值
print("w1 before optimize: {}".format(w1_before_opt))
print("w2 before optimize: {}".format(w2_before_opt))
print("b before optimize: {}".format(b_before_opt))
w1 before optimize: -0.05054903030395508
w2 before optimize: 0.4207116365432739
b before optimize: 0.0
# 添加损失函数和优化算法
mse_loss = paddle.nn.MSELoss()  
sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters = linear.parameters())


添加损失函数和优化算法(使用paddle.nn.MSELosspaddle.optimizer.SGD


计算预测值和目标值的均方差误差:paddle.nn.MSELoss参考地址

随机梯度下降算法的优化器:C(paddle.optimizer.SGD)参考地址


# 训练机器,学习参数
total_epoch = 20000  # 运行轮数
for i in range(total_epoch):
    y_predict = linear(x_data)
    loss = mse_loss(y_predict, y_data)
    loss.backward()
    sgd_optimizer.step()  # 执行一次优化器并进行参数更新
    sgd_optimizer.clear_grad()  # 清除需要优化的参数的梯度
    if i%1000 == 0:  # 每1000轮输出一次
        print("epoch {} loss {}".format(i, loss.numpy()))
print("finished training, loss {}".format(loss.numpy()))
epoch 0 loss [2.9675884]
epoch 1000 loss [2.9675617]
epoch 2000 loss [2.9675353]
epoch 3000 loss [2.9675167]
epoch 4000 loss [2.967499]
epoch 5000 loss [2.9674878]
epoch 6000 loss [2.9674761]
epoch 7000 loss [2.9674687]
epoch 8000 loss [2.967461]
epoch 9000 loss [2.9674509]
epoch 10000 loss [2.967448]
epoch 11000 loss [2.967442]
epoch 12000 loss [2.9674382]
epoch 13000 loss [2.9674332]
epoch 14000 loss [2.9674318]
epoch 15000 loss [2.96743]
epoch 16000 loss [2.967428]
epoch 17000 loss [2.9674275]
epoch 18000 loss [2.9674249]
epoch 19000 loss [2.9674246]
finished training, loss [2.9674237]
# 查看训练结果以后的值:
w1_before_opt = linear.weight.numpy()[0].item()  
w2_before_opt = linear.weight.numpy()[1].item()  
b_before_opt = linear.bias.numpy().item()  
print("w1 before optimize: {}".format(w1_before_opt))
print("w2 before optimize: {}".format(w2_before_opt))
e optimize: {}".format(w2_before_opt))
print("b before optimize: {}".format(b_before_opt))
w1 before optimize: 0.7338576912879944
w2 before optimize: 5.197205543518066
b before optimize: 4.780434608459473


总结


这个感知机已经实现了,但是效果不是很好

主要原因:数据量给的太少了如果多添加几组就会得到一个更好的效果

这里是三岁,我们下次见!

目录
相关文章
|
机器学习/深度学习 网络架构
浅谈神经网络中的bias
1、什么是bias? 偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),它其实就是函数的截距,与线性方程 y=wx+b 中的 b 的意义是一致的。在 y=wx+b中,b表示函数在y轴上的截距,控制着函数偏离原点的距离,其实在神经网络中的偏置单元也是类似的作用。 因此,神经网络的参数也可以表示为:(W, b),其中W表示参数矩阵,b表示偏置项或截距项。
1292 0
浅谈神经网络中的bias
WK
|
3月前
|
机器学习/深度学习
在神经网络的反向传播中,Tanh和Sigmoid哪个更快
在神经网络反向传播中,Tanh与Sigmoid函数的速度差异并无定论,受网络结构、数据特性及参数设置影响。Sigmoid在远离零时易导致梯度消失,而Tanh因输出范围为(-1, 1)且以0为中心,能更好地缓解此问题,理论上训练速度更快。两者计算复杂度相近,现代硬件优化使这一差距不明显。实际应用中,Sigmoid常用于二分类输出层,Tanh则适用于隐藏层以加速收敛并减少权重更新偏向。随着深度学习发展,ReLU等新激活函数因高效性和轻度梯度消失问题成为主流选择。综合来看,Tanh可能比Sigmoid稍快,但需根据具体任务和网络结构选择。
WK
82 0
|
5月前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
66 5
|
6月前
|
机器学习/深度学习 数据采集 数据处理
多层感知机(MLP)解决二分类任务
分类任务: 开发一个神经网络,预测一氧化碳 (CO) 浓度是否超过某一阈值(CO(GT) 值的平均值)。这项任务涉及二元分类,即您的模型学会将实例分为两类:高于或低于阈值。阈值。要确定阈值,您必须首先计算CO(GT) 的平均值,其中不包括未知数据(缺失值)。然后,使用该阈值来预测网络预测的值是高于还是低于该阈值。但是您的网络应该能够处理缺失值。
|
机器学习/深度学习 存储 算法
前向神经网络-多层感知器、损失函数、反向传播
前向神经网络-多层感知器、损失函数、反向传播
131 0
|
机器学习/深度学习
深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数
池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过池化某一片区域的像素点来得到总体统计特征会显得很有用。由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。
480 1
深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数
|
算法 PyTorch 算法框架/工具
pytorch实现空洞卷积+残差网络实验(torch实现)
pytorch实现空洞卷积+残差网络实验(torch实现)
407 0
|
机器学习/深度学习 人工智能 自然语言处理
【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU
对于分类任务来说,如果仅仅给出分类的结果,在某些场景下,提供的信息可能并不充足,这就会带来一定的局限。因此,我们建立分类模型,不仅应该能够进行分类,同时,也应该能够提供样本属于该类别的概率。这在现实中是非常实用的。例如,某人患病的概率,明天下雨概率等。因此,我们需要将z的值转换为概率值,逻辑回归使用sigmoid函数来实现转换。
674 0
|
机器学习/深度学习 算法 图计算
Paddle图神经网络-学习笔记(一)
Paddle图神经网络-学习笔记(一)
231 0
Paddle图神经网络-学习笔记(一)
|
机器学习/深度学习
Paddle图神经网络-学习笔记(三)
Paddle图神经网络-学习笔记(三)
117 0
Paddle图神经网络-学习笔记(三)