【PyTorch入门教程】1. 基础知识

news2024/9/29 21:21:21

欢迎关注 【LearnOpenCV: PyTorch入门教程】
PyTorch入门:Ch1 基础知识
PyTorch入门:[Ch2 使用预训练模型进行图像分类]
PyTorch入门:[Ch3 使用迁移学习进行图像分类]
PyTorch入门:[Ch4 使用ONNX和Caffe2进行模型推理]
PyTorch入门:[Ch5 使用Torchvision进行语义分割]
PyTorch入门:[Ch6 实现更快的R-CNN目标检测]
PyTorch入门:[Ch7 使用Mask RCNN进行实例分割]


【PyTorch入门教程】CH1. 基础知识

    • 1. 什么是PyTorch?
    • 2. 为什么选择PyTorch学习深度学习?
    • 3. PyTorch Library概览
      • 3.1 数据加载与处理
      • 3.2 建立神经网络
      • 3.3 模型推理与兼容性
    • 4. 张量(Tensors)介绍
    • 5. 创建张量(Tensor)
    • 6. 操作张量中的元素
    • 7. 指定张量元素的数据类型
    • 8. 张量(Tensor)与Numpy数组的转换
    • 9. 张量(Tensor)的算术操作
    • 10. 张量(Tensor)的存储设备:CPU v/s GPU

世界在不断发展,为之服务的技术也在不断发展。对每个人来说,跟上技术的快速变化至关重要。人工智能是发展最快、规模最大的领域之一。在这个快速发展的领域,PyTorch作为构建这些模型的替代方案而诞生。

我们为PyTorch初学者创建了一系列深度学习入门教程,帮助他们学习使用PyTorch和Torchvision。PyTorch网站上有很多教程,我们希望与这些教程有所差异。

这是一个面向初学者的PyTorch教程。


1. 什么是PyTorch?

正如PyTorch官方文件的介绍,PyTorch不仅是一个基于Python的深度学习库,还是一个科学计算包。

PyTorch科学计算包的特点在于:

  1. 取代NumPy以使用强大的GPU;
  2. 为深度学习研究提供极大的灵活性和速度。

PyTorch使用张量Tensor作为核心的数据结构,类似于Numpy数组。随着软件和硬件的快速发展,张量Tensor可以加速各种数学运算。在深度学习中大量执行这些操作时,张量Tensor在速度上具有很大的优势。

PyTorch与Python类似,专注于易用性,只有基本编程能力的初学者都可以在项目中使用深度学习。这也使它成为“初学者首选的深度学习库”。


2. 为什么选择PyTorch学习深度学习?

我们在上节介绍PyTorch是“初学者首选的深度学习库”。

基于Python的深度学习库非常丰富,例如广泛流行的Keras、Tensorflow、Caffe、Theano(RIP)等等。PyTorch有什么不同呢?

一个理想的深度学习库应该易于学习和使用,足够灵活,可以用于各种应用程序,高效,以便我们能够处理大量的现实数据集,并且足够准确,即使在输入数据存在不确定性的情况下也能提供正确的结果。

PyTorch在这些方面的表现都非常优秀。“pythonic”的编码风格使其易于学习和使用。GPU加速、对分布式计算和自动梯度计算的支持,对于从正向表达式开始自动执行反向传递非常方便。

虽然Python语言的封装会使程序运行速度慢,但高性能的C++API(libtorch)可以较好地处理这个问题。这使得从研发到生产的过程非常顺利。

让我们看看使用PyTorch应用程序所获得的有趣结果。

在这里插入图片描述
在这里插入图片描述

如果你对PyTorch感兴趣,这里列出了很多PyTorch项目:【23个PyTorch开源项目(The Top 23 Pytorch Open Source Projects)】


3. PyTorch Library概览

我们来看看PyTorch项目的基本流程。

下图描述了一个典型的工作流程以及与每个步骤相关的重要模块。

