python学习11-Pytorch张量与数据处理1

ndarray

首先,我们介绍n维数组,也称为张量(tensor)

使用过Python中NumPy计算包的读者会对本部分很熟悉。

无论使用哪个深度学习框架,它的张量类(在MXNet中为ndarray,

在PyTorch和TensorFlow中为Tensor)都与Numpy的ndarray类似。

但深度学习框架又比Numpy的ndarray多一些重要功能:

首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算;

其次,张量类支持自动微分。

这些功能使得张量类更适合深度学习。

(首先,我们导入torch。请注意,虽然它被称为PyTorch,但是代码中使用torch而不是pytorch。)

python 复制代码
import torch

[ 张量表示一个由数值组成的数组,这个数组可能有多个维度]。

具有一个轴的张量对应数学上的向量(vector);

具有两个轴的张量对应数学上的矩阵(matrix);

具有两个轴以上的张量没有特殊的数学名称。

首先,我们可以使用 arange 创建一个行向量 x。这个行向量包含以0开始的前12个整数,它们默认创建为整数。也可指定创建类型为浮点数。张量中的每个值都称为张量的 元素(element)。例如,张量 x 中有 12 个元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

python 复制代码
x = torch.arange(12)
x
#  tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状

python 复制代码
x.shape
# 12

要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。

例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。

这个新的张量包含与转换前相同的值,但是它被看成一个3行4列的矩阵。

要重点说明一下,虽然张量的形状发生了改变,但其元素值并没有变。

注意,通过改变张量的形状,张量的大小不会改变。

python 复制代码
X = x.reshape(3, 4)
X
"""
tensor([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
"""

我们不需要通过手动指定每个维度来改变形状。

也就是说,如果我们的目标形状是(高度,宽度),

那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。

在上面的例子中,为了获得一个3行的矩阵,我们手动指定了它有3行和4列。

幸运的是,我们可以通过-1来调用此自动计算出维度的功能。

即我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。

有时,我们希望[使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。

我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。代码如下:

python 复制代码
torch.zeros((2, 3, 4))
"""
 tensor([[[0., 0., 0., 0.],
             [0., 0., 0., 0.],
             [0., 0., 0., 0.]],
            [[0., 0., 0., 0.],
             [0., 0., 0., 0.],
             [0., 0., 0., 0.]]])
"""

同样,我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。代码如下:

python 复制代码
torch.ones((2, 3, 4))
"""
tensor([[[1., 1., 1., 1.],
             [1., 1., 1., 1.],
             [1., 1., 1., 1.]],
            [[1., 1., 1., 1.],
             [1., 1., 1., 1.],
             [1., 1., 1., 1.]]])
"""

有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。

例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。

以下代码创建一个形状为(3,4)的张量。

其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。

python 复制代码
torch.randn(3, 4)
"""
 tensor([[ 0.7277, -1.3848, -0.2607,  0.9701],
            [-2.3290, -0.3754,  0.2457,  0.0760],
            [-1.2832, -0.3600, -0.3321,  0.8184]])
"""

我们还可以[通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值]。

在这里,最外层的列表对应于轴0,内层的列表对应于轴1。

python 复制代码
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
"""
 tensor([[2, 1, 4, 3],
            [1, 2, 3, 4],
            [4, 3, 2, 1]])
"""

超详细 LaTex数学公式

LaTex表达式是一种简单的、常见的一种数学公式表达形式,在很多地方都有出现,相信正在看博客的你会深有体会,LaTex表达式不难,甚至说很简单,但是对于没有没有接触过得小伙伴来说,会非常费脑,复杂的表达式到底该如何书写呢?

LaTex表达式一般分为两类:

一类是嵌入到文章中间的: log ⁡ 21 x y \log_{21} {xy} log21xy

另一类是单独成行的表达式:
log ⁡ 21 x y \log_{21} {xy} log21xy

所有的LaTex的书写形式都是在 $$...$$ 之中,只不过对于嵌入在文章中间而言 是单对的$...$,而单独成行的LaTex表达式是双对的 $$...$$

公式加粗、更改颜色、添加序号

对公式加粗需要用 \bm{ ...... }加之包含其中即可

python 复制代码
$\bm{ .... }$

更改公式字母颜色:

如果只更改个别字母,那个后面的需要用黑色再改下

python 复制代码
\color{red}\color{green}\color{back}

\color{green}。。。。。\color{back}。。。。

给公式添加序号:在公式最后添加 \tag{...}

python 复制代码
$$ ... \tag1$$
$$ ... \tag{1.1}$$        # 多位序号记得用{}扩起来

1、希腊字母

书写表达式,少不了使用希腊字母,但是LaTex 的希腊字母是什么呢?

2、运算符 & 空格

普通字符在数学公式中含义一样,除了 # $$ % & ~ _ ^ \ { } 若要在数学环境中表示这些符号# $$ % & _ { },需要分别表示为# $ % & _ { },即在个字符前加上\ 。

3、上下标

对于上标使用 下划线表示" _ " ;对于上标使用 " ^ "表示。比如

python 复制代码
$x_i^2$

的LaTex表达式为 $$x_i^2$$

LaTex表达式中的上下标可以叠加的,就比如

python 复制代码
 ${x^y}^z$ 

的LaTex表达式为 x y z {x^y}^z xyz 或者 x y z x^{y^z} xyz

在此需要注意的是:LaTex表达式默认的是 " _ " " ^ " 之后的一位才是上下标的内容,对于超过一个字母的上下标需要使用 { } 将它括起来,比如

python 复制代码
$x_{2i}^{2+b}$

的LaTex表达式为 x 2 i 2 + b x_{2i}^{2+b} x2i2+b。

4、log

log ⁡ \loglog的表达式会稍微简单点, log ⁡ \log log 就是它的LaTex表达式,同样的对于需要下标的同样使用下划线表示 " _ " , 对于多个字符组成的需要添加 { } 将其包括。

5、括号

LaTex表达式中的 ( ) 、 [ ] 均可以正常使用,但是对于 { } 需要使用转义字符使用,即使用 "{" 和 "}" 表示 { }

python 复制代码
f(x)=\begin{cases} x = \cos(t) \\y = \sin(t) \\ z = \frac xy \end{cases}

f ( x ) = { x = cos ⁡ ( t ) y = sin ⁡ ( t ) z = x y f(x)=\begin{cases} x = \cos(t) \\y = \sin(t) \\ z = \frac xy \end{cases} f(x)=⎩ ⎨ ⎧x=cos(t)y=sin(t)z=yx

python 复制代码
f(x)=\begin{cases} 0& \text{x=0}\\1& \text{x!=0} \end{cases}

对于个别符号,如 ()、[]等,如果想要变大,可以在 这些符号前面添加即可

python 复制代码
\Biggl   \biggl   \Bigl   \bigl   左符号
\Biggr   \biggr   \Bigr   \bigr   右符号

6、矩阵
0 1 1 0 \begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix} 0110

python 复制代码
\begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix}

