从零开始的深度学习之旅(2)

news2024/12/23 23:03:25

目录

  • 深层神经网络
  • 1. 异或门问题
    • 1.1 异或代码实现
  • 2.神经网络的层
    • 2.1 去除激活函数的异或门
    • 2.2 使用sigmoid函数的异或门
  • 3.从0实现深度神经网络的正向传播

深层神经网络

1. 异或门问题

在第一篇的博客中,我们使用代码实现了与门

import torch
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
andgate = torch.tensor([0,0,0,1], dtype = torch.float32)
w = torch.tensor([-0.2,0.15,0.15], dtype = torch.float32)

def LogisticR(X,w):
zhat = torch.mv(X,w) 
sigma = torch.sigmoid(zhat) 
andhat = torch.tensor([int(x) for x in sigma >= 0.5], dtype = torch.float32)

return sigma, andhat

sigma, andhat = LogisticR(X,w)

    考虑到与门的数据只有两维,我们可以将数据可视化,其中,特征x1为横坐标,特征x2为纵坐标,紫色点代表了类别0,红色点代表类别1,绘制出来的图如下所示:
在这里插入图片描述
我们可以使用一条直线将紫色和红色的圆点分开,如下图所示:
在这里插入图片描述

    这条具有分类功能直线被我们称为“决策边界”。
 但并不是所有的图像都可以用直线来进行分类,如下图的异或门所示:

在这里插入图片描述
   上图没有任意一条直线可以将两类点完美分开,此时我们会需要类似如下的曲线来对数据进行划分.
在这里插入图片描述


**如何把决策边界从直线转换为曲线,就需要把单层神经网络变成多层**

在这里插入图片描述
    这是一个多层神经网络,除了输入层和输出层,还多了一层“中间层”。
 在这个网络中,数据从左侧的输入层进入,特征会分别进入NAND和OR两个中间层的神经元,分别获得NAND函数的结果和OR函数的结果,接着, yNAND和yOR 会继续被输入下一层的神经元AND,经过AND函数的处理,成为最终结果y.

1.1 异或代码实现

import torch
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
orgate = torch.tensor([0,1,1,1], dtype = torch.float32)

def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return andhat
    
def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def XOR(X):
	#输入值:
	input_1 = X
	#中间层:
	sigma_nand = NAND(input_1)
	sigma_or = OR(input_1)
	x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
	#输出层:
	input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
	y_and = AND(input_2)
	return y_and

2.神经网络的层

      在神经网络的隐藏层中,存在两个关键的元素,一个是加和函数,另一个是h(z)(激活函数) 。

    在人工神经网络的神经元上,根据一组输入 定义 该神经元的输出结果的函数,就是激活函数。激活函数一般都是非线性函数,它出现在神经网络中除了输入层以外的每层的每个神经元上.

  神经元有“多进单出”的性质,可以一次性输入多个信号,但是输出只能有一个,因此输入神经元的信息必须以某种方式进行整合,否则神经元就无法将信息传递下去,而最容易的整合方式就是加和。

  我们可以认为加和是神经元自带的性质,只要增加更多的层,就会有更多的加和。但是激活函数的存在却不是如此,假设隐藏层上没有激活函数的话,输出的结果都会是线性的

2.1 去除激活函数的异或门

import torch
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
orgate = torch.tensor([0,1,1,1], dtype = torch.float32)
def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    # yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return andhat
    
def NAND(X):
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
   # yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)
    return yhat

def XOR(X):
	#输入值:
	input_1 = X
	#中间层:
	sigma_nand = NAND(input_1)
	sigma_or = OR(input_1)
	x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
	#输出层:
	input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
	y_and = AND(input_2)
	return y_and
y_and=XOR(X)

输出结果:
在这里插入图片描述
    可见,神经网络的层数本身不是神经网络解决非线性问题的关键,隐藏层上的激活函数才是,如果 h(z)是线性函数,或不存在,那增加再多的层也没有用。

    如果换成sigmoid函数,神经网络同样会失效,可见,即便是使用了,也不一定能够解决曲线分类的问题。

    在不适合的非线性函数加持下神经网络的层数再多也无法起效。所以,真正能够让神经网络算法“活起来”的关键,是神经网络中的激活函数.

2.2 使用sigmoid函数的异或门

def OR(X):
    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    sigma = torch.sigmoid(zhat)
    return sigma

def AND(X):
    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    sigma = torch.sigmoid(zhat)
    return sigma
    
