前言

接续上一篇的optimizer的学习。

optimizer

代码和上一篇文章的一样,如下:

import torch
import numpy as np
import torch.nn as nn X = torch.tensor([1, 2, 3, 4], dtype=torch.float32)
Y = torch.tensor([2, 4, 6, 8], dtype=torch.float32)
w2 = torch.tensor(0.0, requires_grad=True) def forward(_x):
return w2* _x learning_rate = 0.01
n_iter = 100 # 循环次数
loss =nn.MSELoss()
optimizer =torch.optim.SGD([w2],lr=learning_rate) for epoch in range(n_iter):
y_pred = forward(X)#
l = loss(Y, y_pred)
l.backward() #执行完反向传播后,w2里就已经有w2.grad了
optimizer.step() #optimizer初始化时就接收了w2,现在w2有了grad,就可以执行step进行优化了,优化时会使用w2的梯度grad属性和学习率learning_rate
optimizer.zero_grad() #梯度清零 if epoch % 1 == 0:
print(f'epoch {epoch+1}:w2= {w2:.3f} ,loss = {l:.8f}')
print(f'f(5)={forward(5):.3f}')

可以看到,我们这里引用增加了一个import torch.nn as nn。

这里只是简单的使用了nn.MSELoss(),我们就不用手写这个计算平均值的步骤了。

然后我们定义了一个optimizer,接收了两个参数,一个是权重w2,一个是学习率learning_rate。

这里我们的传递的是一个Tensors数组,而不是w2。

上篇文章已经介绍的w是根据梯度x.grad生成的,所以,按理应该是一个跟x同类型的矩阵,这里[w2]跟x不同型,但这里他只是一个数,这是因为计算时,会自动把这种一个数的矩阵变形为跟x同型的矩阵。

正确的写法应该是下面这样。

import torch
import numpy as np
import torch.nn as nn X = torch.tensor([1, 2, 3, 4], dtype=torch.float32)
Y = torch.tensor([2, 4, 6, 8], dtype=torch.float32)
w2 = torch.tensor([0.0,0.0,0.0,0.0], requires_grad=True)
def forward(_x):
return w2* _x #如果w2不是1个元素或者4个元素,这里就无法相乘
learning_rate = 0.01
n_iter = 100 # 循环次数
loss =nn.MSELoss()
optimizer =torch.optim.SGD([w2],lr=learning_rate)
for epoch in range(n_iter):
y_pred = forward(X)#
l = loss(Y, y_pred)
l.backward()
optimizer.step()
optimizer.zero_grad()
if epoch % 1 == 0:
print(f'epoch {epoch+1}:w21= {w2[0]:.3f} w22= {w2[1]:.3f} ,loss = {l:.8f}')

计算逻辑重述

回忆一下前面将的青蛙例子,我们重新叙述一下这个计算逻辑,首先我们有个y,这个是我们的目标,然后有个x,这个是我们的输入数据。然后通过w和b这俩参数,结合公式y=wx+b,一次一次的尝试求出w和b,然后通过求出的w和b修正x,然后我们得到了一个新的矩阵——修正x;我们令y_predict=x修正矩阵,就形成了x通过变化得到了预测y,即y_predict。然后我们就可以比较y和y_predict了。

torch.nn简介

torch.nn 是 PyTorch 的一个核心模块,专门用于构建和训练神经网络。这个模块提供了各种类和函数,使你可以方便地定义神经网络模型、实现前向传播和反向传播、定义损失函数,以及进行参数优化等任务。

Linear

torch.nn.Linear的概念是PyTorch 中用于实现线性变换(全连接层)的模块。这里我们先无视他的定义。

先看几个变量的含义。

X.shape:返回的是一个 torch.Size 对象 形状信息分别是 行数(样本数)和列数(特征数),这里特别注意样本和特征这俩词,这是俩干扰我们学习非常狠的名词。

nn.Linear(input_size, output_size):这是实例化Linear,入参是俩数,分别叫做input_size, output_size,这俩参数的含义如下。

反人类的定义

input_size:是输入特征的数量,也就是每个输入样本的维度。

output_size:是输出特征的数量,也就是模型希望输出的特征维度。

正常定义

input_size:表示输入数据 X 的列数。

