add函数 pytorch_pytorch常用函数

目录

自动求导

#encoding=utf8import torch

from torch.autograd import Variable

x = Variable(torch.Tensor([2]), requires_grad=True)

y = x + 2

z = y ** 2 + 3

print z

## 输出tensor([19.], grad_fn=)

z.backward()

## z=(x+2)^2+3==>dz/dx=2(x+2)print x.grad

## 输出tensor([8.])

torch常用操作

torch.nn

torch.nn.AdaptiveLogSoftmaxWithLoss

torch.nn.functional

torch.nn.Conv2d

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

in_channels(int) – 输入信号的通道

out_channels(int) – 卷积产生的通道

kerner_size(int or tuple) - 卷积核的尺寸

stride(int or tuple, optional) - 卷积步长

padding(int or tuple, optional) - 输入的每一条边补充0的层数

dilation(int or tuple, optional) – 卷积核元素之间的间距(空洞卷积时使用)

groups(int, optional) – 从输入通道到输出通道的阻塞连接数

bias(bool, optional) - 如果bias=True,添加偏置

正常的卷积如下:

输入图片的shape是(height, width, in_channels),

filter的shape是(height_f, width_f, in_channels),filter和输入的第三维必须相等。

对于一个filter而言,输出的图片是(height_o, width_o),注意,并没有第三维!!

所谓的outchannels就是filter的个数,所以输出是(height_o, width_o, out_channels)

卷积操作就是,将这个三维的filter(例如3x3x3)与输入图像的对应位置相乘,再将这27个数相加,得到的结果就是output的一个元素。

对于复杂的卷积,假设输入的尺度是\((N, C_{in},H,W)\),输出尺度\((N,C_out,H_out,W_out)\)

\[

out(N_i, C_{out_j})=bias(C_{out_j})+\sum^{C_{in}-1}_{k=0}weight(C_{out_j},k)\bigotimes input(N_i,k)

\]

\(\bigotimes\): 表示二维的相关系数计算 stride: 控制相关系数的计算步长

groups: 控制输入和输出之间的连接:

group=1,输出是所有的输入的卷积;

group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。

参数kernel_size,stride,padding,dilation也可以是一个int的数据,此时卷积height和width值相同;也可以是一个tuple数组,tuple的第一维度表示height的数值,tuple的第二维度表示width的数值

shape:

input: \((N,C_{in},H_{in},W_{in})\)

output: \((N,C_{out},H_{out},W_{out})\)

\(H_{out}=floor((H_{in}+2padding[0]-dilation[0](kernerl\_size[0]-1)-1)/stride[0]+1)\)

\(W_{out}=floor((W_{in}+2padding[1]-dilation[1](kernerl\_size[1]-1)-1)/stride[1]+1)\)

torch.nn.MaxPool2d

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

pooling的基本思想,与卷积的运算基本一样,区别在于,filter和原图像做的不是卷积操作,而是对原图像的filter大小的区域做max/min之类的操作,而且filter并没有第三维,输入和输出的第三维是一样的。

针对pooling,并没有需要学习的参数。

如果输入的大小是(N,C,H,W),那么输出的大小是(N,C,H_out,W_out)和池化窗口大小(kH,kW)的关系是:

\[

out(N_i, C_j,k)=\max^{kH-1}_{m=0}\max^{kW-1}_{m=0}input(N_{i},C_j,stride[0]h+m,stride[1]w+n)

\]

如果padding不是0,会在输入的每一边添加相应数目0

参数kernel_size,stride, padding,dilation数据类型: 可以是一个int类型的数据,此时卷积height和width值相同; 也可以是一个tuple数组(包含来两个int类型的数据),第一个int数据表示height的数值,tuple的第二个int类型的数据表示width的数值

kernel_size(int or tuple) - max pooling的窗口大小

stride(int or tuple, optional) - max pooling的窗口移动的步长。!!!!默认值是kernel_size!!!!!!

padding(int or tuple, optional) - 输入的每一条边补充0的层数

dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数

return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助

ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作

shape:

输入: \((N,C,H_{in},W_{in})\)

输出: \((N,C,H_{out},W_{out})\)

