神经网络的矢量化,训练与激活函数

news2024/12/28 20:50:35

我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。

单层的正向传递:

我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。

我们用这个方法就可以得到我们的激发值,以及输出值。

我们用更加简便的python编码。

我们先把我们需要用到的特征值w,b写成矩阵。 

def dense(a_in, W, b, g):
    units = W.shape[1]
    a_out = np.zeros(units)
    for j in range(units):
        w = W[:, j]
        z = np.dot(w, a_in) + b[j]
        a_out[j] = g(z)
    return a_out

我们在下面继续每一层,正向传递。

def sequential (x):
    a1 = dense(x, W, b )
    a2 = dense(a1, W, b )
    a3 = dense(a2, W, b )
    a4 = dense(a3, W, b )
    f_x = a4
    return f_x

这样子我们就可以进行一个完整的神经网络。

Ai中的ANI和AGI

实际上,我们的AI分为两个部分,第一部分叫做ANI,也就是人工狭义智能,它也就是现在我们很多人在研究的部分,而AGI被称为是人工智能,它是更加贴近于我们人的AI。

 

但是我们对于人脑的研究也并不完全,导致我们做出的根据神经元做出的结构也远不能达到人工智能的标准。 

神经网络的矢量化实现:

在神经网络的矢量化,可以让我们的正向传统更加的简便。与我们之前的用循环的方式不同的是,

W = np.array([[1, -3, 5],
              [2, -4, 6]])

b = np.array([[1, 1, 2]])
a_in = np.array([[2, -4]])

def dense(a_in, W, b, g):
    units = W.shape[1]
    a_out = np.zeros(units)
    for j in range(units):
        w = W[:, j]
        z = np.dot(w, a_in) + b[j]
        a_out[j] = g(z)
    return a_out

上述的是之前我们使用循环写成的一个神经层的输入与输出。

W = np.array([[1, -3, 5],
              [2, -4, 6]])

b = np.array([[1, 1, 2]])
a_in = np.array([[2, -4]])

def dense(a_in, W, b, g):
    #通过我们的矩阵乘法,我们可以得到我们需要的矩阵
    Z = np.matmul(a_in,W) + b
    #使用我们的激发函数,得到我们的输出,也是一个矩阵
    A_out = g(Z)
    #返回我们的矩阵
    return A_out
[[1,-1]]

我们把我们在循环的方法换成了我们的矢量相乘的方法,这个方法很好的帮我们的代码得到了大量的简便。

向量的基本性质:

这部分不做过多的解释。

 

用程序写矩阵乘法:

A = np.array([[1,-1,-0.1],
              [2,-2,-0.2]])
AT = np.array([[1,2],
               [-1,-2],
               [-0.1,-0.2]])
#用T来进行转制
AT = A.T

W = np.array([[3,5,7,9],
              [2,4,8,0]])
#矩阵乘法
Z = np.matmul(AT,W)
#也可以用@
z = AT @ W


 训练神经网络:

我们在训练神经网络中,主要有三步骤:

1.计算推理,2. 利用特定的损失函数编译模型,3.训练模型

接下来,我们从逻辑回归的 角度去寻找我们如何在tensor flow来训练我们的神经网络。

第一步创建模型:

import tensorflow as tf
import numpy as np
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(units=25, activation="sigmoid"),
    Dense(units=15, activation="sigmoid"),
    Dense(units=1, activation="sigmoid")
])

第二步指定损失函数:

我们在这里用到一个函数叫做:BinaryCrossentropy(),它作为我们的逻辑函数的损失函数。

from tensorflow.keras.losses import BinaryCrossentropy
model.compile(loss=BinaryCrossentropy())

当然,这个是用于我们的逻辑回归的,当我们只需要解决回归问题时,我们用到的是MeanSquaredError()这个方法。

from tensorflow.keras.losses import MeanSquaredError
model.compile(loss=MeanSquaredError())

第三步梯度下降,最小化成本函数:

