深度学习_14_单层|多层感知机及代码实现

单层感知机:

在这里插入图片描述
功能:

能完成二分类问题

问题:

模型训练采用X*W + b训练出模型,对数据只进行了一层处理,也就是说训练出来的模型仅是个线性模型,它无法解决XOR问题,所以模型在训练效果上,识别的正确率会低一些

在这里插入图片描述
在这里插入图片描述
单层感知机是线性的,没办法用一条线分开上述两种类型

实现:

import torch
from torch import nn
from d2l import torch as d2l

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = nn.Parameter(torch.randn(
    num_inputs, num_outputs, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))

params = [W1, b1]


def net(X):
    X = X.reshape((-1, num_inputs))
    H = X@W1 + b1  # 这里“@”代表矩阵乘法
    return H # (H@W2 + b2)

loss = nn.CrossEntropyLoss() # 多类别分类问题的损失函数

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)

if __name__ == '__main__':
    num_epochs = 10
    cnt = 1
    for i in range(num_epochs):
        X, Y = d2l.train_epoch_ch3(net, train_iter, loss, updater)
        print("训练次数: " + str(cnt))
        cnt += 1
        print("训练损失: {:.4f}".format(X)) #训练损失是用训练数据集测得
        print("训练精度: {:.4f}".format(d2l.evaluate_accuracy(net, test_iter))) # 训练精度是用测试数据集测得
        print(".................................")

效果:

在这里插入图片描述

可以看出线性模型的识别损失和正确率还有待提升

多层感知机:

功能:

能利用隐藏层,实现非线性模型

在这里插入图片描述
主要利用激活函数,将上一层输出,转入下一层输入,以完成模型的去线性

在这里插入图片描述
在这里插入图片描述
激活函数必须用非线性,否则最后模型W1 * W2仍是一个线性模型

常用的激活函数:

在这里插入图片描述

激活函数不用做指数函数,所以会很快

实现:

import torch
from torch import nn
from d2l import torch as d2l

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) # 获取训练集,检测集

num_inputs, num_outputs, num_hiddens = 784, 10, 256 # 输入输出,隐藏层
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01) # 随机产生
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2]
def relu(X): # 激活函数
    a = torch.zeros_like(X)
    return torch.max(X, a)

def net(X):
    X = X.reshape((-1, num_inputs)) # 将28 * 28图片拉成一维度784
    H = relu(X @ W1 + b1)
    return (H @ W2 + b2)

loss = nn.CrossEntropyLoss()
num_ecophs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr = lr)

if __name__ == '__main__':
    num_epochs = 10
    cnt = 1
    for i in range(num_epochs):
        X, Y = d2l.train_epoch_ch3(net, train_iter, loss, updater)
        print("训练次数: " + str(cnt))
        cnt += 1
        print("训练损失: {:.4f}".format(X)) #训练损失是用训练数据集测得
        print("训练精度: {:.4f}".format(d2l.evaluate_accuracy(net, test_iter))) # 训练精度是用测试数据集测得
        print(".................................")


效果:

在这里插入图片描述
可以看出训练效果有略微提升

总结:

多层感知机,突破了单层感知机用线性模型去识别事物的瓶颈

为什么非线性模型要比非线性模型好:

非线性模型相对于线性模型的优势主要在于其更强大的表达能力和适应性:

能够处理更复杂的关系:
非线性模型能够表示更复杂的特征和模式,因为它们具有更灵活的函数形式。在现实世界的数据中,很多问题并不是简单的线性关系,而是包含了各种复杂的非线性关系。非线性模型可以更好地拟合这些非线性数据,并提供更准确的预测能力。

更好地适应复杂任务:
在面对复杂任务时,非线性模型能够更好地捕捉数据中的高阶特征和交互作用。例如,图像识别、语音识别、自然语言处理等领域常常需要处理复杂的数据结构,而这些数据结构往往包含了大量的非线性信息。非线性模型能够更好地理解这些数据并进行有效的建模。

更好地处理特征的组合效应:
非线性模型能够捕获特征之间的复杂组合效应。线性模型只能表示特征的线性组合,而非线性模型可以处理特征之间的乘积、平方、高次幂等非线性组合,从而更全面地考虑特征之间的关系。

虽然非线性模型在很多情况下具有更强大的建模能力,但也需要注意过拟合的问题。过于复杂的模型可能会在训练数据上表现得很好,但在未见过的数据上泛化能力可能较差。因此,在选择模型时需要平衡模型的复杂度和泛化能力。

多层感知机与softmax回归的区别:

softmax回归本质上对模型的线性输出进行了处理,将其转换成正太概率分布形式,便于交叉函数的预测,本质上其模型仍是线性模型

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

torch - 张量Tensor常见的形式

