Pytorch学习笔记day3——用神经网络学习一组函数

news2024/11/14 15:23:22

好的,我们开始吧。首先第一个问题,神经网络的本质是什么?是古典主义的人类的神经元吗?绝对不是,他只是一个优化函数
y = f θ ( x ) y = f_{\theta}(x) y=fθ(x)
这和小学学到的线性函数拟合并无本质区别。只是其中参数 θ \theta θ是大量的参数,并且函数 f θ f_{\theta} fθ本身的形式也会非常复杂。相应的参数 θ \theta θ也无法像线性拟合一样,直接列方程求解,而是依赖于优化算法。

所以今天,我们就尝试用神经网络,去学习几个函数表达式。

训练代码解读

不多说了直接贴代码

import numpy as np
import math
import matplotlib.pyplot as plt

import torch
import torch.nn as nn
import torch.optim as optim

class Net(nn.Module):
    def __init__(self, num_layers, input_size, hidden_size, output_size):
        super(Net, self).__init__()
        self.layers = nn.ModuleList([nn.Linear(input_size, hidden_size, bias=True)] + 
                                    [nn.Linear(hidden_size, hidden_size, bias=True) for _ in range(num_layers - 2)] + 
                                    [nn.Linear(hidden_size, output_size, bias=True)])
        
    def forward(self, x):
        for layer in self.layers:
            x = nn.functional.gelu(layer(x))
        return x

if __name__=="__main__":
    # 被训练函数---------------------------
    x = np.linspace(0.1, 2.1, 100)
    y = [[math.exp(ele)*ele, math.exp(ele), ele*ele] for ele in x]
    
    plt.plot(x, y)
    plt.show()

    # 训练部分------------------------
    # 生成被训练数据------------------------
    x = torch.Tensor(x.reshape(-1,1))
    y = torch.Tensor(y)
    
    # 初始化网络
    net = Net(6, 1, 32, 3)
 
    # 定义损失函数和优化器
    loss_fn = nn.MSELoss(reduction='sum')
    optimizer = optim.Adam(net.parameters(), lr=0.01)
 
    # 训练模型
    epochs = 1000
    for epoch in range(epochs):
        y_pred = net(x)
        loss = loss_fn(y_pred, y)
        
        optimizer.zero_grad() #梯度清零,否则梯度会累积
        loss.backward()       #计算参数关于loss函数的梯度,需要做梯度会穿
        optimizer.step()      #利用梯度对model参数进行一次训练
        
        if epoch % 10 == 0:
            print('epoch: ', epoch, "    loss: ", loss.item())
        if epoch % 100 == 0:
            plt.clf()
            plt.plot(x, y,'b-',x, y_pred.detach().numpy(),'r-')
            plt.show()

这里多说一句撒,关于训练的写法,我觉得mindspore设计得是比pytorch要好的。optimizer.zero_grad()这种事情,mindspore就不需要做,不如说正常人前一次梯度都不会保留吧,默认不保留才是合理的吧。第二个是,获取梯度的grad,loss.backward应该显式的写出来,然后传进优化器的一次训练步才更加符合直觉,比如像下面这样

grad = loss.backward()       #梯度回传获取grad
optimizer.step(grad)      #利用梯度对net的参数进行一次训练
# 上述两行纯属个人yy,不能运行的哈

训练结果如下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到300左右就已经收敛得比较好了。

神经网络的局限性与正则化的重要性

简单粗暴的将被学习的函数第一个分量减去10

    x = np.linspace(0.1, 2.1, 100)
    y = [[math.exp(ele)*ele - 10, math.exp(ele), ele*ele] for ele in x]

突然就不能学了
在这里插入图片描述
这其实是因为,我们使用的激活函数,为gelu函数。嗯差不多长下面这样,这种激活函数是没法表示负值的。导致整个神经网络没法表示负数。
在这里插入图片描述
所以说神经网络也不完全是魔法,而是一个优化问题。我们需要先找到能以较少参数就表示被优化函数的网络,然后再对这个网络里面的参数进行优化,才能得到合理的结果。对当前情况,我们选一个,能表示较大负数的激活函数,例如:呃?!我震惊的发现好像没有类似这样的激活函数,AI训练的问题大多数都是非负的。

好吧,所以神经网络要学习的问题,我们一定要做合适的正则化或者归一化,让我们的网络能够表示当前的问题才行。

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

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

相关文章

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

Net8 Spire最新版去水印,去页数限制,转word/pptx/ofd等