output_size:表示模型预测输出 y_predict 的列数。

注:这里要把反人类的定义多看几遍,因为,如果你学习人工智能,你会在各种视频和文章中看到别人用反人类定义来描述操作与问题。

这里,我们可以稍微思考一下,就可以根据input_size和output_size的分别传入推测出一个结论,那就是我们可以输入3 * 3的矩阵x,然后利用torch.nn这个库,输出成4 * 4的矩阵,然后再和4 * 4矩阵y比较。

不过Linear的话,要求输入和输出矩阵的维度必须匹配,所以,这里我们是不用这么做的,不过稍微联想一下即可得出结论,多层神经网络或其他层(如卷积层)肯定可以做这样复杂的映射。

Linear使用代码如下:

import torch
import numpy as np
import torch.nn as nn X = torch.tensor([[1], [2], [3], [4]], dtype=torch.float32)
Y = torch.tensor([[2], [4], [6], [8]], dtype=torch.float32) n_samples, n_features = X.shape # x是4行1列矩阵,这里返回4和1
print("n_samples", n_samples, "n_features", n_features)
input_size = n_features
output_size = n_features
model = nn.Linear(input_size, output_size) learning_rate = 0.01
n_iter = 100 # 循环次数
loss = nn.MSELoss()
[w, b]= model.parameters()
optimizer = torch.optim.SGD([w, b], lr=learning_rate) for epoch in range(n_iter):
y_pred = model(X) # 这里的 model(X) 调用的是 model 的 forward 方法
l = loss(Y, y_pred)
l.backward()
optimizer.step()
optimizer.zero_grad()
if epoch % 1 == 0:
[w, b] = model.parameters()
print(f'epoch {epoch+1}:w2= {w[0][0].item():.3f} ,loss = {l:.8f}')

如上代码,我们使用model = nn.Linear(input_size, output_size)定义了一个线性模型对象。

然后使用 torch.optim.SGD时,传入了model.parameters()的返回值。

model.parameters()的返回值就是w和b。model.parameters()在被调用后,会在内部创建一个w和一个b。

权重矩阵 w:形状为 [output_size, input_size]。

偏置向量 b:形状为 [output_size]。

然后我们使用model(x)调用这个实例,这里Linear类里应该是实现了__call__方法,所以类的实例可以像函数一样被调用。

这里我们传递了x,有了x它就可以前向传播了,即,model(x)里我们传递了x,同时触发了前向传播。

所以,model(x)的返回值是一个预测的y值。

然后我们使用我们通过nn.MSELoss()定义的[标量函数/损失函数]来进行计算标量。

然后这个标量就可以使用反向传播了。

然后,我们就得到了模型参数w和b的值了。

nn.Module简介

nn.Module 是 PyTorch 中所有神经网络模块的基类。所有的神经网络层(如线性层、卷积层、LSTM 等)都继承自这个类。

通过继承 nn.Module,可以定义自己的网络层或模型,并利用 PyTorch 的自动微分功能来进行训练。

nn.Linear 是 nn.Module 的子类,是一个特定的神经网络层类,继承自 nn.Module。它实现了一个最简单的线性变换层,也叫全连接层。

通过继承 nn.Module,nn.Linear 能够利用 nn.Module 提供的所有功能,比如注册参数、前向传播、保存和加载模型等。

结构如下:

# nn.Module
# |
# |-- nn.Linear
# |-- nn.Conv2d
# |-- nn.RNN
# |-- (Other Modules)

下面自定义一个类,继承Module实现Linear的代码:

X = torch.tensor([[1], [2], [3], [4]], dtype=torch.float32)  # 4行1列矩阵
Y = torch.tensor([[2], [4], [6], [8]], dtype=torch.float32) n_samples, n_features = X.shape
print("n_samples", n_samples, "n_features", n_features)
input_size = n_features
output_size = n_features # model = nn.Linear(input_size, output_size)
class LinearRegression(nn.Module):
def __init__(self, input_dim, output_dim):
super(LinearRegression,self).__init__()
# define layers
self.lin = nn.Linear(input_dim, output_dim)
def forward(self, x):return self.lin(x)
model =LinearRegression(input_size, output_size) learning_rate = 0.01
n_iter = 100 # 循环次数
loss = nn.MSELoss()
[w, b]= model.parameters() optimizer = torch.optim.SGD([w, b], lr=learning_rate) for epoch in range(n_iter):
y_pred = model(X)
l = loss(Y, y_pred)
l.backward()
optimizer.step()
optimizer.zero_grad() # 梯度清零 if epoch % 1 == 0:
[w, b] = model.parameters()
print(f'epoch {epoch+1}:w2= {w[0][0].item():.3f} ,loss = {l:.8f}')

