神经网络极简入门

news2024/9/20 16:23:06

神经网络是深度学习的基础,正是深度学习的兴起,让停滞不前的人工智能再一次的取得飞速的发展。

其实神经网络的理论由来已久,灵感来自仿生智能计算,只是以前限于硬件的计算能力,没有突出的表现,直至谷歌的AlphaGO的出现,才让大家再次看到神经网络相较于传统机器学习的优异表现。

本文主要介绍神经网络中的重要基础概念,然后基于这些概念手工实现一个简单的神经网络。希望通过理论结合实践的方式让大家更容易的理解神经网络。

1. 神经网络是什么

神经网络就像人脑一样,整体看上去非常复杂,但是其基础组成部分并不复杂。其组成部分中最重要的就是神经元neural),sigmod函数layer)。

1.1. 神经元

神经元(neural)是神经网络最基本的元素,一个神经元包含3个部分:

  • 获取输入:获取多个输入的数据

  • 数学处理:对输入的数据进行数学计算

  • 产生输出:计算后多个输入数据变成一个输出数据

image.png

从上图中可以看出,神经元中的处理有2个步骤。第一个步骤:从蓝色框变成红色框,是对输入的数据进行加权计算后合并为一个值(N)。N=x1w1+x2w2𝑁=𝑥1𝑤1+𝑥2𝑤2 其中,w1,w2𝑤1,𝑤2分别是输入数据x1,x2𝑥1,𝑥2的权重。一般在计算N𝑁的过程中,除了权重,还会加上一个偏移参数b𝑏,最终得到:N=x1w1+x2w2+b𝑁=𝑥1𝑤1+𝑥2𝑤2+𝑏

第二个步骤:从红色框变成绿色框,通过sigmoid函数是对N进一步加工得到的神经元的最终输出(M)。

1.2. sigmoid函数

sigmoid函数也被称为S函数,因为的形状类似S形

image.png

它是神经元中的重要函数,能够将输入数据的值映射到(0,1)(0,1)之间。最常用的sigmoid函数是 f(x)=11+e−x𝑓(𝑥)=11+𝑒−𝑥,当然,不是只有这一种sigmoid函数。

至此,神经元通过两个步骤,就把输入的多个数据,转换为一个(0,1)(0,1)之间的值。

1.3. 层

多个神经元可以组合成一层,一个神经网络一般包含一个输入层和一个输出层,以及多个隐藏层。

image.png

比如上图中,有2个隐藏层,每个隐藏层中分别有4个和2个神经元。实际的神经网络中,隐藏层数量和其中的神经元数量都是不固定的,根据模型实际的效果来进行调整。

1.4. 网络

通过神经元和层的组合就构成了一个网络,神经网络的名称由此而来。神经网络可大可小,可简单可复杂,不过,太过简单的神经网络模型效果一般不会太好。

因为一只果蝇就有10万个神经元,而人类的大脑则有大约1000亿个神经元,这就是为什么训练一个可用的神经网络模型需要庞大的算力,这也是为什么神经网络的理论1943年就提出了,但是基于深度学习的AlphaGO却诞生于2015年

2. 实现一个神经网络

了解上面的基本概念只能形成一个感性的认知。下面通过自己动手实现一个最简单的神经网络,来进一步认识神经元sigmoid函数以及隐藏层是如何发挥作用的。

2.1. 准备数据

数据使用sklearn库中经典的鸢尾花数据集,这个数据集中有3个分类的鸢尾花,每个分类50条数据。为了简化,只取其中前100条数据来使用,也就是取2个分类的鸢尾花数据。

from sklearn.datasets import load_iris

ds = load_iris(as_frame=True, return_X_y=True)
data = ds[0].iloc[:100]
target = ds[1][:100]

print(data)
print(target)

image.png

变量data100条数据,每条数据包含4个属性,分别是花萼的宽度和长度,花瓣的宽度和长度。

image.png

变量target中也是100条数据,只有0和1两种值,表示两种不同种类的鸢尾花。

2.2. 实现神经元

准备好了数据,下面开始逐步实现一个简单的神经网络。首先,实现最基本的单元--神经元。本文第一节中已经介绍了神经元中主要的2个步骤,分别计算出N𝑁和M𝑀。

