PyTorch基础部分——毕设进行时

news2024/11/17 10:05:36
为了完成毕设准备开始学习PyTorch,第一步到蓝桥云课搜索实验项目,找到了“PyTorch入门与实战(第二版)”,开始边实验边学习(本身有了一点点点点的相关基础了)

学习传送门:PyTorch基础入门
Tensor 支持的所有操作:传送门——PyTorch官方网站

目录

  • 1. 基础知识
    • 1.1 特点
    • 1.2 张量(Tensor)
  • 2. PyTorch的使用
    • 2.1
    • 2.2 基本 Tensor 运算
      • 加法
      • Tensor 与 numpy.ndarray 之间的转换
        • 区别
    • 2.3 自动微分(Autograd)变量的练习
      • 2.3.1 基础概念
      • 例一
      • 例2 “深度”计算图
    • 2.4 利用PyTorch实现简单的线性回归算法
      • 2.4.1 准备数据
      • 2.4.2 构造模型 计算损失函数
      • 2.4.3 测试模型

1. 基础知识

Pytorch 是由 Facebook 支持的一套深度学习开源框架
Tensor(张量)是 PyTorch 的基础数据结构,自动微分运算是深度学习的核心。

1.1 特点

完全开源:意味着你可以轻易获取它的代码,并按照自己的需求对它进行修改。
代码简洁:使用 PyTorch 框架编写出的神经网络模型的代码非常简洁。

1.2 张量(Tensor)

张量(Tensor),它实际上是一种 N 维数组。
在这里插入图片描述
我们可以使用 Tensor.size() 方法获得一个张量的“尺寸”。
在这里注意“尺寸”和维度是两个概念。
就比如对于上图中的 1 阶张量,它的维度为 1,尺寸为 8;
对于上图中的 2 阶张量,它的维度为 2,尺寸为(8,6)。

2. PyTorch的使用

2.1

import torch  #导入torch包
print()   #输出
torch.__version__    #返回PyTorch的版本号
x = torch.zeros(5, 3)  #产生一个5*3的tensor,取值全零
x = torch.ones(5, 3)  #产生一个5*3的tensor,取值全1
x = torch.rand(5, 3)  #产生一个5*3的tensor,随机取值
x  #显示x的值
#输出
#tensor([[0.9817, 0.7694, 0.0797],
#       [0.5797, 0.4102, 0.2647],
#       [0.4080, 0.8279, 0.4324],
#       [0.2985, 0.5336, 0.2487],
#       [0.3479, 0.1069, 0.6264]])

2.2 基本 Tensor 运算

Tensor 支持的所有操作:传送门——PyTorch官方网站

加法

相加前,必须保证两个张量的尺寸相同。n* m+n*m

z = x + y #两个tensor可以直接相加
z
y.t() #y矩阵转置
y.transpose(0, 1) #y矩阵转置
q = x.mm(y.t()) #x乘以y的转置

Tensor 与 numpy.ndarray 之间的转换

import numpy as np #导入numpy包
a = np.ones([5, 3]) #建立一个5*3全是1的二维数组(矩阵)
b = torch.from_numpy(a) #利用from_numpy将其转换为tensor
b

c = torch.FloatTensor(a)  #转换 Tensor 的方法,类型为 FloatTensor。
d = torch.LongTensor(a)  # 还可以是LongTensor,整型数据类型

b.numpy()   #tensor 转化为 numpy 的多维数组
输出:
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

区别

(我也搞不懂这个GPU啥意思,就写在这里存着,万一用到了就能直接找到)

Tensor 和 Numpy 的最大区别在于 Tensor 可以在 GPU 上进行运算。
默认情况下,Tensor 是在 CPU 上进行运算的,
如果我们需要一个 Tensor 在 GPU 上的实例,需要运行这个 Tensor 的 .cuda() 方法。
在下面的代码中,首先判断在本机上是否有 GPU 环境可用(有 NVIDIA的 GPU,并安装了驱动)。
如果有 GPU 环境可用,那么再去获得张量 x,y 的 GPU 实例。
注意在最后打印 x 和 y 这两个 GPU 张量的和的时候,我们调用了 .cpu() 方法,
意思是将 GPU 张量转化为 CPU 张量,否则系统会报错。

if torch.cuda.is_available():  #检测本机器上有无GPU可用
    x = x.cuda() #返回x的GPU上运算的版本
    y = y.cuda()
    z = x + y