新建控制台程序,添加Spire.pdf,最新版本为2024年7月17日 try {Spire.Pdf.PdfDocument pdf new Spire.Pdf.PdfDocument();pdf.LoadFromFile("test.pdf");pdf.SaveToFile("newpdf.pdf");pdf.SaveToFile("newppx.pptx", Spi…

20分钟迁移完阿里云ECS跨区域迁移,用老操作系统作为新服务操作系统

由于特殊原因或者数据备份需要迁移ecs服务器 跨区域复制 镜像复制 由于特殊原因或者数据备份需要迁移ecs服务器 1.老服务快照 选择ecs实例,点开实例 进入云盘 https://ecs.console.aliyun.com/disk 在云盘上点击建立快照 https://oss.console.aliyun.com/bu…

PyTorch 深度学习实践-循环神经网络基础篇

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记基于RNNCell实现总代码 基于RNN实现总代码 含嵌入层的RNN网络嵌入层的作用含嵌入层的RNN网络架构总代码 其他RNN扩展基本注意力机制自注意力机制(Self-Attention)自注意力计算多头注意力机制&#xf…

纯前端小游戏,4096小游戏,有音效,Html5,可学习使用

// 游戏开始运行create: function(){this.fieldArray [];this.fieldGroup this.add.group();this.score 0;//4096 增加得分this.bestScore localStorage.getItem(gameOptions.localStorageName) null ? 0 : localStorage.getItem(gameOptions.localStorageName);for(var …

vscode通过ssh链接远程服务器上的docker

目录 1 编译docker image1.1 编译镜像1.2 启动镜像 2 在docker container中启动ssh服务2.1 确认是否安装ssh server2.2 修改配置文件2.3 启动ssh服务 3 生成ssh key4 添加ssh公钥到docker container中5 vscode安装插件Remote - SSH6 在vscode中配置 1 编译docker image 一般来…

uni-app开发日志:unicloud使用时遇到的问题解决汇总(不断补充)

插件安装后提示与原数据库表冲突(2024.7.18) 安装uni-admin后再安装uni-cms,在uni-admin中添加好菜单,结果提示该错误 回到hbuilder中uniCloud/database中找到冲突的部分 比较一下,选中老的删除 opendb-news-articl…

第122天:内网安全-域信息收集应用网络凭据CS 插件AdfindBloodHound

目录 前置知识 背景和思路 判断是否在域内 案例一:架构信息类收集-网络&用户&域控等 案例二:自动化工具探针-插件&Adfind&BloodHound Adfind(域信息收集工具) ​BloodHound(自动化域渗透工具) 前置知识 本…

【Git标签管理】理解标签 | 创建标签 | 查看标签 | 删除标签 | 推送标签

目录 1.理解标签 2.创建标签 3.查看标签 4.删除本地仓库的标签 5.推送标签 6.删除远程仓库的标签 1.理解标签 Git提供一个打标签的功能tag,对某一次事务/提交的表示(作用/意义)。标签 tag ,可以简单的理解为是对某次 comm…

【Git】(基础篇四)—— GitHub使用

GitHub使用 经过上一篇的文章,相信大家已经对git的基本操作熟悉了,但哪些使用git的方法只是在本地仓库进行,本文介绍如何使用git和远程仓库进行连接使用。 Github和Gitee 主要用到的两个远程仓库在线平台是github和gitee GitHub GitHub …

Postman导出excel文件

0 写在前面 在我们后端写接口的时候,前端页面还没有出来,我们就得先接口测试,在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…

node解析Excel中的考试题并实现在线做题功能

1、背景 最近公司安排业务技能考试,下发excel文件的题库,在excel里查看并不是很方便,就想着像学习驾考题目一样,一边看一边做,做完之后可以查看正确答案。 2、开始分析需求 题目格式如下图 需求比较简单,…

JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-Transformer-LSTM多变量回归预测,粒子群优化Transformer结合LST…

浅聊 Three.js 屏幕空间反射SSR-SSRShader

浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…

新文件覆盖旧文件还能复原吗?八大excel文档修复软件免费

新文件覆盖旧文件还能复原吗&#xff1f;文件操作失误&#xff0c;尤其是新文件意外覆盖旧文件的情况时有发生&#xff0c;面对文件被覆盖的情况&#xff0c;我们不仅需要冷静应对&#xff0c;更需要掌握一系列有效的恢复策略。本文将深入探讨八种免费方法&#xff0c;旨在帮助…

JavaWeb笔记_Response对象

一.Response对象 1.1 Response对象概述 a.专门负责给浏览器响应信息&#xff08;响应行&#xff0c;响应头&#xff0c;响应体&#xff09;的对象 b.我们主要使用的是跟HTTP协议相关的Response对象&#xff1a;HTTPServletResponse&#xff0c;继承了ServletResponse&#x…

谷粒商城-商品上架

1.sku在es中的存储模型分析(spring整和es) es中所有数据存在内存中,内存产品贵,能节省就节省,只保存有用的信息 两种保存方法:(空间换时间,时间换空间): 我们选空间换时间 ES中放这些东西: "mappings": { "properties": { "skuId"…

ClickHouse 入门(二)【基础SQL操作】

1、ClickHouse 1.1、SQL 操作 这里只介绍一些和我们之前 MySQL 不同的语法&#xff1b; 1.1.1、Update 和 Delete ClickHouse 提供了 Delete 和 Update 的能力&#xff0c;这类操作被称为 Mutation 查询&#xff08;可变查询&#xff09;&#xff0c;它可以看 做 Alter 的一…

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…

2024-07-18 Unity插件 Odin Inspector8 —— Type Specific Attributes

文章目录 1 说明2 特定类型特性2.1 AssetList2.2 AssetSelector2.3 ChildGameObjectsOnly2.4 ColorPalette2.5 DisplayAsString2.6 EnumPaging2.7 EnumToggleButtons2.8 FilePath2.9 FolderPath2.10 HideInInlineEditors2.11 HideInTables2.12 HideMonoScript2.13 HideReferenc…