image.png

计算N𝑁时,依据每个输入元素的权重(w1,w2𝑤1,𝑤2)和整体的偏移b𝑏;计算M𝑀时,通过sigmoid函数。

def sigmoid(x):
    return 1 / (1 + np.exp(-1 * x))

@dataclass
class Neuron:
    weights: list[float] = field(default_factory=lambda: [])
    bias: float = 0.0
    N: float = 0.0
    M: float = 0.0

    def compute(self, inputs):
        self.N = np.dot(self.weights, inputs) + self.bias
        self.M = sigmoid(self.N)
        return self.M

上面的代码中,Neuron类表示神经元,这个类有4个属性:其中属性weightsbias是计算N𝑁时的权重和偏移;属性NM分别是神经元中两步计算的结果。

Neuron类的compute方法根据输入的数据计算神经元的输出。

2.3. 实现神经网络

神经元实现之后,下面就是构建神经网络。我们的输入数据是带有4个属性(花萼的宽度和长度,花瓣的宽度和长度)的鸢尾花数据,所以神经网络的输入层有4个值(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4)。

为了简单起见,我们的神经网络只构建一个隐藏层,其中包含3个神经元。最后就是输出层,输出层最后输出一个值,表示鸢尾花的种类。

由此形成的简单神经网络如下图所示:

image.png

实现的代码:

@dataclass
class MyNeuronNetwork:
    HL1: Neuron = field(init=False)
    HL2: Neuron = field(init=False)
    HL3: Neuron = field(init=False)
    O1: Neuron = field(init=False)

    def __post_init__(self):
        self.HL1 = Neuron()
        self.HL1.weights = np.random.dirichlet(np.ones(4))
        self.HL1.bias = np.random.normal()

        self.HL2 = Neuron()
        self.HL2.weights = np.random.dirichlet(np.ones(4))
        self.HL2.bias = np.random.normal()

        self.HL3 = Neuron()
        self.HL3.weights = np.random.dirichlet(np.ones(4))
        self.HL3.bias = np.random.normal()

        self.O1 = Neuron()
        self.O1.weights = np.random.dirichlet(np.ones(3))
        self.O1.bias = np.random.normal()

    def compute(self, inputs):
        m1 = self.HL1.compute(inputs)
        m2 = self.HL2.compute(inputs)
        m3 = self.HL3.compute(inputs)

        output = self.O1.compute([m1, m2, m3])
        return output

MyNeuronNetwork类是自定义的神经网络,其中的属性是4个神经元HL1HL2HL3隐藏层的3个神经元;O1输出层的神经元。

__post__init__函数是为了初始化各个神经元。因为输入层是4个属性(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4),所以神经元HL1HL2HL3weights初始化为4个随机数组成的列表,偏移(bias)用一个随时数来初始化。

对于神经元O1,它的输入是隐藏层的3个神经元,所以它的weights初始化为3个随机数组成的列表,偏移(bias)还是用一个随时数来初始化。

最后还有一个compute函数,这个函数描述的就是整个神经网络的计算过程。首先,根据输入层(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4)的数据计算隐藏层的神经元(HL1HL2HL3);然后,以隐藏层的神经元(HL1HL2HL3)的输出作为输出层的神经元(O1)的输入,并将O1的计算结果作为整个神经网络的输出。

2.4. 训练模型

上面的神经网络中各个神经元的中的参数(主要是weightsbias)都是随机生成的,所以直接使用这个神经网络,效果一定不会很好。所以,我们需要给神经网络(MyNeuronNetwork类)加一个训练函数,用来训练神经网络中各个神经元的参数(也就是个各个神经元中的weightsbias)。

@dataclass
class MyNeuronNetwork:
    # 略...

    def train(self, data: pd.DataFrame, target: pd.Series):
        ## 使用 随机梯度下降算法来训练
        pass

上面的train函数有两个参数data(训练数据)和target(训练数据的标签)。我们使用随机梯度下降算法来训练模型的参数。这里略去了具体的代码,完整的代码可以在文章的末尾下载。

