pytorch快速入门中文——01

news2024/11/17 3:30:02

PyTorch 深度学习:60分钟快速入门

原文:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

作者: Soumith Chintala

https://www.youtube.com/embed/u7x8RXwLKcA

什么是 PyTorch?

PyTorch 是基于以下两个目的而打造的python科学计算框架:

  • 无缝替换NumPy,并且通过利用GPU的算力来实现神经网络的加速。
  • 通过自动微分机制,来让神经网络的实现变得更加容易。

本次教程的目标:

  • 深入了解PyTorch的张量单元以及如何使用Pytorch来搭建神经网络。
  • 自己动手训练一个小型神经网络来实现图像的分类。

注意

确保已安装torchtorchvision包。
在这里插入图片描述

张量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HAMaOOB-1687942170716)(img/0a7a97c39d6dfc0e08d2701eb7a49231.png)]

torch.autograd的简要介绍

在这里插入图片描述

神经网络简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3jt7p9i-1687942170719)(img/7a28f697e6bab9f3d9b1e8da4a5a5249.png)]

张量

原文: https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py

张量如同数组和矩阵一样, 是一种特殊的数据结构。在PyTorch中, 神经网络的输入、输出以及网络的参数等数据, 都是使用张量来进行描述。

张量的使用和Numpy中的ndarrays很类似, 区别在于张量可以在GPU或其它专用硬件上运行, 这样可以得到更快的加速效果。如果你对ndarrays很熟悉的话, 张量的使用对你来说就很容易了。如果不太熟悉的话, 希望这篇有关张量API的快速入门教程能够帮到你。

import torch
import numpy as np

张量初始化

张量有很多种不同的初始化方法, 先来看看四个简单的例子:

1. 直接生成张量

由原始数据直接生成张量, 张量类型由原始数据类型决定。

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

2. 通过Numpy数组来生成张量

由已有的Numpy数组来生成张量(反过来也可以由张量来生成Numpy数组, 参考张量与Numpy之间的转换)。

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

3. 通过已有的张量来生成新的张量

新的张量将继承已有张量的数据属性(结构、类型), 也可以重新指定新的数据类型。

x_ones = torch.ones_like(x_data)   # 保留 x_data 的属性
print(f"Ones Tensor: \n {x_ones} \n")

x_rand = torch.rand_like(x_data, dtype=torch.float)   # 重写 x_data 的数据类型
                                                        int -> float
print(f"Random Tensor: \n {x_rand} \n")

显示:

Ones Tensor:
 tensor([[1, 1],
         [1, 1]])

Random Tensor:
 tensor([[0.0381, 0.5780],
         [0.3963, 0.0840]])

4. 通过指定数据维度来生成张量

shape是元组类型, 用来描述张量的维数, 下面3个函数通过传入shape来指定生成张量的维数。

shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

显示:

Random Tensor:
 tensor([[0.0266, 0.0553, 0.9843],
         [0.0398, 0.8964, 0.3457]])

Ones Tensor:
 tensor([[1., 1., 1.],
         [1., 1., 1.]])

Zeros Tensor:
 tensor([[0., 0., 0.],
         [0., 0., 0.]])

张量属性

从张量属性我们可以得到张量的维数、数据类型以及它们所存储的设备(CPU或GPU)。

来看一个简单的例子:

tensor = torch.rand(3,4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

显示:

Shape of tensor: torch.Size([3, 4])   # 维数
Datatype of tensor: torch.float32     # 数据类型
Device tensor is stored on: cpu       # 存储设备

张量运算

有超过100种张量相关的运算操作, 例如转置、索引、切片、数学运算、线性代数、随机采样等。更多的运算可以在这里查看。

所有这些运算都可以在GPU上运行(相对于CPU来说可以达到更高的运算速度)。如果你使用的是Google的Colab环境, 可以通过 Edit > Notebook Settings 来分配一个GPU使用。

# 判断当前环境GPU是否可用, 然后将tensor导入GPU内运行
if torch.cuda.is_available():
  tensor = tensor.to('cuda')

光说不练假把式, 接下来的例子一定要动手跑一跑。如果你对Numpy的运算非常熟悉的话, 那tensor的运算对你来说就是小菜一碟。

1. 张量的索引和切片

tensor = torch.ones(4, 4)
tensor[:,1] = 0            # 将第1列(从0开始)的数据全部赋值为0
print(tensor)

显示:

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

2. 张量的拼接

你可以通过torch.cat方法将一组张量按照指定的维度进行拼接, 也可以参考torch.stack方法。这个方法也可以实现拼接操作, 但和torch.cat稍微有点不同。

t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)

