pytorch学习记录

news2024/9/20 14:46:18

pytorch学习记录

    • 0.引言
    • 1.numpy 简单入门
      • 1.1.常用基础
      • 1.2.numpy其他学习
    • 2.pytorch 简单入门
      • 2.1.Pytorch的基本组成元素
      • 2.2.Pytorch构建神经网络
      • 2.3.进阶部分
      • 2.4.其他参考资料

0.引言

一步一步积累吧。

  • 一篇不错的博客

1.numpy 简单入门

1.1.常用基础

  • numpy中文手册

  • numpy官方简要入门

(1)数组基础

  • 创建一个数组
# 1D Array
a = np.array([0, 1, 2, 3, 4])
b = np.array((0, 1, 2, 3, 4))
c = np.arange(5)
# linspace 函数创建一个指定范围内的等差数列。在这个例子中,范围是从0到 2*np.pi,数列的元素个数为5。
d = np.linspace(0, 2*np.pi, 5)

print(a) # >>>[0 1 2 3 4]
print(b) # >>>[0 1 2 3 4]
print(c) # >>>[0 1 2 3 4]
print(d) # >>>[ 0.          1.57079633  3.14159265  4.71238898  6.28318531]
print(a[3]) # >>>3
  • 多维数组切片
# MD slicing
print(a[0, 1:4]) # >>>[12 13 14]
print(a[1:4, 0]) # >>>[16 21 26]
print(a[::2,::2]) # >>>[[11 13 15]
                  #     [21 23 25]
                  #     [31 33 35]]
print(a[:, 1]) # >>>[12 17 22 27 32]
  • 数组属性
# Array properties
a = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28 ,29, 30],
              [31, 32, 33, 34, 35]])

print(type(a)) # >>><class 'numpy.ndarray'>
print(a.dtype) # >>>int64  返回数组元素的类型
print(a.size) # >>>25
print(a.shape) # >>>(5, 5) 数组的形状是它有多少行和列,上面的数组形状是(5,5)
print(a.itemsize) # >>>8  返回数组中每个元素的字节数
print(a.ndim) # >>>2 属性是数组的维数
print(a.nbytes) # >>>200 返回数组中所有元素所占用的字节数总和。

(2)使用数组

  • 基本操作符
# Basic Operators
a = np.arange(25)  # 从0开始,步长为1,计数25个
a = a.reshape((5, 5))

b = np.array([10, 62, 1, 14, 2, 56, 79, 2, 1, 45,
              4, 92, 5, 55, 63, 43, 35, 6, 53, 24,
              56, 3, 56, 44, 78])
b = b.reshape((5,5))
#除了 dot() 之外,这些操作符都是对数组进行逐元素运算。比如 (a, b, c) + (d, e, f) 的结果就是 (a+d, b+e, c+f)
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
print(a < b) #返回的将是一个布尔型数组
print(a > b) 
print(a.dot(b)) #点积。返回的是一个标量
  • 数组特殊运算符
# dot, sum, min, max, cumsum
a = np.arange(10)

print(a.sum()) # >>>45
print(a.min()) # >>>0
print(a.max()) # >>>9
#返回一个新的一维数组,其中的元素为原数组的元素的累加和。如数组是[1, 2, 3],新数组就是[1, 3, 6]
print(a.cumsum()) # >>>[ 0  1  3  6 10 15 21 28 36 45]

(3)索引进阶

  • 花式索引
# Fancy indexing
a = np.arange(0, 100, 10)  # 步长为10
indices = [1, 5, -1] # index = 1, index = 5, 最后一个
b = a[indices]
print(a) # >>>[ 0 10 20 30 40 50 60 70 80 90]
print(b) # >>>[10 50 90]
  • 布尔屏蔽
# Boolean masking
import matplotlib.pyplot as plt

a = np.linspace(0, 2 * np.pi, 50)
b = np.sin(a)
plt.plot(a,b)
mask = b >= 0
plt.plot(a[mask], b[mask], 'bo')
mask = (b >= 0) & (a <= np.pi / 2)
plt.plot(a[mask], b[mask], 'go')
plt.show()
  • 缺省索引
#不完全索引是从多维数组的第一个维度获取索引或切片的一种方便方法
a = np.arange(0, 100, 10)
b = a[:5]
c = a[a >= 50]
print(b) # >>>[ 0 10 20 30 40]
print(c) # >>>[50 60 70 80 90]
  • where函数
a = np.arange(0, 100, 10)
b = np.where(a < 50) 
c = np.where(a >= 50)[0]
print(b) # >>>(array([0, 1, 2, 3, 4]),)
print(c) # >>>[5 6 7 8 9]

1.2.numpy其他学习

  • 其他numpy使用学习

2.pytorch 简单入门

为什么选择pytorch?

请添加图片描述

  • 动态图,方便调试