\(H_{out}=floor((H_{in} + 2padding[0] - dilation[0](kernel\_size[0] - 1) - 1)/stride[0] + 1\)

\(W_{out}=floor((W_{in} + 2padding[1] - dilation[1](kernel\_size[1] - 1) - 1)/stride[1] + 1\)

torch.nn.Embedding

https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#sparse-layers。一个保存了固定字典和大小的简单查找表。这个模块常用来保存词嵌入和用下标检索它们。模块的输入是一个下标的列表,输出是对应的词嵌入。torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)。

num_embeddings:嵌入字典的大小。

embedding_dim:每个嵌入向量的大小。

padding_idx:如果提供的话,输出遇到此下标时用零填充。

max_norm:如果提供的话,会重新归一化词嵌入,使它们的范数小于提供的值。

norm_type:对于max_norm选项计算p范数时的p。

scale_grad_by_freq:如果提供的话,会根据字典中单词频率缩放梯度。

torch

torch.addmm

对矩阵mat1和mat2进行矩阵乘操作(用@表示)。矩阵mat加到最终结果。out=(beta∗M)+(alpha∗mat1@mat2)。torch.addmm(beta=1, mat, alpha=1, mat1, mat2, out=None)

torch.mm

对矩阵mat1和mat2进行相乘。torch.mm(mat1, mat2, out=None)

torch.bmm

对存储在两个批batch1和batch2内的矩阵进行批矩阵乘操作。torch.bmm(batch1, batch2, out=None)

用法:

>>> batch1 = torch.randn(10, 3, 4)

>>> batch2 = torch.randn(10, 4, 5)

>>> res = torch.bmm(batch1, batch2)

>>> res.size()

torch.Size([10, 3, 5])

torch.unsqueeze

返回一个新的张量,对输入的指定位置插入维度1。注意: 返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。

用法:

>>> max_len=10

>>> position = torch.arange(0, max_len).float().unsqueeze(1)

>>> position

tensor([[0.],

[1.],

[2.],

[3.],

[4.],

[5.],

[6.],

[7.],

[8.],

[9.]])

>>> position = torch.arange(0, max_len).float().unsqueeze(0)

>>> position

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

>>>

torch.Tensor

view

view(*args): 返回一个有相同数据但大小不同的tensor。 返回的tensor必须有与原tensor相同的数据和相同数目的元素,但可以有不同的大小。(类似reshape)

masked_fill_

masked_fill_(mask, value): 在mask值为1的位置处用value填充。mask的元素个数需和本tensor相同,但尺寸可以不同。

PyTorch Lightning Metric 是 PyTorch Lightning 中用于评估模型性能的一种工具。Metric 可以用于监控训练过程中的指标,并在每个 epoch 结束时输出结果。PyTorch Lightning Metric 提供了多种内置的评估指标,如 accuracy、precision、recall、F1 等,并且可以自定义评估指标。 使用 PyTorch Lightning Metric 的基本步骤如下: 1. 定义 Metric 类,继承自 `pl.metrics.Metric` 2. 在类中实现 `update` 方法,用于更新评估指标 3. 在类中实现 `compute` 方法,用于计算最终的评估结果 4. 在 LightningModule 中使用 `self.log()` 方法输出评估结果 例如,下面是一个计算 accuracy 的 Metric 类的示例代码: ```python import torch import pytorch_lightning as pl class Accuracy(pl.metrics.Metric): def __init__(self, dist_sync_on_step=False): super().__init__(dist_sync_on_step=dist_sync_on_step) self.add_state("correct", default=torch.tensor(0), dist_reduce_fx="sum") self.add_state("total", default=torch.tensor(0), dist_reduce_fx="sum") def update(self, preds, target): preds = torch.argmax(preds, dim=1) self.correct += torch.sum(preds == target) self.total += target.numel() def compute(self): return self.correct.float() / self.total ``` 在 LightningModule 中使用该 Metric 可以如下使用: ```python class MyModel(pl.LightningModule): def __init__(self): super().__init__() self.accuracy = Accuracy() def training_step(self, batch, batch_idx): ... self.accuracy(preds, target) ... def training_epoch_end(self, outputs): ... self.log('train_acc', self.accuracy.compute(), on_step=False, on_epoch=True) ... ``` 在每个 epoch 结束时,`self.accuracy.compute()` 方法将计算 accuracy 并返回最终的评估结果。`self.log()` 方法用于输出评估结果,其中 `on_epoch=True` 表示只在每个 epoch 结束时输出,而不是每个 batch 结束时都输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值