在这里插入图片描述

PyTorch基本流程图

我们将简要地讨论几个重要的PyTorch模块:torch.nn、torch.optim、torch.utils和torch.autograd。


3.1 数据加载与处理

数据加载和处理是深度学习项目的基本需求。
PyTorch的torch.utils.data模块用于实现数据加载和处理,该模块中的两个重要类是数据集Dataset和数据加载器DataLoader。

  • 数据集Dataset基于张量(Tensor)数据结构,主要用于自定义数据集。
  • 数据加载器DataLoader,用于从用户的大型数据集加载数据,以便对模型进行训练。

如果可以访问多台机器或GPU,也可以使用torch.nn.DataParallel模块和torch.distributed模块进行并行处理或分布式处理。


3.2 建立神经网络

torch.nn模块用于创建神经网络。它提供了所有常见的神经网络层(layer),如全连接层、卷积层、激活函数和损失函数等。

在创建网络架构、准备输入数据之后,就需要更新权重和偏差方法,以便开始训练网络模型。torch.optim模块提供各种参数优化算法,而torch.autograd模块提供计算反向传播的自动微分算法。


3.3 模型推理与兼容性

模型经过训练后,可以用于预测测试集甚至新数据集的输出,这个过程称为模型推理。
PyTorch还提供了TorchScript,可以独立于Python程序来运行模型。这可以认为是一个虚拟机(Virtual Machine),其指令主要针对张量(Tensor)。

使用PyTorch训练好的模型还可以转换为ONNX等格式。ONNX格式允许在MXNet、CNTK、Caffe2等其它深度学习框架中使用PyTorch模型。也可以将ONNX格式的模型转换为Tensorflow格式。


4. 张量(Tensors)介绍

张量是PyTorch中使用的核心数据结构。

张量与Numpy数组类似,只是矩阵的一个特殊名称。如果你熟悉Numpy数组,那么理解和使用PyTorch张量将非常容易。

标量值由0维张量表示,列/行数组使用一维张量表示,二维矩阵使用二维张量表示,依次类推。下面显示了一些不同维度张量的例子,以便可视化和理解。

在这里插入图片描述
张量(Tensor)的结构

在介绍张量之前,我们通过conda命令来安装PyTorch 1.1.0。

conda install -c pytorch pytorch-cpu

该命令将安装PyTorch CPU版本。


5. 创建张量(Tensor)

本节介绍如何创建张量(Tensor)。

首先要导入PyTorch库。接着创建一个全1或全0的一维张量。

import torch

# Create a Tensor with just ones in a column
a = torch.ones(5)
 
# Print the tensor we created
print(a)
 
# tensor([1., 1., 1., 1., 1.])
 
# Create a Tensor with just zeros in a column
b = torch.zeros(5)
print(b)
 
# tensor([0., 0., 0., 0., 0.])

类似地,创建具有任意值的一维张量,如下所示。

c = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
print(c)

# tensor([1., 2., 3., 4., 5.])

在上面的例子中我们创建了一维张量,下面的例子将创建更高维度的张量。

d = torch.zeros(3,2)
print(d)

# tensor([[0., 0.],
#        [0., 0.],
#        [0., 0.]])

e = torch.ones(3,2)
print(e)

# tensor([[1., 1.],
#        [1., 1.],
#        [1., 1.]])

f = torch.tensor([[1.0, 2.0],[3.0, 4.0]])
print(f)

# tensor([[1., 2.],
#        [3., 4.]])

# 3D Tensor
g = torch.tensor([[[1., 2.], [3., 4.]], [[5., 6.], [7., 8.]]])
print(g)

# tensor([[[1., 2.],
#         [3., 4.]],
#
#        [[5., 6.],
#         [7., 8.]]])

我们可以用.shape方法查看张量的形状。

print(f.shape)
# torch.Size([2, 2])

print(e.shape)
# torch.Size([3, 2])