PyTorch动态构建神经网络,执行到代码位置, 才开始构建这句代码所描述的网络节点, 然后把这一节点挂在计算图上。 可以让用户在动态改变神经网络时,不产生任何滞后和开销。它直观, 精简, 极度灵活。 缺点也非常明显,那就是运行效率和开销。

Tensorflow、Caffe都采用静态构建方式。用户需要先构建神经网络结构,然后在给定的结构上填入数据,再进行一次又一次的运行。能够对预先定义的网络进行多种优化处理,从而运行的更高效。但缺点也非常明显,即不够灵活,而且被优化后的网络,对用户不友好,调试时难以轻松知道程序的状态, 而且一旦用户想要根据计算的状态,动态的修改神经网络结构,那么实现起来会非常困难。

PyTorch这一工具的定位: 帮助科研人员和工程师, 快速探索和调整模型, 快速构建实验,更适合从0到1的创新工作, 而静态图Tensorflow,更适合已经有了模型, 我们要运用到某些高强度的训练和测试的应用环境下。更适合工业应用。

  • pytorch官方教程

  • pytorch官方文档

2.1.Pytorch的基本组成元素

PyTorch 四层抽象:

  • Tensor: 基本数据单元,多维数组
  • Variable:等同于带有梯度的Tensor
  • nn: 卷积、池化、激活函数等层的实现
  • Module: 网络结构,包含一系列Tensor和nn的计算过程

注意:在Pytorch > = 0.4版本中,将Variable与Tensor合并

Tensor:x = torch.ones(2, 2, requires_grad=False)
Variable:x = torch.ones(2, 2, requires_grad=True)

请添加图片描述

(1)Tensor

用于生成网络输入、输出、参数、中间变量等等

  • 初始化:
torch.tensor((k*k*k…), dtype=torch.float)
torch.from_numpy(**)
torch.zero((k*k*k…)) # 初始化元素为0
torch.eye(k) # 初始化对角矩阵
torch.ones((k*k*k…)) # 初始化元素为1
torch.rand(k*k*k…) #随机初始化[0,1]
torch.randn(k*k*k…) #随机初始化, 0-均值 1-方差
data.cuda() #cpu转gpu

请添加图片描述

  • 示例

请添加图片描述
请添加图片描述

  • 其他的一些使用方法可以查询文档,注意带上torch版本号

  • 基本运算

加减乘除:逐点操作
矩阵乘:data1.mm(data2)
数据维度:size(), reshape(), view(), squeeze, unsqueeze
转置:transpose,permute

(2)Tensor(requires_grad=True) <==>Variable

• tensor.data 获取数据
• tensor.grad 获取梯度
• tensor.grad_fn 获取产生方式

在这里插入图片描述

(3)nn-卷积.池化.激活等层

  • 方式一:
• torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
• torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
• torch.nn.AvePool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
• torch.nn.ReLU(inplace=False)
• torch.nn.Sequential()
  • 方式二:
• torch.nn.functional.conv2d(input, weight, bias=None, ward的过程中,Function和Variable组成了计算图,在backward时,只需调用Function的
backward就得到结果,因此Module不需要再定义backward。
• Module不仅包括了Function,还包括了对应的参数,以及其他函数与变量,这是Function所不具备的
• stride=1, padding=0, dilation=1, groups=1)
• torch.nn.functional.relu(input, inplace=False)
  • 区别
• Function一般只定义一个操作,因为其无法保存参数,因此适用于激活函数、pooling等操作;Module是保存了参数,因此适合于定义一层,如线性层,
卷积层,也适用于定义一个网络
• Function需要定义三个方法:__init__, forward, backward(需要自己写求导公式);Module:只需定义__init__和forward,而backward的计算由自动
求导机制构成
• Module是由一系列Function组成,因此其在for

  • 方式一:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.AvePool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.ReLU(inplace=False)
torch.nn.Sequential()
  • 方式二:
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)
torch.nn.functional.relu(input, inplace=False)

区别:

  • 方式一:
myConv = torch. nn.Conv2d(16, 33, 3, stride=1, padding=1)
myRelu = torch.nn.ReLU(inplace=True)
input = torch.randn(20, 16, 50, 100)
output = myConv(input)
output = myRelu(output)
  • 方式二:
weight = torch.randn(33,16,3,3) 
input = torch.randn(20, 16, 50, 100)
output = torch.nn.functional.conv2d(input, weight,stride=1, padding=1)
output = torch.nn.functional.relu(output)

手写数字识别的torch版本:

import torch
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn((N, D_in), requires_grad=True)
y = torch.randn((N, D_out), requires_grad=False)
model = torch.nn.Sequential(torch.nn.Linear(D_in, H),
                           torch.nn.ReLU(),
                           torch.nn.Linear(H, D_out))
