pytroch使用——(一)张量
一、基础知识
1、张量概念:多维数组
2、Vaiable:用于封装张量(因为需要对张量计算,如求导等,因此封装成一组对象)
data:被包装的数据、gard:张量梯度、grad_fn:记录张量所被应用的计算,主要还是用于求导、resquires_grad;是否求导、is_leaf:指示是否是叶子结点,用于构建结构图。注:device:表示张量所在设备,是加速的关键。
3、张量创建
1)直接创建:
pytorch.tensor(),已经有数据了,有点像数据转化。
2)从numpy创建tensor:
torch.from_numpy(ndarray)。注:内存共享,该ndarray则tensor变化,反之也是。
3)依据数值创建:
torch.zeros(),layout:内存中的存储形式,默认即可(另一种是稀疏存储)
torch.ones_like():依据input形状创建全1张量。
torch.full()/ torch.full_like():依据input形状创建全value张量。
torch.arrange():创建等差数列。
torch.linespace():创建均分的一维数列。
torch.eye():创建单位对角矩阵(二维)。
4)依概率分步:
torch.normal(),正态分布。
torch.randn()/torch.randn_likes(),标准正态分布。
torch.rand()/torch.rand_likes(),均匀分布。
torch.randint()/torch.randint_likes(),整数均匀分布。
torch.randperm():生成0-1的随机排列。
torch.bernoulli(): 以input为概率生成伯努利分布。
4、张量操作
1)张量拼接与切分:
(1)troch.cat(inputs, dimension=0,out=None)、dim:沿着此维连接张量序列
(2)troch.stack(inputs, dimension=0,out=None)、dim:沿着此维连接张量序列
(3)torch.chunk(tensor, chunks, dim=0)、chunks:切分的分数(若不能整除,则最后一个张量长度小于其他张量)
(4)torch.split(tensor, split_size, dim=0)、split_size:为int时表示每一份的长度,为list时用其元素分块,list和一定要等于维度。
2)张量索引:
(1)torch.index_select(input, dim, index, out=None)、dim:要索引的维度,index:索引的序号
(2)torch.masked_select(input,mask,out=None)、mask: 与input同形状的布尔类型张量/t.ge():筛选函数,与mask常连用。
3)张量变换:
(1)torch.reshape(input,shape),当张量在内存中是连续时,新张量与input共享数据内存
(2) torch.transpose(input,dim0,dim1),dim0、dim1: 要交换的维度
(3)torch.t(input),转置
(4)torch.squeeze(input,dim=None,out=None),dim: 若为None,移除所有长度为1的轴;若指定维度,且该轴长度为1,则移除(去除维度)。
(5) torch.unsqueeze(),dim: 扩展的维度。
4)张量运算:
torch.add(input,alpha=1,other,out=None),逐元素计算 input+alpha×other。
torch.addcmul(input,value=1,tensor1,tensor2,out=None),逐元素计算
torch.addcdiv(input,value=1,tensor1,tensor2,out=None),逐元素计算
二、问题讲解
1、为什么需要虚拟环境?
因为不同的项目使用的python版本不同,使用的包也不同,为了管理不同的项目使用虚拟环境进行使用。
2、stack与cat的区别?
当dim的值不存在时,stack会多创建一个这样的维度(在第0维度上创建),其值为1;cat则会报错。
3、chunk如何取整?向上取整
举例:将长度7分割成三块。7%3=2.333=3=【3,3,1】并不是【3,2,2】。同时,其分配切块时大块排在靠前的维度。
4、索引的常用数据类型:torch.long 64位整型
三、实例:线性回归(分析两个变量间的关系的方法)
1、步骤:
1)确定模型:y = wx + b
2)损失函数:均方误差
3)梯度更新:w = w – LR * w.grad、b = b – LR * w.grad。
2、代码:
import torch
import matplotlib.pyplot as plt
torch.manual_seed(10)
lr = 0.05 # 学习率 20191015修改
# 创建训练数据
x = torch.rand(20, 1) * 10 # x data (tensor), shape=(20, 1)
y = 2*x + (5 + torch.randn(20, 1)) # y data (tensor), shape=(20, 1)
# 构建线性回归参数
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)
for iteration in range(1000):
# 前向传播
wx = torch.mul(w, x)
y_pred = torch.add(wx, b)
# 计算 MSE loss
loss = (0.5 * (y - y_pred) ** 2).mean()
# 反向传播
loss.backward()
# 更新参数
b.data.sub_(lr * b.grad)
w.data.sub_(lr * w.grad)
# 清零张量的梯度 20191015增加
w.grad.zero_()
b.grad.zero_()
# 绘图
if iteration % 20 == 0:
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)
plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.xlim(1.5, 10)
plt.ylim(8, 28)
plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))
plt.pause(0.5)
if loss.data.numpy() < 1:
break
Hello ! Mr.Lawrence: 最大似然估计P(X|Y)是不是推错了,和书上的结果不一样
hhhhhhhhhhkkkkkkkkkk: NEAT原论文全是英文,看不懂,终于找到一篇看起来比较好的了
Coding-Prince: 学习了
泰山AI: 都是博主辛苦创作,我来支持一下,奥利给!
OURUO1233: 谢谢