print(z.cpu()) # 打印时注意要把GPU变量转化为CPU变量。
输出:
tensor([[1.9817, 1.7694, 1.0797],
        [1.5797, 1.4102, 1.2647],
        [1.4080, 1.8279, 1.4324],
        [1.2985, 1.5336, 1.2487],
        [1.3479, 1.1069, 1.6264]])

2.3 自动微分(Autograd)变量的练习

如果大家觉得去理解这个计算图的叶子结点很困难,这也没有关系。因为我们研究的主题是深度学习,PyTorch 框架会自动搭建好计算图的。

2.3.1 基础概念

动态运算图(Dynamic Computation Graph)是 PyTorch 的最主要特性,
它可以让我们的计算模型更灵活、复杂,并可以让反向传播算法随时进行。
注:只有叶子节点,才有有梯度信息
在这里插入图片描述

例一

#导入自动梯度的运算包,主要用Variable这个类
from torch.autograd import Variable  

#创建一个Variable,包裹了一个2*2张量,将需要计算梯度属性置为True

x = Variable(torch.ones(2, 2), requires_grad=True)  
x   #输出:tensor([[1., 1.],
    #             [1., 1.]], requires_grad=True)
     
y = x + 2  #可以按照Tensor的方式进行计算
y.grad_fn  #每个Variable都有一个creator(创造者节点)
           #输出:<AddBackward0 at 0x7f825c429810>

z = torch.mean(y * y)  #也可以进行复合运算,比如求均值mean
z.data #.data属性可以返回z所包裹的tensor
       #输出:tensor(9.)

在这里插入图片描述
backward 可以实施反向传播算法,并计算所有计算图上叶子节点(没有子节点)的导数(梯度)信息。

z.backward() #梯度反向传播
print(z.grad) # z不是叶子节点,无梯度信息
print(y.grad) # y不是叶子节点,无梯度信息
print(x.grad)  # x是叶子节点
输出:
None
None
tensor([[3., 3.],
        [3., 3.]])

例2 “深度”计算图

在这里插入图片描述
让矩阵 x 反复作用在向量 s 上,系统会自动记录中间的依赖关系和长路径。

s = Variable(torch.FloatTensor([[0.01, 0.02]]), requires_grad = True) #创建一个1*2的Variable(1维向量)
x = Variable(torch.ones(2, 2), requires_grad = True) #创建一个2*2的矩阵型Variable
for i in range(10):
    s = s.mm(x)  #反复用s乘以x(矩阵乘法),注意s始终是1*2的Variable
z = torch.mean(s) #对s中的各个元素求均值,得到一个1*1的scalar(标量,即1*1张量)

z.backward() #在具有很长的依赖路径的计算图上用反向传播算法计算叶节点的梯度
print(x.grad)  #x作为叶节点可以获得这部分梯度信息
print(s.grad)  #s不是叶节点,没有梯度信息
输出:
tensor([[37.1200, 37.1200],
        [39.6800, 39.6800]])
None

2.4 利用PyTorch实现简单的线性回归算法

2.4.1 准备数据

import matplotlib.pyplot as plt #导入画图的程序包
%matplotlib inline

# linspace可以生成0-100之间的均匀的100个数字
x = Variable(torch.linspace(0, 100).type(torch.FloatTensor)) 

# 随机生成100个满足标准正态分布的随机数,均值为0,方差为1.
# 将这个数字乘以10,标准方差变为10
rand = Variable(torch.randn(100)) * 10 

# 将x和rand相加,得到伪造的标签数据y。
# 所以(x,y)应能近似地落在y=x这条直线上
y = x + rand 

plt.figure(figsize=(10,8)) #设定绘制窗口大小为10*8 inch
# 绘制数据,考虑到x和y都是Variable,
# 需要用data获取它们包裹的Tensor,并专成numpy
plt.plot(x.data.numpy(), y.data.numpy(), 'o') 
plt.xlabel('X') #添加X轴的标注
plt.ylabel('Y') #添加Y轴的标注
plt.show() #将图形画在下面

在这里插入图片描述

2.4.2 构造模型 计算损失函数

用 ax+b 来表示一条直线。建立变量,随机初始化用于线性拟合的参数 a 和 b。

