首页 分享 【深度学习

【深度学习

来源:花匠小妙招 时间:2025-07-17 12:16

个人主页:@AI_magician

首页地址: 作者简介:CSDN内容合作伙伴,全栈领域优质创作者。

愿景:旨在与更多热爱电脑的伙伴共同成长!

声明:我目前是大学二年级学生,有兴趣研究人工智能硬件(虽然我还没有开始玩硬件,但是我一直对它很感兴趣!希望你能带给我)

该文章收录专栏

【---《深度剖析机器学习:从原理到应用的全面指南》---]

感知器 (Perceptron) MLP-BP神经网络

阅读参考文献:

一个非常有趣的解释器(感知器是一种单层神经网络,而多层感知器则称为神经网络。):https://towardsdatascience.com/what-the-hell-is-perceptron-626217814f53

感知器

感知器是神经网络的基础

Frank Roseblatt 于1977 年发明的感知器是最简单的ANN 架构之一(线性函数加上硬阈值这里阈值不一定是0),其灵感来自于一开始的生物神经元模型(XOR问题逻辑问题),称为阈值逻辑单元(TLU,threshold)逻辑单元)或线性阈值单元(LTU,线性阈值单元),这是一个使用阶跃函数的神经元来计算,可以用于线性可分离的二元分类任务,也可以设置多个感知器输出来实现多输出分类来输出n个二值结果(缺点是无法学习各种类别关系),一般会添加一个偏置特征1以增加模型灵活性。

在感知器中引入偏置特征神经元1的目的是增加模型的灵活性和表达能力。此偏置功能对应于固定且始终为1 的输入其对应的权重称为偏置项(bias)。通过调整偏置项的权重,我们可以控制 TLU 的决策边界在特征空间中平移或倾斜。 (通常来说,这个偏置项存在于每个神经元中,而不是作为单个输入,这样可以更灵活)

在感知器中,选择将偏差特征固定为1 是为了便于计算和表示。

当我们引入偏置特征时,我们可以将其视为与其他输入特征相同的维度,并给它一个固定值1。这有几个优点:

计算方便:偏置项乘以1相当于直接使用权重来表示该偏置项。进行加权和和应用阈值函数时不需要额外的操作或考虑。参数均匀性:通过将偏差项视为独立的权重,所有输入特征(包括原始输入和偏差)都具有相同的形式和统一性。简洁明了:固定为1 的偏置功能启用简化模型参数表示,并且更容易理解和解释。请注意,在实际应用中,某些任务可能需要调整默认值1,以适应数据分布或优化模型性能。但基本原则仍然是保持一个恒定值作为附加输入特征,并且通常根据具体情况进行学习或调整。

具体来说,引入偏置特征1有几个原因:

平移决策边界:通过调整偏差项的权重,可以将决策边界平移到不同的方向。如果没有偏差项,决策边界将必须通过原点(0, 0)。控制输出截取:均为其他输入都为零时,只有存在偏置项才能使感知器产生非零输出时。增强模型表现力:引入额外维度使得在某些情况下更容易找到合适分割样本空间线性超平面位置

总之,在感知器中引入偏差特征1可以使模型更加灵活,能够适应不同的决策边界位置,并增加模型对输入数据的表达能力。其中,Siegrid Lowel非常有名的一句话“共同激活的神经元是连接在一起的”(赫布的想法,一个生物单元经常触发另一个神经元,两者之间的关系得到加强),因此Rosenblatt提出了感知器训练算法,它强化了连接有助于减少错误。如果预测错误,比如预测目标为1,而预测为0,则相应神经元的权重和偏置将会增强。如果预测目标为0,预测为1,则将会减少。 (根据阶跃函数的性质,数值越大则为1,数值越小则为0)

以下是感知器训练算法的步骤(只有一层神经网络):

初始化参数:将权重向量w和偏置b初始化为零或随机小数。 (一般来说,当感知器数量较少时,如果数量较多,可以使用如何初始化神经网络等)迭代每个训练样本:

计算预测输出y_hat = sign(w * x + b),其中w 为权重向量,x 为输入特征向量,b 为偏差项,sign() 函数表示符号(正负,以二分类为例)。更新权重和偏差:

如果是y_hat 等于实际标签 y,则无需更新参数。如果y_hat不等于实际标签y,则按照以下规则更新参数:

权重更新规则:w=w + * (y - y_hat) * x,其中是学习率(控制每次更新的步长)。偏差更新规则:b=b + * (y - y_hat)。 (offset) 迭代这个过程,直到所有样本都被正确分类或者达到预定的停止条件(例如达到最大迭代次数)。从下面我们可以看到线性可分离感知器训练过程和线性不可分离感知器训练过程。在线性不可分的情况下,泛化能力较差。