传送门:

零基础学习人工智能—Python—Pytorch学习(一)

零基础学习人工智能—Python—Pytorch学习(二)

零基础学习人工智能—Python—Pytorch学习(三)

零基础学习人工智能—Python—Pytorch学习(四)

学习就先到这。


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18354543

零基础学习人工智能—Python—Pytorch学习(四)的更多相关文章

  1. 如何零基础开始自学Python编程

    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一 ...

  2. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  3. 零基础的人该怎么学习JAVA

    对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是  因为这样或那样的问题让你犹豫不决,阻碍你前进的 ...

  4. 零基础学完Python的7大就业方向,哪个赚钱多?

    “ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...

  5. 零基础如何入门Python

    编程零基础如何学习Python 如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python.虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的. ...

  6. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  7. 零基础如何学Python爬虫技术?

    在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...

  8. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  9. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  10. 零基础如何使用python处理字符串?

    摘要:Python的普遍使用场景是自动化测试.爬取网页数据.科学分析之类,这其中都涉及到了对数据的处理,而数据的表现形式很多,今天我们来讲讲字符串的操作.   字符串是作为任意一门编程语言的基础,在P ...

随机推荐

  1. 博客更换新域名为52ecy.cn

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 博客更换新域名为52ecy.cn 日期:2017-10-2 ...

  2. 记录一次BoxedApp Packer脱壳解包的记录

    收到朋友的一个求助,一个硬件配套的上位机软件,无法联系到供应商,没有授权,在新电脑安装后无法使用. 简单的记录下过程 首先打开发过来的软件的目录下,一个配置工具,从图片可以判断,是.net winfo ...

  3. 数据标注工具 doccano

    目录 安装 运行 doccano 使用 doccanno 上传数据 定义标签 添加成员 开始标注 导出数据 查看数据 统计 数据标注工具 Label-Studio 安装 打开命令行(cmd.termi ...

  4. Flink状态(二)

    Flink提供了不同的状态存储方式,并说明了状态如何存和存储在哪里. 状态可以被存储在Jvm的堆和堆外.根据状态存储方式的不同,Flink也能代替应用管理状态,意思是Flink能够进行内存管理(有必要 ...

  5. 解读MySQL 8.0数据字典的初始化与启动

    本文分享自华为云社区<MySQL全文索引源码剖析之Insert语句执行过程>,作者:GaussDB 数据库. 本文主要介绍MySQL 8.0数据字典的基本概念和数据字典的初始化与启动加载的 ...

  6. 采集modbus设备数据转wincc项目案例

    1         文档说明 1.   网关设置采集Modbus设备数据 2.   把采集的数据转成profinet协议转发给wincc. 2         VFBOX网关工作原理 VFBOX网关是 ...

  7. cv2 判断图片是冷还是暖

    把图片的颜色空间转为HSV H表示色调(下图横轴), 图片的平均H值可用于区分冷暖

  8. SQLCel匹配原数据信息,更新原数据所有信息并插入新数据的过程

    使用SQLCel高效率(速度快,数据完整)的解决了我领导提的问题 "如何更新数据库中原有的数据并插入新的订单数据" 过程如下: 思路:使用字段匹配和修改字段即可解决问题,用时3分钟 ...

  9. Java常见问题-汇总

    一.面试到底在问些什么东西? 首先你要知道,面试官的提问和你简历上写的内容是紧密联系的,所以你简历上写的技能一定要会. 一般面试包括下面几方面知识类型: Java基础.多线程.IO与NIO.虚拟机.设 ...

  10. 自学Java第二周

    本周学习 一.Java能干些什么? 1.共三个版本:Java SE.Java EE.Java ME Java SE:Java语言的(标准版),用于桌面应用开发,是其他两个版本的基础. Java ME: ...