此外,再实现一个预测函数predict,传入测试数据集,然后用我们训练好的神经网络模型来预测测试数据集的标签。

@dataclass
class MyNeuronNetwork:
    # 略...
    
    def predict(self, data: pd.DataFrame):

        results = []
        for idx, row in enumerate(data.values):
            pred = self.compute(row)
            results.append(round(pred))

        return results

2.5. 验证模型效果

最后就是验证模型的效果。

def main():
    # 加载数据
    ds = load_iris(as_frame=True, return_X_y=True)

    # 只用前100条数据
    data = ds[0].iloc[:100]
    target = ds[1][:100]

    # 划分训练数据,测试数据
    # test_size=0.2 表示80%作为训练数据,20%作为测试数据
    X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)

    # 创建神经网络
    nn = MyNeuronNetwork()

    # 用训练数据集来训练模型
    nn.train(X_train, y_train)

    # 检验模型
    # 用训练过的模型来预测测试数据的标签
    results = nn.predict(X_test)
    df = pd.DataFrame()
    df["预测值"] = results
    df["实际值"] = y_test.values
    print(df)

运行结果可以看出,模型的效果还不错,20条测试数据的预测结果都正确。

image.png

3. 总结

本文中的的神经网络示例是为了介绍神经网络的一些基本概念,所以对神经网络做了尽可能的简化,为了方便去手工实现。

而实际环境中的神经网络,不仅神经元的个数,隐藏层的数量极其庞大,而且其计算和训练的方式也很复杂,手工去实现不太可能,一般会借助TensorFlowKerasPyTorch等等知名的python深度学习库来帮助我们实现。

文章转载自:wang_yb

原文链接:https://www.cnblogs.com/wang_yb/p/18176563

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1648452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zabbix+Grafana-常见报错及异常处理方式记录

文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户,配置报警后,无法收到报警 Grafana安装篇Windows系统安装时,添加zabbix报错:An error occurred within the plugin Zabbix安…

电商老板们,换个地方抢流量吧,抖音已经进入中后期了!

大家好,我是电商糖果 所有的电商平台,都会从巅峰时段,慢慢回归平稳,也就是大家说的中后期阶段。 中后期阶段的平台,各种流程化已经成熟。 新手商家再入局,很难从老商家手里抢到流量,这个时期…

双ISP住宅IP有何优势?

双ISP住宅IP在当前的互联网环境中具有显著的优势,这些优势主要体现在网络连接的稳定性、安全性、速度以及业务适用范围等方面。以下是对双ISP住宅IP优势的详细分析: 第一点网络连接的稳定性,双ISP住宅IP使用两个不同的互联网服务提供商&…

ICC2:optimize_routability

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 在postroute阶段,一些pin access引起的绕线问题,通常以end of line和short/spacing的形式扎堆出现,总量兴许不多,但是反复绕线仍难解决,返回preplace去设置keepout margin或placement label又得…

2024年Q1脱毛膏线上市场(京东天猫淘宝)销量销额排行榜

鲸参谋监测的2024年Q1季度线上电商平台(天猫淘宝京东)脱毛膏行业销售数据已出炉! 根据鲸参谋数据显示,今年Q1季度在线上电商平台(天猫淘宝京东),脱毛膏的销量累计接近220万件,环比增…

3D模型实时变形算法

最近,在尝试渲染一些奇怪的形状后,我陷入了计算机图形学的困境。事实证明,对于我试图解决的具体问题,没有现有的选项完全适合我想要做的事情。几周后,我终于带着一些答案再次浮出水面,写了很多行代码&#…

首席数据官CCDO的核心能力素质:引领企业数据战略的关键

在数字化时代,数据已成为企业最宝贵的资产,而首席数据官(CCDO)的角色也日益凸显。作为企业数据战略的核心推动者,CCDO需要具备一系列核心能力素质,以确保企业能够充分利用数据资源,实现业务增长…

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用,展开后其他按钮正常点击,上传按钮无效。 具体原因没有深究,大概率是展开的子菜单没有被渲染treeTable的done管理到,导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…

Docker容器创建各种镜像

