使用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


总结


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

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

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

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
什么是多层感知器(MLP)?
【8月更文挑战第23天】
131 0
|
2月前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
39 5
|
3月前
|
机器学习/深度学习 数据采集 数据处理
多层感知机(MLP)解决二分类任务
分类任务: 开发一个神经网络,预测一氧化碳 (CO) 浓度是否超过某一阈值(CO(GT) 值的平均值)。这项任务涉及二元分类,即您的模型学会将实例分为两类:高于或低于阈值。阈值。要确定阈值,您必须首先计算CO(GT) 的平均值,其中不包括未知数据(缺失值)。然后,使用该阈值来预测网络预测的值是高于还是低于该阈值。但是您的网络应该能够处理缺失值。
|
10月前
|
机器学习/深度学习 存储 算法
前向神经网络-多层感知器、损失函数、反向传播
前向神经网络-多层感知器、损失函数、反向传播
94 0
|
算法 PyTorch 算法框架/工具
pytorch实现空洞卷积+残差网络实验(torch实现)
pytorch实现空洞卷积+残差网络实验(torch实现)
385 0
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch实现基本的logistic和softmax回归实验(手动+torch)
pytorch实现基本的logistic和softmax回归实验(手动+torch)
257 0
|
机器学习/深度学习 人工智能 自然语言处理
【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU
对于分类任务来说,如果仅仅给出分类的结果,在某些场景下,提供的信息可能并不充足,这就会带来一定的局限。因此,我们建立分类模型,不仅应该能够进行分类,同时,也应该能够提供样本属于该类别的概率。这在现实中是非常实用的。例如,某人患病的概率,明天下雨概率等。因此,我们需要将z的值转换为概率值,逻辑回归使用sigmoid函数来实现转换。
615 0
|
机器学习/深度学习 算法 图计算
Paddle图神经网络-学习笔记(一)
Paddle图神经网络-学习笔记(一)
215 0
Paddle图神经网络-学习笔记(一)
|
机器学习/深度学习
Paddle图神经网络-学习笔记(三)
Paddle图神经网络-学习笔记(三)
106 0
Paddle图神经网络-学习笔记(三)
|
机器学习/深度学习 算法
Paddle图神经网络-学习笔记(二)
Paddle图神经网络-学习笔记(二)
95 0
Paddle图神经网络-学习笔记(二)