鸢尾花多分类案例

科学学习: https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html`

维基百科: https://en.wikipedia.org/wiki/Iris_flower_data_set

从上面的可视化中我们可以知道,用Perceptorn分类必然效果不好,因为其线性不可分

不使用库实现感知器一对多策略多分类iris 数据集任务的代码:

将numpy 导入为np

从sklearn.datasets 导入load_iris

从sklearn.model_selection 导入train_test_split

从sklearn.metrics 导入precision_score

感知器:类

'''设计架构

1.初始化基本超参数

2.根据算法模型抽象出权重训练过程

3.训练时细分单样本训练和预测将单样本预测细分为多样本训练和预测'''

def __init__(自身,learning_rate=0.1,num_epochs=20) :

自己。学习率=学习率

self.num_epochs=num_epochs

def 火车(自身,X,y):

# 为输入数据添加偏置项

X=np.insert(X, 0, 1, 轴=1)

# 将权重初始化为随机值

NP。随机的。种子(42)

自己。权重=[]

# 训练模型(每个类都有自己独立的感知器)

for class_label in set(y): # 集合去重

binary_labels=np.where(y==class_label, 1, -1) # True 为1 或False 为-1

# 打印(二进制标签)

权重类=self. train_single_perceptron(X,二进制标签)

self.weights.append(weights_class)

def train_single_perceptron(自身,X,y):

weights=np.random.rand(X.shape[1]) # 随机初始化后训练(每个样本的特征数量)

for _ in range(self.num_epochs): #round

对于范围内的i(len(X)):

Prediction=self.predict_single_sample(X[i],weights) # 数据和权重解

误差=y[i]-预测

# 更新权重

更新=自我。学习率*误差*X[i]

权重+=更新

返回权重

def Predict_single_sample(自身,x,权重):

'''接收x和权重返回阶跃函数'''

激活值=np.点(x, 权重)

return 1 if activate_value=0 else -1 # 步骤函数(对应于前面的binary_labels)

def 预测(自我,X_test):

X_test=np.insert(X_test, 0, 1, axis=1) # 还需要插入偏置神经元1

预测=[]

对于我在范围内(len(X_test)):

类预测=[]

对于self.weights: 中的perceptron_weights

class_predictions.append(self.predict_single_sample(X_test[i], perceptron_weights))

Predicted_class=np.argmax(class_predictions) # 如果大小相同则返回第一个下标

# 打印(类预测)

# 打印(预测类)

预测.append(predicted_class)

返回预测

# 加载鸢尾花数据集(数据按顺序排列,必须打乱,泛化能力强)

数据=load_iris()

X_train, X_test, y_train, y_test=train_test_split(data.data, data.target, test_size=0.2, random_state=42) #

# X_train, X_test, y_train, y_test=data.data[:120,],data.data[120:],data.target[:120],data.target[120:] # , random_state=42

# 创建感知器对象并训练模型

感知器=感知器()

感知器。火车(X_train,y_train)

# 使用测试数据集进行预测

预测=感知器。预测(X_测试)

print(np.array(预测))

打印(y_测试)

# 打印(类型(y_test))

Accary=sum(预测==y_test)/len(y_test)

准确度=准确度_分数(y_测试,预测)

打印(准确)输出

[1 0 1 0 1 0 0 2 1 1 2 0 0 0 0 0 2 1 1 2 0 2 0 2 2 2 1 2 0 0]

[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0]

0.8333333333333334使用库实现感知器分类虹膜数据集任务的代码:

从sklearn.linear_model 导入感知器

# 加载鸢尾花数据集

数据=load_iris()

X_train, X_test, y_train, y_test=train_test_split(

data.data, data.target, test_size=0.2, random_state=42) # 如果随机数相同,则随机结果相同

# 数据. 数据[:120,], 数据. 数据[120:], 数据. 目标[:120], 数据. 目标[120:] #

# 创建并训练感知器模型

感知器=感知器(eta0=0.1, max_iter=100)

感知器。适合(X_train,y_train)

# 使用测试数据集进行预测

预测=感知器。预测(X_测试)

打印(预测)

打印(y_测试)

Accary=sum(预测==y_test)/len(y_test)

打印(准确)输出:

[1 0 2 0 1 0 0 2 1 0 2 0 0 0 0 0 2 0 0 2 0 2 0 2 2 2 2 2 0 0]

[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0]

0.8sklearn.linear_model.Perceptron的参数:

惩罚:惩罚项(默认:无)。您可以选择“l1”或“l2”来应用L1 或L2 正则化,也可以选择“无”来应用不惩罚。 alpha: 正则化强度(默认值:0.0001)。 alpha 越大表示正则化越强。 fit_intercept: 是否拟合截距(默认:True)。如果设置为False,模型将无法拟合截距。 max_iter: 最大迭代次数(默认值:1000)。指定达到收敛之前要执行的最大迭代次数。 tol: 收敛容差(默认值:1e-3)。指定当目标函数改进小于此阈值时停止训练的容忍级别。 shuffle: 是否在每个周期打乱数据顺序(默认值:True)。 eta0: 初始学习率(默认值:1.0)。控制权重更新速度的学习率。较低的初始学习率可能有助于稳定模型收敛过程,但训练时间可能会更长。 random_state: 随机种子。提供一个整数以保证结果的可重复性,或设置为None 以使用随机状态。 verbose: 是否打印详细输出(默认值:0)。当设置为1时,损失函数的值会定期打印出来。在这两个示例中,我们都使用了iris 数据集并将其分为训练数据和测试数据。然后,我们创建一个感知器对象(自定义或由Scikit-Learn 提供)并使用train() 方法(自定义)或fit() 方法(Scikit-Learn)来训练模型。最后,对测试数据使用predict()方法来生成预测。 (其中,我们还可以设置一些超参数来达到优化的目的)

扩大:

Keras 中的MLPClassifier 和Dense 层都用于实现多层感知器模型。

在Scikit-Learn 库中,MLPClassifier 是一种基于神经网络的分类器,使用反向传播算法进行训练,可以处理多类分类问题。您可以通过指定不同的参数来配置隐藏层、激活函数、优化算法等。

在Keras 库中,Dense 层也用作构建神经网络模型的一部分。它定义了一个全连接层,其中每个输入节点都有到输出节点的加权连接。你可以通过设置不同的参数来调整这一层的大小、激活函数等。

虽然两者的功能类似,但是由于框架和接口的不同,在代码编写上可能会有所不同。因此,在使用时需要根据所选择的框架对代码进行适当的调整。

一般情况下,“MLPClassifier”和Keras中“Dense”层都是为了实现多层感知器模型而设计的工具,在不同框架下提供了类似功能但语法略有差异。

应用场景

Perceptron相比其他机器学习算法具有以下优势:

简单高效:感知器算法非常简单且易于实现,计算速度快。对噪声数据具有鲁棒性:由于其使用了阶跃函数作为激活函数,在处理带有噪声数据时表现较好。支持在线学习:感知器是一种在线学习算法,可增量更新权重和阈值,并在每次迭代中对新样本进行训练。然而,感知器也有一些局限性:

仅适用于线性可分问题:由于它基于线性模型,因此位于处理非线性可分问题时无法取得良好的结果只能进行二分类:感知器只能用于二元分类任务,不能直接扩展用于多类分类问题。对输入特征缩放敏感:感知器对输入特征的缩放很敏感,例如

特征之间的尺度差异较大(因为结果是根据值的大小决定的,所以在使用前需要数据特征归一化或者标准化),可能会影响算法的性能。在实际应用中,当面对非线性可分问题时,可以考虑使用其他更复杂的模型,如支持向量机、神经网络等。这些模型具有更强大的表示能力,并且能够处理更为复杂和抽象的关系。然而,在某些简单问题上,感知器仍然是一个有效且高效的选择。 总结起来就是,感知器适用于解决线性可分二分类问题,并且具有简单、高效和鲁棒等优点。但它无法处理非线性可分问题,并且只能进行二分类任务。对于不同类型或更复杂的问题,可以考虑使用其他更适合的方法。

BP神经网络

BP神经网络,指的是用了**“BP算法”进行训练的“多层感知器模型”(MLP)。**并为了TLU感知机算法正常工 作,对MLP的架构进行了修改,即将阶跃函数替换成其他激活函数,如tanh,Relu。这里之所以用反向传播是因为多层的感知机无法再用感知机学习规则来训练. 到这里,如果还有什么疑问欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的! 如果对你有帮助,你的赞是对博主最大的支持!!

相关知识

《深度学习》Deep
深度学习 花卉识别
深度学习及其应用
可视化学深度学习
神经网络与深度学习
深度学习(花书)+ 动手学深度学习(李沐)资料链接整理
深度学习应用开发
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习花的分类识别
深度学习与安全

网址: 【深度学习 https://www.huajiangbk.com/newsview2166810.html

所属分类:花卉
上一篇: 招生|艺术伴你成长——茉莉花开艺
下一篇: 素描的花卉怎么画

推荐分享