\\begin{pmatrix} 0 \& -i \\ i \& 0 \\end{pmatrix}\\

python 复制代码
\begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}\\

[ 0 − 1 1 0 ] \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} [01−10]

python 复制代码
\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}

{ 1 0 0 − 1 } \begin{Bmatrix} 1 & 0 \\ 0 & -1 \end{Bmatrix} {100−1}

python 复制代码
\begin{Bmatrix} 1 & 0 \\ 0 & -1 \end{Bmatrix}

∣ a b c d ∣ \begin{vmatrix} a & b \\ c & d \end{vmatrix} acbd

python 复制代码
\begin{vmatrix} a & b \\ c & d \end{vmatrix}

7、求和与积分

8、开方

9、分数

10、特殊函数

11、导数、极限、积分

12、积分

积分中,需要注意的是,在多重积分内 dx 和 dy 之间 使用一个斜杠加一个逗号 , 来增大稍许间距。同样,在两个积分号之间使用一个斜杠加一个感叹号 ! 来减小稍许间距。使之更美观。

python 复制代码
\int_a^b f(x) dx 

∫ a b f ( x ) d x \int_a^b f(x) dx ∫abf(x)dx

python 复制代码
\int_0^{+\infty} x^n e^{-x} dx = n! 

∫ 0 + ∞ x n e − x d x = n ! \int_0^{+\infty} x^n e^{-x} dx = n! ∫0+∞xne−xdx=n!

python 复制代码
\int_{x^2 + y^2 \leq R^2}   f(x,y) dx dy = 
\int_{\theta=0}^{2\pi}    \int_{r=0}^R    f(r\cos\theta,r\sin\theta) r dr d\theta

∫ x 2 + y 2 ≤ R 2 f ( x , y ) d x d y = ∫ θ = 0 2 π ∫ r = 0 R f ( r cos ⁡ θ , r sin ⁡ θ ) r d r d θ \int_{x^2 + y^2 \leq R^2} f(x,y) dx dy = \int_{\theta=0}^{2\pi} \int_{r=0}^R f(r\cos\theta,r\sin\theta) r dr d\theta ∫x2+y2≤R2f(x,y)dxdy=∫θ=02π∫r=0Rf(rcosθ,rsinθ)rdrdθ

13、字体

pythorch实现手写数字识别模型

pip install torchvision

python 复制代码
#导入torchvision,用于处理图像和视频,转换成张量
from torchvision.transforms import ToTensor
import torchvision
import torch
import torch.nn as nn

# 加载数据集pytorch本身提供了经典的手写数据集
#加载训练集
train_ds = torchvision.datasets.MNIST(
    'data/',
    #指定加载训练集
    train=True,
    #将图像、numpy转换成pytorch张量
    transform=ToTensor(),
    download=True
)

#加载测试的数据集
test_ds = torchvision.datasets.MNIST(
    'data/',
    #指定加载训练集
    train=False,
    #将图像、numpy转换成pytorch张量
    transform=ToTensor(),
    download=True
)

#指定训练数据加载器
train_dl = torch.utils.data.DataLoader(
    train_ds,
    batch_size=64,
    #提高模型的泛华能力
    shuffle=True
)

test_dl = torch.utils.data.DataLoader(
    test_ds,
    batch_size=256,
    #提高模型的泛华能力
    shuffle=True
)

imgs,labels = next(iter(train_dl))

img = imgs[0]

import matplotlib.pyplot as plt
plt.imshow(img)
相关推荐
算法小白(真小白)1 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭1 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0071 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest1 小时前
python
开发语言·python·pygame
骑个小蜗牛2 小时前
Python 标准库:string——字符串操作
python
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
小A1593 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
岁岁岁平安3 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA3 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计