loss_fn = torch.nn.MSELoss(reduction='sum')

learning_rate = 1e-4
for t in range(500):
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    print(loss)
    
    model.zero_grad()
    loss.backward()
    for param in model.parameters():
        param.data -= learning_rate * param.grad.data

在这里插入图片描述

请添加图片描述

2.2.Pytorch构建神经网络

请添加图片描述

(1)Pytorch-数据准备

why use Dataset Dataloader?

  • 可以快速、提前提取数据到内存中
  • 提供框架,只需写核心函数
  • 提供多种数据曾广支持

在这里插入图片描述

(2)module-神经网络

  • Module 是 pytorch 提供的一个基类,每次我们要 搭建 自己的神经网络的时候都要继承这个类

  • 主要函数:
    def init(self): #初始化网络所用的神经网络层
    def forward(self, x): #网络的前向过程
    def backward(self, x): #自动计算

  • 实例展示(lenet,vgg,resnet)

在这里插入图片描述

(3)网络模型

  • 保存模型
  • 加载训练好的模型

在这里插入图片描述

  • 模型优化

在这里插入图片描述

  • 学习率调整

在这里插入图片描述

2.3.进阶部分

(1)多GPU并行

请添加图片描述

请添加图片描述

(2) cpp extension扩展

  • 用途:

    • 实现新的功能,但是pytorch不支持
    • 代码运行速度有要求
  • 途径—C拓展:

    • 准备.c文件实现
    • 利用工具编译为python可以调用的模块
    • 嵌入到pytorch网络中