1.Scalar 通常就是一个数值 x tensor(42.) 输出x: 2.Vector 特征向量 例如:[-5., 2., 0.]在深度学习中通常表示特征,如词向量特征,某一维度特征等 3.Matrix 一般计算的都是矩阵,通常都是多维的。 可以做矩阵的…

MySQL优化的底层逻辑

文章目录 前言索引的底层结构数据与索引的关系聚簇索引的数据存储普通索引的数据存储 索引的命中逻辑怎么理解索引失效总结 前言 去年刚开始写博客的时候写了一篇《MySQL性能调优参考》,文章中提到优化的几个技巧,比如数据类型的使用、范式和反范式的合…

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点: 速度简单的设计对非线性开发模式的强力支持(允许成千上万个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数…

【C++学习手札】模拟实现vector

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:くちなしの言葉—みゆな 0:37━━━━━━️💟──────── 5:28 🔄 ◀️ ⏸ ▶️ ☰…

微信小程序Error: ENOENT: no such file

问题描述 当编译的时候 会提示找不到这个文件(index),但是确信项目目录里已经删除了该页面路径,并且app.json的pages列表中也 导致这个问题应该是:新添加了文件,后面删除了或者修改了文件名,导…

MySQL初始化报错。VCRUNTIME140_1.dll缺失

从自己电脑内搜索此dll,粘贴到服务器的以下位置即可。

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗

电路综合-基于简化实频的集总参数电路匹配3-将任意阻抗用集总参数匹配至归一化阻抗 前面的相关理论: 电路综合-基于简化实频的集总参数电路匹配1 电路综合-基于简化实频的集总参数电路匹配2-得出解析解并综合 理论这两个已经介绍过了,直接给出案例 代码…

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路,同时要求采用基础逻辑门实现,那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

Python---练习:编写一段Python代码,生成一个随机的4位验证码

案例:编写一段Python代码,生成一个随机的4位验证码 提前:定义一个字符串 str1 "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" 编写Python代码: ① 思考:如果只生成4个字符的验证码&…

黑五来袭,如何利用海外代理进行助力

黑五作为下半年年度尤为重要的一个节日,是各大商家的必争之地,那么海外代理是如何帮助跨境商家做好店铺管理和营销呢? 为什么跨境人都关注海外代理,下面我们来进行介绍。 一、什么是海外代理 海外代理就是我们所说的&#xff1…

锂离子电池充电的系统抖动问题解决方案

前言 在设计锂离子电池充电器时,会因为充电电流波动导致电压波动,系统异常。 所以分析了锂离子电池的特性,给出了几种解决方法。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714qq.com 理论 锂电池简单地可看做一…

VBA_MF系列技术资料1-222

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

【算法每日一练]-图论(保姆级教程 篇4(遍历))#传送门 #负环判断 #灾后重建

今天继续 目录 题目:传送门 思路: 题目:负环判断 思路: 题目:灾后重建 思路: 题目:传送 门 思路: 先跑一边floyd,然后依次加入每个传送门,O(n^5)不行…

本地jar导入maven

一、通过dependency引入 1.1. jar包放置&#xff0c;建造lib目录 1.2. pom.xml文件 <dependency><groupId>zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version><!--system&#xff0c;类似provided&#x…

ImportError: DLL load failed while importing _iterative: %1 不是有效的 Win32 应用程序。

问题&#xff1a;这个错误是由于导入的模块 _iterative 找不到有效的 Win32 应用程序导致的。可能是由于你的环境中缺少了某个依赖库或者是版本不匹配的问题。 解决方法&#xff1a; 可以尝试以下几种&#xff1a; 确保你的环境中已经安装了所有需要的依赖库&#xff0c;并且…

ChatGPT暂时停止开通puls,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止puls的注…

C#学习相关系列之Linq用法---where和select用法(二)

一、select用法 Linq中的select可以便捷使我们的对List中的每一项进行操作&#xff0c;生成新的列表。 var ttlist.select(p>p10); //select括号内为List中的每一项&#xff0c;p10即为对每一项的操作&#xff0c;即对每项都加10生成新的List 用法实例&#xff1a; 1、la…

机器学习中的独立和同分布 (IID):假设和影响

一、介绍 在机器学习中&#xff0c;独立和同分布 &#xff08;IID&#xff09; 的概念在数据分析、模型训练和评估的各个方面都起着至关重要的作用。IID 假设是确保许多机器学习算法和统计技术的可靠性和有效性的基础。本文探讨了 IID 在机器学习中的重要性、其假设及其对模型开…

Linux输入设备应用编程(触摸屏获取坐标信息)

上一章学习了开发板外接键盘并获取键盘的的输入 Linux输入设备应用编程&#xff08;键盘&#xff0c;按键&#xff09;-CSDN博客 本章编写触摸屏应用程序&#xff0c;获取触摸屏的坐标信息并将其打印出来 一 触摸屏数据分析&#xff08;触摸&#xff0c;点击&#xff0c;松开…