def NAND(X):
                       
    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)
    zhat = torch.mv(X,w)
    sigma = torch.sigmoid(zhat)
    return sigma

def XOR(X):
	#输入值:
	input_1 = X
	#中间层:
	sigma_nand = NAND(input_1)
	sigma_or = OR(input_1)
	x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)
	#输出层:
	input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)
	y_and = AND(input_2)
	return y_and

输出结果:
在这里插入图片描述

3.从0实现深度神经网络的正向传播

   假设我们有500条数据,20个特征,标签为3分类。我们现在要实现一个三层神经网络.
 这个神经网络的架构如下:第一层有13个神经元,第二层有8个神经元,第三层是输出层。其中,第一层的激活函数是relu,第二层是sigmoid。

import torch
import torch.nn as nn
from torch.nn import functional as F

torch.manual_seed(100)
X=torch.rand((500,20),dtype=torch.float32)
y=torch.randint(low=0,high=3,size=(500,1),dtype=torch.float32)

class Model(nn.Module):
    def __init__(self,in_features=10,out_features=2):
        super(Model,self).__init__()
        self.linear1=nn.Linear(in_features,13,bias=True)
        self.linear2=nn.Linear(13,8,bias=True)
        self.output = nn.Linear(8,out_features,bias=True)
    def forward(self,x):
        z1=self.linear1(x)
        sigma1=torch.relu(z1)
        z2=self.linear2(sigma1)
        sigma2=torch.sigmoid(z2)
        z3 = self.output(sigma2)
        sigma3=F.softmax(z3,dim=1)
        return sigma3
input_ = X.shape[1] #特征的数目
output_ = len(y.unique()) #分类的数目
torch.manual_seed(420)
net = Model(in_features=input_, out_features=output_)
net(X)

在这里插入图片描述

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

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

相关文章

通过实战总结的 使用GoFrame小技巧

文章目录gf gen dao设置参数可传可不传model作为结构体类型模型关联添加数据主程序如下:gomeGoods.MainImgs的定义:批量插入数据配置插件自动生成service总结一起学习有朋友问我能不能搞一个GoFrame技巧篇,让新手少踩坑的那种。今天他来了&am…

数据库-范式例题

目录 1、请简述满足1NF、2NF和3NF的基本条件。并完成下题:某信息一览表如下:其是否满足3NF,若不满足将其化为符合3NF的关系。 解:     1NF: 属性都是不可分割的数据项 2NF: 不存在部分函数依赖,存在传递函数依赖。 2NF: 不存在

算法复杂度分析中的渐近分析(基于输入大小)

为什么要进行性能分析? 有许多重要的事情需要注意,例如用户友好性、模块化、安全性、可维护性等。为什么要担心性能?答案很简单,只有当我们有性能时,我们才能拥有上述所有东西。因此,性能就像货币&#xf…

磷酸化多肽Asp-Arg-Val-Tyr(PO3H2)-Ile-His-Pro-Phe、129785-85-9

在血管平滑肌细胞中有多种作用,包括正常动脉的收缩,培养的细胞或病变血管的肥大或增生等。 编号: 200676 中文名称: 八肽DRV-pTyr-IHPF CAS号: 129785-85-9 单字母: H2N-DRV-pTyr-IHPF-OH 三字母: H2N-Asp-Arg-Val-Tyr(PO3H2)-Ile-His-Pro-Phe-COOH 氨基…

MySQL——进阶

第1章 存储引擎 1.1 MySQL体系结构 1.2 存储引擎介绍 定义:存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定…

msfconsole之制作windows木马并成功获取shell

msfconsole之制作windows木马并成功获取shell 一、工具简介     msfconsole 简称 msf 是一款常用的安全测试工具,包含了常见的漏洞利用模块和生成各种木马,其提供了一个一体化的集中控制台,通过msfconsole,你可以访问和使用所…

软考高级系统架构师_计算机组成与结构---备考笔记004

奇校验和海明码考的比较多,可以看到: 奇校验:比如有个11001 这个要进行校验,那么,需要在后面添加什么?注意,要添加0,因为奇校验,是奇数个1,这里已经有3个1了,所以后面要加0,变成110010 这样 然后我们再来看,如

01-SpringMVC项目构建

Overview 梳理了创建基于SpringMVC的项目创建流程和注意点,防止遗忘 1. 创建一个空项目 2. 添加新模块 3. 在pom文件中指定打包方式并刷新 4. 将模块目录结构改造成web项目 这里的web配置是你在pom文件中指定war的打包方式后就会出现的,当然没出现也可…