(3) tensorboardX可视化

  • 安装:

    • 安装tensorflow (cpu版本即可)
    • pip install tensorboardX
  • 使用

    • 初始化:
      from tensorboardX import SummaryWriter
      writer = SummaryWriter('log‘)
    • 记录:
      writer.add_scalar(‘Train/Loss’, loss.data[0], niter)
      writer.add_scalar(‘Test/Accu’, correct/total, niter)
    • 可视化:
      tensorboard --logdir=./log
      http://0.0.0.0:6006/

ps:服务器必须和本机联网

  • 参考

2.4.其他参考资料

  • 固定部分网络参数

  • C++拓展

  • 不同层设置不同学习率

  • tensorboardX可视化

  • 其他注意事项:

    • 官方网站是最好最权威的学习网站
    • 问题搜索时注意带上pytorch版本号

其他学习链接:

  • 知乎文章
  • ref1
  • PyTorch中文文档
  • pytorch-tutorial
  • 黄海广

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

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

相关文章

【李宏毅】HW12

HW12一、作业描述1、Policy Gradient2、Actor-Critic二、实验1、simple2、medium3、strong三、代码一、作业描述 在这个HW中&#xff0c;你可以自己实现一些深度强化学习方法&#xff1a; 1、策略梯度Policy Gradient 2、Actor-Critic 这个HW的环境是OpenAI gym的月球着陆器。…

ubuntu | 重装ubuntu(VMware虚拟机环境)

前言 最近又把双系统的ubuntu搞崩了&#xff0c;在grub界面进不去&#xff0c;估计找不到启动项&#xff0c;被迫重装。 这次觉得还是windows系统好使&#xff0c;就用vmware虚拟机了。 一、安装vmware虚拟机 参考我之前的博客。 二、安装ubuntu 下载ubuntu18.04的iso文件…

15.2 浏览器中的进程

浏览器中的进程 start 上一篇文章&#xff0c;学习到了如何区分进程和线程。在这里再复习一下&#xff0c;进程类似于一个工厂&#xff0c;线程类似于工厂的工人&#xff0c;一个工厂可以有一个或多个工人。 1. 浏览器的进程 一个浏览器中有很多的进程&#xff0c;我以谷歌…

2023年的摸鱼小技巧:Python自动生成请假条【思路详解】

嗨害大家好鸭&#xff01;我是小熊猫~ 这不2023到了&#xff0c;新的一年&#xff0c;新的摸鱼 在办公室里的小透明来实现用Python来批量生成请假条&#xff0c; 这波啊&#xff0c;这波是智取&#xff01;&#xff01;&#xff01; Python资料电子书:点击此处跳转文末名片获…

Excel函数公式大全—SUMIF/SUMIFS函数

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法&#xff0c;为什么Excel覆盖如此之广&#xff0c;几乎每个公司、学校、家庭都在使用&#xff0c;但是它深藏的宝藏功能却很少被人使用&#xff0c;PQ、BI这些功能同样适用于数据分析&#xff1b;并且在一些需…

内部成员之五:内部类

文章目录一、内部类分类&#xff1a;成员内部类vs局部内部类成员内部类实例化成员内部类每日一考一、内部类 1、Java中允许将类A声明在类B中&#xff0c;则类A就是内部类&#xff0c;类B为外部类。 分类&#xff1a;成员内部类vs局部内部类 成员内部类&#xff08;静态、非静…

【ElasticSearch7.X】学习笔记(三)

【ElasticSearch7.X】学习笔记五、集群部署5.1、相关概念5.1.1、集群 Cluster3.1.2、节点 Node5.2、下载安装5.3、 启动5.4、 测试六、进阶6.1、核心概念6.1.1、索引&#xff08;Index&#xff09;6.1.2、类型&#xff08;Type&#xff09;6.1.3、文档&#xff08;Document&…

Handler的学习

一、Handler到底有什么用呢&#xff1f; 首先看以下案例&#xff1a; public class MainActivity extends AppCompatActivity { Button btn;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activi…

vue这些原理你都知道吗?(面试版)

前言 在之前面试的时候我自己也经常会遇到一些vue原理的问题, 我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来, 欢迎大家一起学习交流, 有更好的方法欢迎评论区指出, 后序我也将持续整理总结~ 描述 Vue 与 React 区别 说明概念: vue:是一套用于构建用户…

虚拟化技术学习笔记3

1、KVM虚拟机管理工具部署 学习目标&#xff1a; 能够为KVM虚拟机管理工具部署准备环境 能够部署KVM虚拟机管理工具 1、KVM系统需求&#xff1a; 1&#xff09;Host system requirements: 1核心、2G内存、6G硬盘 2&#xff09;KVM hypervisor requirements&#xff1a; l…

U3D客户端框架(资源管理篇)之主资源加载器模块设计实现

一、主资源加载器模块设计实现 作用 主资源加载器是为面向用户而设计的上层应用层类&#xff0c;用户使用主资源加载器作为文件加载器加载文件&#xff0c; 加载器可以通过Assetbundle方式加载&#xff0c;Http方式加载资源。 UML类图设计 前置模块 主资源加载器需要引用到一…

Qt扫盲-QHash理论总结

QHash理论总结一、概述二、使用1. 添加 元素2. 获取元素3. 遍历元素4. 删除元素5. qHash()的散列函数6.算法复杂性一、概述 QHash是Qt的通用容器类之一。它和QMap一样是用来存储(键&#xff0c;值)对的工具&#xff0c;并提供快速查找与键相关联的值的功能。 QHash提供了与QMa…

密码学的一些常识01

序 作为一个小白&#xff0c;对称加密&#xff0c;非对称加密&#xff0c;数字签名&#xff0c;数字证书&#xff0c;CA&#xff0c;diff-helman&#xff0c;DES,AED,RSA……这些都不会。所以&#xff0c;百度启动&#xff0c;先初步了解。 实际应用 我是个小白……0基础的&…

sklearn中精确率、召回率及F1值得micro,macro及weighted算法

为什么要用精确率和召回率 有这样一个训练集&#xff0c;1000个人参加了结直肠癌CRC的检测&#xff0c;实际有0.5%的人得了CRC&#xff08;即5个人&#xff09;。用神经网络算法得到检测这样一个训练集能达到99%的准确率。从数值上判断该算法是不错的&#xff0c;因为只有1%的误…

springboot+disruptor再体验

Disruptor是一个高性能队列&#xff0c;常见的还有kafka、rabbitmq等&#xff0c;下面体验一下~ 1、Disruptor简介 Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列&#xff0c;研发的初衷是解决内存队列的延迟问题&#xff08;在性能测试中发现竟然与I/O操作处于同样的…

[C++]STL之string的模拟实现

上一章我们对string的常见接口及使用进行了讲解&#xff0c;接下来我们将对一些常见的接口&#xff0c;包括构造函数&#xff0c;析构函数&#xff0c;运算符重载等等进行模拟实现.方便我们理解string接口实现的原理. 在讲解之前先说一下string的成员变量. 首先是字符串内容_…

微信小程序picker组件遇到的问题以及解决办法

一、picker基本概念二、遇到的问题三、如何解决四、延伸五、效果图一、picker基本概念 先来看一下官方文档中picker的基本概念&#xff1a; 从底部弹起的滚动选择器&#xff0c;现支持三种选择器&#xff0c;通过mode来区分&#xff0c;分别是普通选择器&#xff0c;时间选择器…

Bochs下载安装

文章目录下载Bochs配置BochsBochs Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台&#xff0c;包括I/O设备、内存和BIOS。更为有趣的是&#xff0c;甚至可以不使用PC硬件来运行Bochs。事实上&#xff0c;它可以在任何编译运行Bochs的…

【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到要将场景中的Text的字体全部替换的情况。 所以…

NetInside网络分析帮您解决系统性能问题(一)

前言 某大学信息中心负责人表示&#xff0c;有用户反馈&#xff0c;在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN&#xff1a;XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 需要通过分析系统看一下实际情况&#…