api知识:
torch.unsqueeze()这个函数主要是在指定维数对数据维度进行扩充
torch.squeeze()与torch.unsqueeze()相反,删除维数为1的维度
import torch
import torch.nn as nn
#生成-100到100的1000个等差数列
x = torch.linspace(-100,100,1000)
#在指定位置dim=1增加维度
x = torch.unsqueeze(x,dim=1)
#定义y = 2*x + 1函数
y = 2*x + 1
#定义一个1*1的矩阵
matrix = nn.Linear(1,1)
print(matrix.weight)
#使用优化器求导更新矩阵权重
optimizer = torch.optim.Adam(matrix.parameters(),lr=0.01)
#训练次数
for _ in range(10000):
#value是x与矩阵matrix相乘后的值
value = matrix(x)
#与标签y值的平均方差
loss = torch.mean((value-y)**2)
#把上一次的梯度值清零,否则会影响本次反向传播的梯度值
matrix.zero_grad()
#反向传播
loss.backward()
#更新权重
optimizer.step()
print("第{}次训练权重值为:{},损失函数为:{},偏置值为:{}".format(_,matrix.weight.detach().numpy(),loss,matrix.bias.detach().numpy()))
#print("第{}次训练权重值为:{},损失函数为:{},偏置值为:{}".format(_, matrix.weight.numpy(), loss, matrix.bias.numpy()))
出现报错现象:
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
将PyTorch Tensor类型的变量转换成numpy时报错。
解决办法:
出现这个现象的原因是:待转换类型的PyTorch Tensor变量带有梯度,直接将其转换为numpy数据将破坏计算图,因此numpy拒绝进行数据转换,实际上这是对开发者的一种提醒。如果自己在转换数据时不需要保留梯度信息,可以在变量转换之前添加detach()
调用。