print(g.shape)
# torch.Size([2, 2, 2])

6. 操作张量中的元素

我们已经创建了一些张量,让我们看看如何访问张量中的元素。这与Numpy数组元素的操作是类似的。
首先,让我们看看如何访问1D张量(即向量)中的元素。

# Get element at index 2
print(c[2])

# tensor(3.)

对于2D或3D张量呢?访问张量中的一个特定元素,我们需要指定等于张量维数的索引。因此对于一维张量c,只需要指定一个索引。

# All indices starting from 0

# Get element at row 1, column 0
print(f[1,0])
# We can also use the following
print(f[1][0])

# tensor(3.)

# Similarly for 3D Tensor
print(g[1,0,0])
print(g[1][0][0])

# tensor(5.)

如果要访问2D张量中的一整行,可以用通配符’:’实现,具体语法与Numpy数组的方法相同。

# All elements
print(f[:])

# All elements from index 1 to 2 (inclusive)
print(c[1:3])

# All elements till index 4 (exclusive)
print(c[:4])

# First row
print(f[0,:])

# Second column
print(f[:,1])

7. 指定张量元素的数据类型

PyTorch在创建张量时要确定张量元素的数据类型,所有张量元素都使用相同的数据类型。我们可以在创建张量时指定数据类型。

int_tensor = torch.tensor([[1,2,3],[4,5,6]])
print(int_tensor.dtype)

# torch.int64

# What if we changed any one element to floating point number?
int_tensor = torch.tensor([[1,2,3],[4.,5,6]])
print(int_tensor.dtype)

# torch.float32

print(int_tensor)

# tensor([[1., 2., 3.],
#        [4., 5., 6.]])


# This can be overridden as follows
int_tensor = torch.tensor([[1,2,3],[4,5,6]], dtype=torch.int32)
print(int_tensor.dtype)

# torch.int32
print(int_tensor)

# tensor([[1, 2, 3],
#        [4, 5, 6]], dtype=torch.int32)

8. 张量(Tensor)与Numpy数组的转换

PyTorch张量与Numpy数组非常相似,这两种数据结构如何相互转换呢?

# import NumPy
import numpy as np

# Tensor to Array
f_numpy = f.numpy()
print(f_numpy)

# array([[1., 2.],
#       [3., 4.]], dtype=float32)

# Array to Tensor
h = np.array([[8,7,6,5],[4,3,2,1]])
h_tensor = torch.from_numpy(h)
print(h_tensor)

# tensor([[8, 7, 6, 5],
#        [4, 3, 2, 1]])

9. 张量(Tensor)的算术操作

让我们看看如何对PyTorch张量执行算术运算。

# Create tensor
tensor1 = torch.tensor([[1,2,3],[4,5,6]])
tensor2 = torch.tensor([[-1,2,-3],[4,-5,6]])
 
# Addition
print(tensor1+tensor2)
# We can also use
print(torch.add(tensor1,tensor2))
 
# tensor([[ 0,  4,  0],
#        [ 8,  0, 12]])
 
# Subtraction
print(tensor1-tensor2)
# We can also use
print(torch.sub(tensor1,tensor2))
 
# tensor([[ 2,  0,  6],
#        [ 0, 10,  0]])
 
# Multiplication
# Tensor with Scalar
print(tensor1 * 2)
# tensor([[ 2,  4,  6],
#        [ 8, 10, 12]])
 
# Tensor with another tensor
# Elementwise Multiplication
print(tensor1 * tensor2)
# tensor([[ -1,   4,  -9],
#        [ 16, -25,  36]])
 
# Matrix multiplication
tensor3 = torch.tensor([[1,2],[3,4],[5,6]])
print(torch.mm(tensor1,tensor3))
# tensor([[22, 28],
#        [49, 64]])
 
# Division
# Tensor with scalar
print(tensor1/2)
# tensor([[0, 1, 1],
#        [2, 2, 3]])
 