目录 1.Docker创建Mysql容器 2.Docker创建Redis容器 3.Docker 创建minio容器 1.Docker创建Mysql容器 拉取镜像 docker pull mysql:8.0.20 宿主机创建挂载目录 /opt/mysql/conf /opt/mysql/data /opt/mysql/log 启动命令 docker run --name mysql -p 3306:3306 -v /opt/…

探索1688、淘宝、京东搜索商品聚合API接口:一站式电商搜索解决方案

随着电商行业的不断发展,电商平台的数量和商品种类都在快速增长。商家和开发者在运营过程中,需要经常进行跨平台的商品搜索和数据分析。然而,由于各个电商平台的数据接口存在差异,直接对接多个平台不仅效率低下,而且维…

【动态规划三】子数组系列

目录 leetcode题目 一、最大子数组和 二、环形子数组的最大和 三、乘积最大子数组 四、乘积为正数的最长子数组长度 五、等差数列划分 六、最长湍流子数组 七、单词拆分 八、环绕字符串中唯一的子字符串 子数组系列,属于线性dp问题,状态表示也是…

Java实现手机短信验证码(互亿无线)

互亿无线 互亿无线是一家提供电信类增值服务插件以及其他相关插件的公司,是中国移动、中国联通、中国电信三大运营商的战略合作伙伴与工信部认定的电信增值业务服务商。公司旗下运营三大业务平台:数字奖励营销活动平台、应用短信平台、营销短信平台。 官…

阿里开源的lowcode-engine:加速企业级应用开发的低代码利器

lowcode-engine 是阿里巴巴推出的一个企业级的低代码开发平台,它就像是给开发者的一个工具箱,里面装满了各种现成的工具和材料,让搭建应用程序变得像搭积木一样简单。你不需要从零开始,而是可以直接用这些工具和材料去构建你想要的…

AJ-Report开源数据大屏远程命令执行漏洞

文章目录 描述漏洞原理影响版本漏洞复现修复方案 描述 AJ-Report是全开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。     多数据源支持,内置mysql、elasticsearch、kudu驱动,支持…

STM32单片机实战开发笔记-GPIO控制LED灯、蜂鸣器、继电器等【wulianjishu666】

单片机物联网开发资料: 链接:https://pan.baidu.com/s/1XzodQuML7CqZ4ZKinDGKkg?pwdbgep 提取码:bgep 单片机GPIO的Do输出功能 1、功能描述 根据MP3的声音频率,让LED灯以不同的高度(LED的多少)&#xf…

纯净水20、脉动30被指宰客!疯狂开始反噬小杨哥?

作为疯狂小杨哥早期粉,小柴好像很久没看到小杨哥的搞笑视频了。 自然,再在社交媒体上看到,小杨哥兄弟已经不再是那个青涩的少年了。 而是摇身一变不仅成为一个非常成功带货主播,且成为一个资本版图越来越多,玩的越来越…

AI实景自动无人直播软件:引领直播行业智能化革命;提升直播效果,无人直播软件助力智能讲解

随着科技的快速发展,AI实景自动无人直播软件正在引领直播行业迈向智能化革命。它通过智能讲解、一键开播和智能回复等功能,为商家提供了更高效、便捷的直播体验。此外,软件还支持手机拍摄真实场景或搭建虚拟场景,使直播画面更好看…

阴影渲染在AI去衣技术中的关键作用

引言: 随着人工智能技术的飞速发展,深度学习在图像处理领域取得了突破性的进展。其中,AI去衣技术作为一种高度复杂的图像到图像的转换过程,不仅要求算法能够精确地识别并处理衣物纹理和结构,还要求生成的结果具有高度的…

【C语言】——联合体与枚举

【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体   与…

CPLEX+YALMIP安装(matlab调用)

通过百度网盘分享的文件:yalmipc… 链接:https://pan.baidu.com/s/1wwYDu9bHFPmcCg5vD2pSXg?pwd9d1r 提取码:9d1r 复制这段内容打开「百度网盘APP 即可获取」 基于MATLAB的Cplex、Yalmip环境安装_如何安装给matlab安装cplex-CSDN博客 具体安装步骤可以参考这篇博…