线性回归例子
github的网址->day01
https://blog.csdn.net/qq_43570557/article/details/122618446?spm=1001.2014.3001.5502
代码(详细注解)
#此例子是模拟线性回归
# (假设网络只有一层FC层)
import torch
import torchvision
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
#1.先设置所需要我的超参数
#Linear的输入、输出节点数,学习率,num_epochs
input_size=1
output_size=1
num_epochs=60
learning_rate=0.001
#2.设置数据集
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
[9.779], [6.182], [7.59], [2.167], [7.042],
[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
[3.366], [2.596], [2.53], [1.221], [2.827],
[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
#3.构建网络
model=nn.Linear(input_size,output_size)
#选择损失函数
criterion=nn.MSELoss()
#选择优化器
optimizer=torch.optim.SGD(params=model.parameters(),
lr=learning_rate)
#4.训练模型
for epoch in range(1,num_epochs+1):
#读取数据
X_train=torch.from_numpy(x_train)
Y_train=torch.from_numpy(y_train)
#forward
prev_y=model(X_train)
#计算损失
loss=criterion(prev_y,Y_train)
#backward and optimize
#清空grad
optimizer.zero_grad()
loss.backward()
optimizer.step()
#做一个判断(是否输出损失)
if epoch%5==0:
print('Epoch [{}/{}],Loss:{:.4f}'.format(epoch,num_epochs,loss.item()))
#小数点之后保留四位
#5.detach()[source]
# 返回一个新的Variable,从当前计算图中分离下来的,
# 但是仍指向原变量的存放位置,不同之处只是requires_grad为false,
# 得到的这个Variable永远不需要计算其梯度,不具有grad。
# 即使之后重新将它的requires_grad置为true,它也不会具有梯度grad
#这预测是X与Y一一对应
predict=model(torch.from_numpy(x_train)).detach().numpy()
#6.画图
#由于plot是画直线图的,所以原始数据点要设置“ro”
plt.plot(x_train,y_train,"ro",label="original data")
plt.plot(x_train,predict,label="fitted line")
plt.legend() #图例显示label的
plt.show()