# Tensor with another tensor
# Elementwise division
print(tensor1/tensor2)
# tensor([[-1,  1, -1],
#        [ 1, -1,  1]])

10. 张量(Tensor)的存储设备:CPU v/s GPU

PyTorch为CPU和GPU提供了不同的张量实现。每个张量都可以从CPU转移到GPU,以便执行大规模并行、快速的计算。这将使对张量执行的所有操作都将由GPU设备的程序来执行。
如果你的设备不支持访问GPU,你可以在Google Colab上执行这些例程(选择GPU运行)。
我们先看看如何创建GPU设备上的张量。

# Create a tensor for CPU
# This will occupy CPU RAM
tensor_cpu = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], device='cpu')

# Create a tensor for GPU
# This will occupy GPU RAM
tensor_gpu = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], device='cuda')

如果使用Google Colab,请注意右上角的RAM消耗量。创建tensor_GPU后,GPU RAM消耗量将增大。定义在CPU和GPU设备上的张量进行运算时,也将会分别消耗指定设备所对应的RAM。

# This uses CPU RAM
tensor_cpu = tensor_cpu * 5
 
# This uses GPU RAM
# Focus on GPU RAM Consumption
tensor_gpu = tensor_gpu * 5

需要注意的是,GPU设备上的张量在操作中没有信息流到CPU(除非我们访问GPU张量)。
当然,我们可以将GPU张量移动到CPU,或者将CPU张量移动到GPU,如下所示。

# Move GPU tensor to CPU
tensor_gpu_cpu = tensor_gpu.to(device='cpu')

# Move CPU tensor to GPU
tensor_cpu_gpu = tensor_cpu.to(device='cuda')

简单回顾一下,我们在本文中讨论了PyTorch,它的独特性以及你为什么要学习它。我们还深入讨论了PyTorch的工作流程和PyTorch张量数据类型。

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

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

相关文章

中国机器人及人工智能大赛

报名 报名网站:https://www.caairobot.com 报名时,请在队伍名称后边添加任务后缀,比如,“诚朴-A”表明 队伍名称诚朴队,报名完成任务 A 然后在大赛官方 QQ 群 633244198(智慧农业-机器人及人工智能大赛&…

力扣刷题215.数组中的第K个最大元素

215.数组中的第K个最大元素 215.数组中的第K个最大元素题目描述思路暴力解法堆排序快速排序 215.数组中的第K个最大元素 215. 数组中的第K个最大元素 - 力扣(LeetCode) 题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素…

Postman+Java springboot演示 get post put delete请求并携带(路径 路径问号后 json 表单)参数形式

我们先创建一个java的springboot工程 在项目中 找到启动类的位置目录 在项目创建一个类 叫 user 我是想将 user 当做一个属性类的 按规范来讲 我们可以创建一个entity包 然后在下面去创建属性类 但这里 我们不想搞那么麻烦了 毕竟只是练习一下 然后 user参考代码如下 package…

【Java校招面试】基础知识(五)——GC

目录 前言一、基础概念二、垃圾回收算法三、垃圾收集器四、引用后记 前言 本篇主要介绍Java垃圾回收机制——GC的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第五篇博文,如有需要,可: 点击这里,返回本专…

【重新定义matlab强大系列五】函数filloutliers检测并替换数据中的离群值

🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

PyCharm下载、安装、注册以及简单使用【全过程讲解】

在使用PyCharm IDE之前,请确保自己的计算机里面安装了Python解释器环境,若没有下载和安装可以看看我之前的文章>>>Python环境设置>>>或者还可以观看视频讲解。 注意:本文软件的配置方式仅供个人学习使用,如有侵…

有研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具(下)

导语:研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具。 Apple EFI IM4P分配器 介绍 解析苹果多个EFI固件.im4p文件,并将所有检测到的EFI固件分割为单独的SPI/BIOS映像。 使用 你可以拖放或手动输入包含Apple EFI IM4P固件的文件夹的完整路径。…