显示:

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

3. 张量的乘积和矩阵乘法

# 逐个元素相乘结果
print(f"tensor.mul(tensor): \n {tensor.mul(tensor)} \n")
# 等价写法:
print(f"tensor * tensor: \n {tensor * tensor}")

显示:

tensor.mul(tensor):
 tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

tensor * tensor:
 tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

下面写法表示张量与张量的矩阵乘法:

print(f"tensor.matmul(tensor.T): \n {tensor.matmul(tensor.T)} \n")
# 等价写法:
print(f"tensor @ tensor.T: \n {tensor @ tensor.T}")

显示:

tensor.matmul(tensor.T):
 tensor([[3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.]])

tensor @ tensor.T:
 tensor([[3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.]])

4. 自动赋值运算

自动赋值运算通常在方法后有 _ 作为后缀, 例如: x.copy_(y), x.t_()操作会改变 x 的取值。

print(tensor, "\n")
tensor.add_(5)
print(tensor)

显示:

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

tensor([[6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.]])

注意:

自动赋值运算虽然可以节省内存, 但在求导时会因为丢失了中间过程而导致一些问题, 所以我们并不鼓励使用它。

Tensor与Numpy的转化

张量和Numpy array数组在CPU上可以共用一块内存区域, 改变其中一个另一个也会随之改变。
1. 由张量变换为Numpy array数组

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")

显示:

t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]

修改张量的值,则Numpy array数组值也会随之改变。

t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

显示:

t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]

2. 由Numpy array数组转为张量

n = np.ones(5)
t = torch.from_numpy(n)

修改Numpy array数组的值,则张量值也会随之改变。

np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")

显示:

t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]

脚本的总运行时间:(0 分钟 0.045 秒)

下载 Python 源码:tensor_tutorial.py

下载 Jupyter 笔记本:tensor_tutorial.ipynb

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

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

相关文章

【Hadoop实战】Windows环境下编译Hadoop2(2.10.2-R0)

Windows环境下编译Hadoop2(2.10.2-R0)IDE 前提 根据Hadoop源码包解压之后编译帮助文件BUILDING.txt中关于windows的要求来准备环境 ----------------------------------------------------------------------------------Building on Windows--------…

龙蜥白皮书精选:面向芯片研发和验证的操作系统 SiliconFastOS

文/RISC-V ARCH SIG 01 背景介绍 随着 Arm 和 RISC-V 芯片研发的大爆发,越来越多的芯片设计、制造厂商甚至是云厂商都开始参与到芯片领域中来。面对芯片使用者尤其是处理器芯片与日俱增的需求,且芯片研发研发和流片成本高,芯片制造厂商必…

AIGC时代已经到来,如何满足其日益增长的算力需求

2023年是AI人工智能技术全面爆红的一年。以ChatGPT、GPT-4、文心一言为代表的AIGC大模型,集文本撰写、代码开发、诗词创作等功能于一体,展现出了超强的内容生产能力,带给人们极大震撼。 AIGC是什么? AIGC,AI-Generat…

【鲁棒优化、机会约束】不确定风功率接入下电 - 气互联系统的协同经济调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【kubernetes系列】Kubernetes之pod、lable和annotation