在这里我们为了去训练我们的数据,我们用到的是逆向传递的算法。也就是我们的fit()函数 

model.fit(X,y,epochs=100)

epochs指的是进行100训练。

不同的激活函数:

我们在这里介绍了一个RELU的激活函数:简单来说它就是我们的取0和Z中的最大值 。

还有一个是我们的g(z) = z,它似乎和加上这个激活函数的效果没有任何变化,所以它也被我们叫做线性激活函数。

上图三个激活函数,是我们使用的比较多的。

选择激活函数:

选择我们对应的激活函数,我们主要观察的就是我们的所要求得的值的范围。

比如:我们用到了我们的sigmoid函数 ,就用在我们需要得到1或着0时,而我们的线性激活函数,则用在我们输出无论正负的范围,而我们的ReLu函数,则是对于大于0的部分。

在我们使用我们的激活函数时,函数的平坦度会影响我们梯度下降的速度,会导致我们的成本函数取到最小值的时间变长,但我们用ReLu函数则在代码运行时,更加的快。

所以,最好的方式就是在隐藏层,我们更多是使用我们的ReLu函数,因为它的下降更加的快,对于我们函数的运行有好处,而在最后输出层,我们则可以根据我们的需要选择我们的激活函数。

Dense(units=25, activation="linear"),
Dense(units=15, activation="relu"),
Dense(units=1, activation="sigmoid")

这是三个不同的激活函数的写法。

为什么我们一定要用到激活函数呢?

看一下,以下的推导,我们会发现无论是多少层的隐藏层和输出层,经过化简之后,我们得到的依旧是一个线性回归的式子,这样我们就可以只使用我们的线性回归就可以完成这个模型。所以在这里有一个共识就是不要在我们的隐藏层里使用我们的线性激活函数。

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

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

相关文章

【论文阅读】Segment Anything论文梳理

Abstract 我们介绍了Segment Anything(SA)项目:新的图像分割任务、模型和数据集。高效的数据循环采集,使我们建立了迄今为止最大的分割数据集,在1100万张图像中,共超过10亿个掩码。 该模型被设计和训练为可…

一文学会搭建 cli 脚手架工具

文章目录 设置工具命令package.json bin 字段注释:#!/usr/bin/env node设置环境变量 接收命令选项参数process 实现commander 命令行交互:inquirer下载项目模板:download-git-repo执行额外命令:自动安装依赖child_processexeca 体…

在Anaconda3的conda中创建虚拟环境下载opencv

opencv下载全流程 一、下载Anaconda 记得从官方网格站进行下载,会有一些慢 下载后进行配置 b站讲解视频(非本人(平台大神讲解)) 二、打开conda控制台 这里的两个都可以进行下载 通常我们受用anaconda prompt 三、…

pytorch CV入门3-预训练模型与迁移学习.md

专栏链接:https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑:2024/3/7;最后编辑:2024/3/8 参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

mysql主从复制(同步阿里云的RDS至自建数据库)

从库同步阿里云的RDS 阿里云默认开启了binglog,所以我们无需对主库进行配置 查询主库的server_id,从库配置不要重复就行 show variables like %server_id%;编辑从库的my.cnf文件 在文件中增加如下配置 server-id 123456789 …

【微信小程序】传参存储

目录 一、本地数据存储 wx.setStorage wx.setStorageSync 1.1、异步缓存 存取数据 1.2、同步缓存 存取数据 二、使用url跳转路径携带参数 2.1、 wx.redirectTo({}) 2.2、 wx.navigateTo({}) 2.3、 wx.switchTab({}) 2.4 、wx.reLaunch({}) 2.5、组件跳转 三、…

spring boot 2.4.x 之前版本(对应spring-cloud-openfeign 3.0.0之前版本)feign请求异常逻辑

目录 feign SynchronousMethodHandler 第一部分 第二部分 第三部分 spring-cloud-openfeign LoadBalancerFeignClient ribbon AbstractLoadBalancerAwareClient 在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 因为从 spring …

GPT-4 等大语言模型(LLM)如何彻底改变客户服务

