# pytorch

# pytorch

import torch
from torch import nn
from torch.nn import functional as F

from torch.autograd import Variable
from torch.nn import utils as nn_utils

"""指定device"""
device = torch.device(f"cuda:{args.gpu}" if torch.cuda.is_available() else "cpu")
"""清空显存"""
torch.cuda.empty_cache()

# 张量初始化及转换

张量: 多维数组

"""全为 0 的张量"""
torch.zeros(m, n)       # m × n 维张量
torch.zeros_like(input) # 和 input 形状一样的
"""全为 1 的张量"""
torch.ones(m, n)
torch.ones_like(input)
"""从 start 到 end 的序列"""
torch.arrange(start=0, end, step=1)
""" 全为某个值的张量"""
torch.full((m,n), fill_value)

"""随机初始化"""
torch.rand(size) # 每个值为 [0,1) 内均匀分布随机数
torch.rand_like(input)
torch.randn(size) # 每个值为标准正态分布 N(0,1) 内的随机数
torch.normal(mean, std, out=None) # 返回张量包括从给定参数mean, std 离散正态分布中抽取的随机数, mean/std 可以是张量, 代表每个书华晨宇元素相关的正态分布参数

"""tensor 2 numpy"""
tensor.numpy()
tensor.cpu().numpy() # 存储于 GPU 上的张量先转换到 CPU 上
"""numpy 2 tensor"""
torch.from_numpy(array)
"""tensor 2 list"""
tensor.tolist()
"""list 2 tensor"""
torch.Tensor(mylist)
"""tensor 2 number"""
tensor.item()

"""转移到GPU"""
tensor.cuda()
tensor.to("cuda")
"""转移到指定GPU"""
device = torch.device(f"cuda:{args.gpu}" if torch.cuda.is_available() else "cpu")
tensor.to(device)
tensor.to(tensor2.device) # 转移到 tensor2所在的GPU

# 张量基本运算

# 基本运算

"""加法"""
tensor + tensor
torch.add(x, y)
torch.add(x, y, out=x) # x变成加和后的值
x.add(y)
x.add_(y) # torch中末尾带 '_' 的方法都是 in-place 的操作
"""除法"""
torch.div(tensor, tensor)
"""指数"""
torch.pow(tensor, exponent, out=None)
"""开根号"""
torch.sqrt(tensor, out=None)
"""取绝对值"""
torch.abs(tensor, ut=None)
"""四舍五入到整数"""
torch.round(tensor, out=None)
"""向上取整"""
torch.ceil(tensor, out=None)
"""刀削函数: 把数据规范在 [min, max] 之间"""
torch.clamp(tensor, min, max, out=None)

# 乘法进阶 mm mat

"""与标量相乘 mul: multiply"""
tensor * 2
torch.mul(tensor, 2)
"""矩阵与向量 element-wise 逐元素相乘: 每列乘以行向量对应列的值"""
tensor * vector
torch.mul(tensor, vector)
"""矩阵与矩阵 element-wise 逐元素相乘"""
tensor * tensor
torch.mul(tensor, tensor)
"""矩阵与矩阵相乘
mm: matrix multiplication 二维矩阵乘法, 要求两个矩阵满足相乘的条件, 一般只计算两个二维矩阵, 不支持broadcast
bmm: batch matrix multiplication 三维批量矩阵乘法, 不支持broadcast
matmul: matrix product 混合矩阵乘法, 输入为二维时是普通的矩阵乘法; 输入有多维时, 把多出的一维作为batch提出来, 其他部分做矩阵乘法. 支持 broadcast
广播机制 (broadcast): 将较小的数组广播至较大的数组, 使两者形状互相兼容
"""
tensor @ tensor
torch.mm(tensor, tensor) # 一般只计算两个二维矩阵
torch.matmul(tensor, tensor)

matmul 介绍: https://pytorch.org/docs/stable/generated/torch.matmul.html#torch.matmul (opens new window)

例子:

"""tensor * attention weights
a: representation (batch, seq, hidden) 
b: attention  weights (batch, seq)
"""
torch.mul(a.permute(2, 0, 1), b).permute(1,2,0)
a * b.unsqueeze(-1).expand(-1,-1, a.size(-1))

# 聚合 max min mean

# 拼接/切分 cat stack chunk split

"""不增维拼接: cat"""torch.cat(tensor_tuple, dim_cat)"""增维拼接: stack 可以保留序列信息和矩阵信息"""torch.stack(tensor_tuple, dim_stack)"""切分成一定数量: chunk"""torch.chunk(tensor, chunk_num, dim_chunk)"""按列表数目切分: split"""torch.split(tensor, split_list, dim)

# 形状转换 squeeze view transpose permute pad

"""降维"""tensor.squeeze(dim_num)"""升维"""tensor.unsqueeze(dim_num)"""形状变换: 保证总元素个数不变, 要保证张量是连续的"""tensor.view(m, n)tensor.isconuous"""维度转置: 两个维度相交换"""tensor.tanspose(dim1, dim2)"""维度转置: 多个维度相交换, 数量需与张量维度匹配"""tensor.permute(dim1, dim2, dim3)"""用 0 填充"""F.pad(tensor, pad=(0, 0, 0, num), mode='constant', value=0) # 二维 - 在下面填充num行0

pad: https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html (opens new window)

# 常见功能

# earlystop

# 基础模板

# attention pooling

# 损失函数

(及参数)

# 优化器

# 避免过拟合

# 分布式训练