【VM服务管家】VM4.2平台SDK_6.3 控件嵌入类

目录 2.3.1 渲染控件:渲染控件上自定义图形的方法2.3.2 参数控件:参数配置控件绑定模块的方法2.3.3 控件颜色:控件颜色修改方法2.3.4 独立控件:二次开发单独显示Group的方法2.3.5 取流控件:实时取流控件的使用方法2.3.…

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码 相关链接 (1)建模方案 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一…

python为什么长期霸占榜首

Python霸占榜首 只因它真的很强 Python,年龄可能比很多读者都要大,但是它在更新快速的编程界却一直表现出色,甚至有人把它比作是编程界的《葵花宝典》,只是Python的速成之法相较《葵花宝典》有过之而无不及。 Python简洁&#x…

【Hello Network】UDP协议

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍传输层和UDP协议 UDP协议 传输层端口号端口号范围划分知名端口号端口号与进程netstat与iostatpidof UDP协议UDP协议格式udp的数据封装udp的数…

2.2磁盘分区

2.2 磁盘分区 一个磁盘可以被划分为多个分区,有一个磁盘并且将他们划分为C;D;E盘,那个C,D,E就是分区(partition)。 2.2.1 磁盘连接的方式与设备文件名的关系 个人计算机常见的磁盘接口有两种,分别是SATA与SAS接口&…

精品:Stimulsoft Forms 2023.2.2

Stimulsoft Forms 是一种用于创建、编辑、填写、发布、分发交互式表单和收集结果的工具。我们的产品可嵌入到应用程序中,并允许您创建各种自定义填充模板。丰富的功能使模板具有真正的交互性。用户会收到 PDF 格式的可填写表格,他们可以在任何支持此格式…

ZooKeeper安装与配置集群

简介: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布…

ChatGPT初尝试——合并Excel表格【AI版】

ChatGPT真的能提升生产力吗?【AI版】 无意间的刷到的视频一、提需求二、ChatGPT用Python编写代码三、意外的解释四、ChatGPT改用Java编写代码五、GPT第二次生成Java代码尾巴 无意间的刷到的视频 晚上在家刷视频,突然看到一个在讲关于AI编程的视频&#…

网络安全:网络信息安全的概述.

网络安全:网络信息安全的概述 网络信息安全是一门涉及计算机科学,网络技术,通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性学科。 它主要是指网络系统的硬件、软件及其系统中的数据受到保护,不受…

深度学习 -- Pytorch学习 数据集API Dataset与DataLoader 重载鸢尾花数据集

前言 在模型训练的步骤中,数据的部分非常重要,它的过程主要分为数据收集、数据划分、数据读取、数据预处理。 数据收集的有原始样本和标签(Img,label) 数据集的划分需要分为训练集、验证集、测试集。 训练集负责训练模型,验证集…

C++基础知识快速入门

目录 一, 命名空间 1.1命名空间使用命名空间中成员该如何使用呢? 1.2 命名空间其他2种使用方式: 1. using 将其中一个成员引入 2. using namespace 二,C输入&输出 (简单运用) 2. 1 头文件 2. 2 cout 与 …

2023年软件测试常见面试题100%问必背全套教程

随着数字化时代的到来,软件测试越来越受到重视。在未来的几年里,软件测试将继续成为信息技术领域中的热门职业之一。如果你是一名正在寻找或准备进入软件测试行业的人,那么这套常见面试题全套教程对你来说会非常有用。 这套教程旨在帮助你了…

MySQL主从同步配置

Mysql 主从同步原理 就是基于数据库里面的那个 binlog 文件进行数据同步 具体步骤: step1:master将数据改变记录到二进制日志(binary log)中。step2: 当slave上执行 start slave 命令之后,slave会创建一个…