GPT-4革命:如何用AI技术重新定义SEO策略 在当今快节奏的数字时代,客户服务不再局限于传统的电话线或电子邮件支持。 得益于人工智能 (AI) 和自然语言模型 (NLM)(例如 GPT-4)的进步,客户服务正在经历革命性的转变。 在这…

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据,对象地址不发生改变

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据,对象地址不发生改变 一、问题背景二、解决步骤2.1 debug2.2 原因分析2.2.1 数据步骤2.2.2 大模型解释2.2.3 解释举例2.2.4 关键函数 2.3 解决方案 三、Spring JPA一级缓存 一、问题背景 项目的数据…

在ubuntu上使用vscode+gcc-arm-none-eabi+openocd工具开发STM32

文章目录 所需工具安装调试搭建过程中遇到的问题 写在前面 老大上周让我用vscode开发STM32,我爽快的答应了,心想大学四年装了这么多环境了这不简简单单,更何况vscode这两年还用过,然而现实总是令人不快的——我竟然花了差不多两周…

Java SE入门及基础(29)

第三节 访问修饰符 1. 概念 访问修饰符就是控制访问权限的修饰符号 2. 类的访问修饰符 类的访问修饰符只有两种:public 修饰符和默认修饰符(不写修饰符就是默认) public 修饰符修饰类表示类可以公开访问。默认修饰符修饰类表示该类只能…

flutter逆向 ACTF native ap

言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道lib…

lvs集群中NAT模式

群集的含义 由多台主机构成,但对外表现为一个整体,只提供一个访问入口,相当于一台大型的计算机。 横向发展:放更多的服务器,有调度分配的问题。 垂直发展:升级单机的硬件设备,提高单个服务器自身功能。 …

论文阅读:Scalable Diffusion Models with Transformers

Scalable Diffusion Models with Transformers 论文链接 介绍 传统的扩散模型基于一个U-Net骨架,这篇文章提出了一种新的扩散模型结构,将U-Net替换为一个transformer,并将这种结构称为Diffusion Transformers (DiTs)。他们还发现&#xff…

Codesys.运动控制电子齿轮

文章目录 一. 电子齿轮概念应用 二. 电子齿轮耦合功能块 2.1. MC_GearIn 2.2. MC_GearInPos 2.3. MC_GearOut 三. 电子齿轮案例 3.1. 样例介绍 3.2. 引入虚轴 3.3. 程序框架 3.4. 程序编写 3.5. 程序监控 一. 电子齿轮概念应用 在很多应用场景中有多个牵引轴每个牵引…

.NET开源的两款第三方登录整合库

前言 我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权,来获取用户信息(如:微信登录、支付宝登录、QQ登录、GitHub登录等等)。今天大姚分享两款.NET开源的第三方登录整合库。 MrHuo.OAuth MrHuo.OAuth是.NET项目…

Tcp标志位 笔记240309

Tcp标志位 TCP(传输控制协议)的标志位是用于指示TCP报文段中特定控制信息的位字段。这些标志位存在于TCP报头中,用于控制TCP连接的建立、数据传输和终止等过程。以下是TCP标志位的详细说明: SYN(同步标志)…

Android应用界面

概述:由于学校原因,估计会考,曹某人就浅学一下。 目录 View概念 创建和使用布局文件 相对布局 线性布局 水平线性布局 垂直线性布局 表格布局 帧布局 扁平化布局 Android控件详解 AdapterView及其子类 View概念 安卓中的View是所…

设计模式-行为型设计模式-命令模式

命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。[DP] // 命令接口 interface Command {void execute(); }// 具体命…

隐私与创新的交汇点:Partisia Blockchain 重绘技术蓝图

正当我们在这个信息泛滥的时代寻找稳固的信任锚点时,区块链技术应运而生,然而,正如任何科技革命都会遇到的挑战,一个重要的问题摆在了我们面前:如何在不牺牲个人隐私的前提下,享受区块链技术带来的好处&…