#创建a变量,并随机赋值初始化
a = Variable(torch.rand(1), requires_grad = True) 
#创建b变量,并随机赋值初始化
b = Variable(torch.rand(1), requires_grad = True) 
print('Initial parameters:', [a, b])
#输出:Initial parameters: [tensor([0.9102], requires_grad=True), tensor([0.2548], requires_grad=True)]

learning_rate = 0.0001 #设置学习率
for i in range(1000):
    ### 下面这三行代码非常重要,这部分代码,清空存储在变量a,b中的梯度信息,
    ### 以免在backward的过程中会反复不停地累加
    #如果a和b的梯度都不是空
    if (a.grad is not None) and (b.grad is not None):  
        a.grad.data.zero_() #清空a的数值
        b.grad.data.zero_() #清空b的数值
        
    #计算在当前a、b条件下的模型预测数值   首先a的维度为1,x是维度为100*1的Tensor,不能直接相乘,因为维度不同
    #  .expand_as(x)将张量升维成与 x 同维度的张量。所以如果 a = 1, x 为尺寸为 100
    #x*y两个1维张量乘积  =====>  (𝑥∗𝑦)𝑖=𝑥𝑖⋅𝑦𝑖
    predictions = a.expand_as(x) * x + b.expand_as(x)  
    
    #通过与标签数据y比较,计算误差
    loss = torch.mean((predictions - y) ** 2) 
    print('loss:', loss.data.numpy())        #打印出来的数值会发现损失慢慢降低
    loss.backward() #对损失函数进行梯度反传
    
    #利用上一步计算中得到的a的梯度信息更新a中的data数值
    a.data.add_(- learning_rate * a.grad.data)
    #利用上一步计算中得到的b的梯度信息更新b中的data数值
    b.data.add_(- learning_rate * b.grad.data)  

x_data = x.data.numpy() # 获得x包裹的数据
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
xplot, = plt.plot(x_data, y.data.numpy(), 'o') # 绘制原始数据
yplot, = plt.plot(x_data, a.data.numpy() * x_data + b.data.numpy())  #绘制拟合数据
plt.xlabel('X') #更改坐标轴标注
plt.ylabel('Y') #更改坐标轴标注
str1 = str(a.data.numpy()[0]) + 'x +' + str(b.data.numpy()[0]) #图例信息
plt.legend([xplot, yplot],['Data', str1]) #绘制图例
plt.show()

在这里插入图片描述

2.4.3 测试模型

x_test = Variable(torch.FloatTensor([1, 2, 10, 100, 1000])) #随便选择一些点1,2,……,1000
predictions = a.expand_as(x_test) * x_test + b.expand_as(x_test) #计算模型的预测结果
predictions #输出
输出:
tensor([  1.8542,   2.8388,  10.7155,  99.3286, 985.4593],
       grad_fn=<AddBackward0>)

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

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

相关文章

SQL WHERE 子句

WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定条件的记录。 SQL WHERE 语法 SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多个…

06SpringCloudAlibaba负载均衡服务调用-OpenFeign

目录 SpringCloud Feign 查看此博客&#xff1a;005SpringCloud--Feign&#xff1a;负载均衡(基于服务端)_gh_xiaohe的博客-CSDN博客 OpenFegin概述 OpenFeign是什么&#xff1a; OpenFegin能干什么 Feign和OpenFeign两者区别 OpenFeign使用步骤 服务消费者 接口注解 微…

TP相关知识

说明 该文章来源于徒弟lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明PHP中有一些内置类PHP反序列化问题绕过姿势&#xff1a;魔术方法&#xff08;反序列化如何利用&#xff09;CMS可能存在的部分逻辑问题$_REQUEST相关安全…

小游戏引擎选型参考指南

写在前面 前面写了几期有关于小游戏的文章&#xff0c;主要从小游戏开发、小游戏运营、小游戏变现等多个角度进行了较为粗略的介绍&#xff0c;很多同学表示对小游戏引擎部分很感兴趣&#xff0c;希望能够有一些更为深入的分析介绍。今天就对目前主流的小游戏引擎进行探讨。 …

Java 并发编程 (二)CountDownLatch和CyclicBarrier的使用

CountDownLatch和CyclicBarrier CountDownLatch 功能介绍 CountDownLatch 是一个同步功能的辅助类 线程计数不为0时呈wait状态如果为0则继续执行。通过await 和 countDown 两个方法来实现等待和继续运行。 作用&#xff1a;一个线程或多个线程等待另一个线程或多个线程完成后…

2003-2021年高铁列车信息