本章节将继续分享关于kubernetes中的一些重要概念。 一、Pod Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到某个 Node 上运行。(可以把pod想象成豌豆荚,里面的豌豆就是容器,可以有一个…

Go编写免杀木马

先看一下效果 微步云沙箱检测 文件目录,运行main.exe cs上线 这里window denfender一直开启 思路: 分为三个文件: main.gox1.bin(加密后的exe文件)x2.bin(加密后的shellcode文件) 启动ma…

Linux Mint 21.2 前瞻:触控板手势支持来了

导读Linux Mint 是一款基于 Ubuntu 的流行 Linux 发行版本,其最新版本 21.2 将于 7 月发布。据悉,Linux Mint 的触摸板手势基于开源软件 TouchEgg,该手势功能支持触摸板、触摸屏及平板电脑等终端,用户可以自定义多种手势&#xff…

1751_使用Perl进行目录的创建于删除

全部学习汇总: GreyZhang/perl_basic: some perl basic learning notes. (github.com) 不管是用Perl还是Python,之前写代码的时候遇到需要进行目录的创建或者删除指令的时候我通常会直接调用Windows的相关命令或者使用移植过来的bash shell命令。其实&am…

视频汇聚融合共享EasyCVR平台如何在分享页增加控制台跳转?

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 在Ea…

MKDCNet分割模型搭建

原论文:https://arxiv.org/abs/2206.06264v1源码:https://github.com/nikhilroxtomar/MKDCNet 直接步入正题~~~ 一、基础模块 class Conv2D(nn.Module):def __init__(self, in_c, out_c, kernel_size3, padding1, dilation1, biasFalse, actTrue):sup…

2.8C++继承和组合

C 继承和组合 C中的继承和组合都是面向对象的重要概念,它们可以帮助我们构建更加灵活和可扩展的程序。 继承是一种机制,它允许我们创建一个新的类,该类从现有的类中继承属性和方法。 在C中,我们使用关键字 class 或 struc 来定…

华为云obs桶授权

登录华为云控制台 https://auth.huaweicloud.com/authui/login.html?servicehttps://console.huaweicloud.com/console/#/login 进入并行文件系统页面 进入桶 添加ACL授权,填写被授权账号ID,点击确定即可

IMX6ULL系统移植篇-镜像烧写说明

一. 镜像烧写简介 之前一篇文章学习了 阿尔法开发板烧写镜像的方法。 即将 镜像烧写到 Nand-Flash内部,设备最终从 Nand-Flash启动。说明博文如下: IMX6ULL系统移植篇-镜像烧写方法_凌肖战的博客-CSDN博客 二. 镜像烧写说明 之前文章说明了 使用 mfg…

基于vue+Element Table 表格的封装

项目场景&#xff1a; 项目场景&#xff1a;需要频繁使用列表进行呈现数据&#xff0c;不可能每次都写一个表格&#xff0c;可以将表格封装为一个组件&#xff0c;在需要使用时可以直接调用。 效果展示&#xff1a; 项目结构&#xff1a; 具体实现&#xff1a; Table.vue <…

总结linux防火墙firewall端口开通步骤

之前开通过服务器端口&#xff0c;在这里也记录和分享一下。 Step1:检查白名单&#xff1a; sudo firewall-cmd --list-port step2:添加8080端口到白名单 [user zhangsan ~]$ sudo firewall-cmd --zonepublic --add-port8080/tcp --permanent Success Step3&#xff1a;r…

UR5机器人示教器使用——可视化控制部分(非编程)

感谢董青云师兄教我使用示教器 1.UR5机器人示教器 问师兄 3楼 UR-robotic 的控制 示教器相关内容&#xff08;UR5机器人的控制&#xff0c;有UR机器人的仿真环境&#xff0c;需要在虚拟器上运行&#xff09; 1.示教器上的控制有正逆控制&#xff1a;逆向运动学通常用于计算机…

同态加密的类型,同态加密示例

目录 什么是同态加密 同态加密的类型 同态加密示例 什么是同态加密 同态加密&#xff08;Homomorphic Encryption&#xff09;是指将原始数据经过同态加密后&#xff0c;对得到的密文进行特定的运算&#xff0c;然后将计算结果再进行同态解密后得到的明文等价于原始明文数据…

DJI AIR 2S

一、注意事项 注意&#xff1a; 1、侧飞时需要注意&#xff0c;没有侧向避障 2、返航高度设置&#xff0c;应高于飞行区域高楼高度&#xff08;如269m&#xff09; 3、遥控与飞机之间不能有建筑物遮挡&#xff0c;如果出现信号弱&#xff08;上升高度会改善信息&#xff09; 4、…

doris on k8s 的安装部署

官方文档 1. 按照官网提供地址下载部署文件 2. 修改内核配置 sysctl -w vm.max_map_count20000003. 根据服务器环境&#xff0c;修改doris_be.yml文件。 # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the…

深度学习编译器对比:The Deep Learning Compiler A Comprehensive Survey

参考&#xff1a;The Deep Learning Compiler: A Comprehensive Survey 记录几种深度学习编译器的功能和性能的对比&#xff1b; TVM在CPU和GPU的表现最好&#xff1b; MobileNet:TVM在conv、linear、expand表现最好&#xff1b;XLA在dewise的表现最好&#xff1b;