torch.tensor()
功能: 从data创建tensor
torch.tensor(
data,
dtype = None,
device = None,
requires_grad = False;
pin_memory = False)
#方法一:
arr = np.ones((3, 3))
t = torch.tensor(arr, device='cuda')
功能: 从numpy创建tensor
注意事项: 从torch.from_numpy
创建的tensor与原ndarray
共享内存,当修改其中一个的数据,另一个也将被改动
#方法二:
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
torch.zeros()
功能: 依size创建全 0 张量
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out = out_t)
print(id(t), id(out_t), id(t) == id(out_t))
#1910503281032 1910503281032 True
由上可知道, out
的实际功能就是将 torch.zeors
生成的张量赋值给 out_t
包括地址
功能: 依input
形状创建全0张量
torch.zeors_like(
input,
dtype=None,
layout=None,
device=None,
requires_grad=False
)
torch.full(
size,
fill_value,
out=None
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.full((3, 3), 10)
功能: 创建等差的 1 维张量
注意事项: 数值区间为 [start, end)
torch.arange(start=0,
end,
step=1,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.arange(2, 10 ,2)
功能: 创建均分的 1 维张量
注意事项: 数值区间为 [start, end]
torch.arange(start,
end,
step=100,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
t = torch.linespace(2, 10, 6) #tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 10.0000 ])
功能: 生成正态分布(高斯分布)
torch.normal(mean, std, out=None)
torch.normal(mean, std, size, out=None)
当都是标量的时候,需要添加size
四种模式:
功能: 生成标准正态分布
cat()
不会扩张张量纬度, 而stack()
会扩张张量的纬度
torch.cat(tensors, dim=0, out=None)
t = torch.ones((2, 3))
t_cat = torch.cat([t, t], dim=0) #([4, 3])
# t_cat = torc.cat([t, t, t], dim=1) #([2, 9])
torch.stack(tensors, dim=0, out=None)
t = torch.ones((2, 3))
t_stack = torch.stack([t, t], dim=2) #([2, 3, 2])
#t_stack = torch.stack([t, t], dim=0) #([2, 2, 3])
#t_stack = torch.stack([t, t, t], dim=0) #([3, 2, 3])
功能: 将张量按纬度dim进行平均切分
返回值: 张量列表
注意事项: 若不能整除,最后一份张量小于其他张量
torch.chunk(input, chunks, dim=0)
a = torch.ones((2, 5))
list_of_tensors = torch.chunk(a, dim=1, chunks=2)
for idx, t in enumerate(list_of_tensors):
print("第{}个张量:{}, shape is {}".format(idx+1, t , t.shape))
'''
第1个张量: tensor([[1., 1., 1.],
[1., 1., 1.]]), shape is torch.Size([2, 3])
第2个张量: tensor([[1., 1.],
[1., 1.]]), shape is torch.Size([2, 2])
'''
功能: 将张量按纬度 dim 进行切分
返回值: 张量列表
torch.split(tensor, split_size_or_sections, dim=0)
t = torch.ones((2, 5))
list_of_tensors = torch.split(t, [2, 1, 2], dim=1)
#第一个张量shape is torch.size([2, 2]) following: size([2, 1]), size([2, 2])
功能: 在纬度 dim 上,按 index 索引数据
返回值: 依 index 索引数据拼接的张量
torch.index_select(input, dim, index, out=None)
t = torch.randint(0, 9, size=(3, 3))
idx = torch.tensor([0, 2], dtype=torch.long)
t_select = torch.index_select(t, dim=1, index=idx)
print("t:\n{}\nt_select:\n{}".format(t, t_select))
'''
t:
tensor([[1, 3, 4],
[8, 2, 0],
[8, 1, 4]])
t_select:
tensor([[1, 4],
[8, 0],
[8, 4]])
'''
功能: 变换张量形状
注意事项: 当张量在内存中时连续时,新张量与 input 共享数据内存
torch.reshape(input, shape)
功能: 交换张量的两个纬度
功能: 2维张量转置,对矩阵而言,等价于 torch.transpose(input, 0, 1)
功能: 压缩长度为1的纬度(轴)
torch.squeeze(input, dim=None, out=None)
功能: 依据 dim 扩展纬度
torch.unsqueeze(input, dim, out=None)
import torch
import numpy as np
import matplotlib.pyplot as plt
torch.manual_seed(10) #随机数种子
lr = 0.1 #设置学习率
#创建训练数据
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.randn((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)
#绘图
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
计算图使用来描述运算的有向无环图
计算图有两个主要元素:结点(Node)和边(Edge)
结点表示数据,如向量,矩阵,张量
边表述运算,如加减乘除卷积等
用计算图表示:y = (x + w) * (w + 1)
a = x + w
b = w + 1
y = a * b
y = (x + w) * (w + 1)
a = x + w
b = w + 1
y = a * b
∂ y ∂ w = ∂ y ∂ a ∂ a ∂ w + ∂ y ∂ b ∂ b ∂ w \frac{\partial{y}}{\partial{w}}=\frac{\partial{y}}{\partial{a}}\frac{\partial{a}}{\partial{w}} + \frac{\partial{y}}{\partial{b}}\frac{\partial{b}}{\partial{w}} ∂w∂y=∂a∂y∂w∂a+∂b∂y∂w∂b
== b * 1 + a * 1
== b + a
== (w + 1) + (x + w)
== 2 * w + x +1
== 2 * 1 + 2 + 1 = 5