2003-2021年高铁列车信息 1、时间&#xff1a;2003-2021年 2、指标&#xff1a; 列车车次、出发站、出发站所属地级市、出发站所属省份、出发站类型、到达站、到达站所属地级市、到达站所属省份、到达站类型、车型、开车时间、到站时间、运行时间、里程 3、指标说明&#x…

58. 微调(fine-tuning)

前面的一些章节介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。 我们还描述了学术界当下使用最广泛的大规模图像数据集ImageNet&#xff0c;它有超过1000万的图像和1000类的物体。 然而&#xff0c;我们平常接触到的数据集的规模通常在这两者之间。 假如我们…

3、基于注解的IoC装配与依赖注入

一、XML开启注解支持 1、添加context名称空间 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&…

03SpringCloudAlibaba服务注册中心—Zookeeper

目录 注册中心Zookeeper 五步曲&#xff1a; zookeeper服务提供者 1、03-cloud-provider-payment-zookeeper-8004 2、pom.xml 3、改yum 4、主启动 5、业务类 测试1&#xff1a; 测试2&#xff1a; ​ 服务节点是临时节点还是持久节点 粗划分&#xff1a; 细划分&am…

南京晓庄Java期末知识点复习

南京晓庄Java期末知识点复习第一章 Java 语言概述第二章 Java 语法基础标识符基本数据类型**运算符****语句**数组和字符串命令行参数输入输出第三章 类五个基本概念类类的封装类的继承**抽象类**接口关键字常用的工具类第四章 Applet及其应用**Java程序的两种基本形式****Appl…

红队渗透靶场之prime1.0(超详细!)

靶场考察知识 Wordpress WordPress是一个免费的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;可以用来创建和管理网站或博客。它是由PHP语言和MySQL数据库构建的&#xff0c;并且拥有大量的插件和主题&#xff0c;可以让您轻松地自定义网站的外观和功能 Wpscan扫…

引用量超6000的语义分割经典论文DeepLabv3解读

分享语义分割领域的一篇经典论文DeepLabv3&#xff0c;由谷歌发表于CVPR2017。开源代码地址&#xff1a; Tensorflow版本&#xff1a;https://github.com/tensorflow/models/tree/master/research/deeplabPytorch版本&#xff1a;https://github.com/open-mmlab/mmsegmentatio…

【Spring 入门教程3】

Spring_day03 &#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.3 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ …

mysql简介

一.mysql简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&a…

TensorFlow之过拟合与欠拟合-3

1 基本概念 过度拟合&#xff08;overfit&#xff09; 正则化&#xff08;regularization&#xff09; L1正则化&#xff08;L1 regularization&#xff09; L2正则化&#xff08;L2 regularization&#xff09; 删除正则化&#xff08;dropout regularization&#xff09…

【计组】异常、CPU指令集--《深入浅出计算机组成原理》(五)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、异常 &#xff08;一&#xff09;异常 异常其实是一个硬件和软件组合到一起的处理过程。异常的发生和捕捉&#xff0c;是在硬件层面完成的。但是异常的处理&#xff0c;是由软件来完成的。 …

【并发编程十】c++线程同步——条件变量(condition_variable)

【并发编程十】c线程同步——条件变量&#xff08;condition_variable&#xff09;一、互斥二、条件变量1、为何要引入条件变量?2、不使用条件变量3、使用条件变量3.1、互斥锁有什么问题&#xff1f;3.2、条件变量3.3、条件变量成员函数3.4、demo三、future四、信号量简介&…

【并发编程九】c++线程同步——互斥(mutex)

【并发编程九】c线程同步——互斥&#xff08;mutex&#xff09;一、互斥1、mutex1.1、mutex1.2、 lock_guard1.3、 RAII2、std::recursive_mutex3、std::shared_mutex、std::shared_lock、std::unique_lock4、std::scoped_lock二、条件变量三、future四、信号量简介&#xff1…

chrony服务器

Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步&#xff0c;因此让你的计算机保持精确的时间&#xff0c;Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Chrony由两个程序…

【嵌入式Linux环境搭建-10】tftp服务安装、双网卡并行

10.tftp服务安装 板子有有线网卡&#xff0c;需有线连接到电脑 主机安装TFTP服务 $ sudo apt-get install xinetd tftpd tftp $ sudo vim /etc/xinetd.d/tftp /*添加下面内容, service tftp { protocol udp port 69 socket_type dgram wait …