迅为3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心方案

1.全国产设计方案 从里到外 100% 全国产 从CPU自主指令系统到开发板每一个元器件,做到100%全国产化。 2.产品开发更快捷 PCIE 32路 相比同类嵌入式板卡仅2到4路的PCIE, 这款核心板可以支持多达32路的PCIE 3.0接口 3.工业化标准设计 遵循COM E…

数据库-mysql架构与sql执行原理(上)(一)

目录 一、一条查询的sql他是怎么样去执行的呢? 二、建立链接 同步 异步 三、连接方式 长链接 短链接 四、通信协议 Unix socket TCP/IP 共享内存 五、通信方式 单工 半双工 全双工 六、缓存 七、解析 八、预处理器 九、优化器 十、查询执行引擎…

ASEMI肖特基二极管MBR15200FAC参数,MBR15200FAC图片

编辑-Z ASEMI肖特基二极管MBR15200FAC参数: 型号:MBR15200FAC 最大重复峰值反向电压(VRRM):200V 最大RMS电桥输入电压(VRMS):140V 最大直流阻断电压(VDC&#xff09…

智慧零售解决方案-最新全套文件

智慧零售解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧零售全套最新解决方案合集一、建设背景 传统零售业发展趋势分析: (1)市场竞争日益激烈 零售业的发展一直是一个竞争性强的产业,这个市场的发…

数据结构之堆

堆: 堆是一颗完全二叉树,分为大根堆和小根堆两种。大根堆:根节点大于等于左右节点;小根堆:根节点小于等于左右节点。所以大根堆的根节点是最大值,小根堆的根节点是最小值。 c中priority_queue可以用来声明…

Axure原型创建折线、柱状等图形,引用echarts

1、在echarts网站选择对应的统计图形: 网址:Examples - Apache ECharts 2、对代码进行编辑,使其适配自己的业务。 3、在Axure中创建一个基本元件矩形。命名为:test 4、选择交互--载入时--打开连接--Fx 5、在插入变量中增加如下…

SVN windows安装及初步使用;及初次连接版本库、提交、还原、比对操作说明文档

派昂医药-SVN版本库说明总览&#xff1a; 1.说明 2.版本库地址 3.托管项目明细 4.SVN客户端安装 5.SVN-Win端版本操作 6.SVN客户端浏览 1.说明&#xff1a; <1、协议 SVN私有协议 <2、PC系统字符集要求 中文GBK编码&#xff1b;中文以外UTF-8编码&#xff0c;如乱码…

中国市场杂志社中国市场编辑部2022年第32期目录

前沿理论 新冠肺炎疫情下跨境冷链物流的新思考——以大连冷链业疫情为例 廖燕莲;谷玉红;尚书山; 1-3《中国市场》投稿&#xff1a;cnqikantg126.com 数字经济背景下数字服务税问题探析 李瑞玲; 4-6 我国工业能源效率提升的阻碍及其对策探究 韩洁平;田振东;张诗雅; …

DJ12-1 8086系列指令系统-2 数据传送指令

目录 1. 通用数据传送指令 &#xff08;1&#xff09;MOV 一般数据传送指令 &#xff08;2&#xff09;堆栈操作指令 &#xff08;3&#xff09;XCHG 交换指令 &#xff08;4&#xff09;XLAT 查表指令 &#xff08;5&#xff09;CBW 和 CWD 字位扩展指令 2. 输入输出指…

8点FFT实现全教程

个人认为编写8点FFT的编写,不要过分关注理论,重要的是理解整个流程。 参考文章: matlab 8点fft蝶形图,基2时抽8点FFT的matlab实现流程及FFT的内部机理_罗漫的博客-CSDN博客前言本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP…

【第五部分 | JS WebAPI】5:1W字详解Bom对象

目录 | Bom概述 | window 、Bom、Dom 的关系 | window的load事件&#xff1a;把JS写进head里 如何把 JS 代码写到head里&#xff08;页面加载事件 onload&#xff09; 比onload更高效的加载事件 DOMContentLoaded | window的resize事件&#xff08;窗口大小改变的时候触发…

vue移动端高德地图的使用及实现最简单的地图功能

目录 一、创建应用获取key 1、进入开放平台&#xff0c;按步骤注册成为开发者 2、 登录之后&#xff0c;点击头像&#xff0c;进入「应用管理」 页面「创建新应用」 3、 为应用添加 Key 二、配置 1、在public下的index.html中添加 2、 JSAPI key和安全密钥的使用 方式一…