mport torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('C:\\Users\\qjjt\\Desktop\\python\\dataset\\part2\\income1.csv')//记得双杠
data.head()
print(data)//打印
data.info()//查看数据集信息
plt.scatter(data.Education,data.Income)//画分布图
plt.xlabel('Education')
plt.ylabel('Income')
X = torch.from_numpy(data.Education.values.reshape(-1,1)).type(torch.FloatTensor)
Y = torch.from_numpy(data.Income.values.reshape(-1,1)).type(torch.FloatTensor)
print(data.Education.values.reshape(-1,1))
plt.show()
print(X.shape)
#创建模型,必须从nn.module集成
class EImodle(nn.Module):
def __init__(self): #初始化方法
super(EImodle, self).__init__() #初始化集成的modle属性。
# 创建一个linera层,根据输入输出的维度,自动初始化一个w和b,然后加权计算
#in_features为输入的特征值的长度,此处为1,输出也是
self.linear = nn.Linear(in_features=1, out_features=1)
def forward(self, inputs): #定义方法,如何在计算时应用这些层
logits = self.linear(inputs) #输入经过linear层得到一个输出
return logits
model = EImodle() #类实例化
#线性回归的损失函数是均方误差,pytorch有内置,可直接调用
loss_fn = nn.MSELoss()
#优化函数,梯度下降,有内置
opt = torch.optim.SGD(model.parameters(), lr=0.0001) #用随机梯度下降优化模型参数,并且输入学习率
#训练
for epoch in range(5000):
#同时对x,y进行迭代,保证一一对应
for x, y in zip(X, Y):
y_pred = model(x) #x被modle里的forward调用,最后返回一个logits值赋给y_pred
loss = loss_fn(y_pred, y)
opt.zero_grad() #在开始新的循环时清零之前累积的梯度值
#计算梯度,改变参数
loss.backward() #损失反向传播
opt.step() #优化参数
#查看值
list(model.parameters()) #优化后的参数值
print(list(model.parameters()))
list(model.named_parameters())#这个会告诉当前变量的名字
print(list(model.named_parameters()))
print(model.linear.weight, model.linear.bias)
#绘图验证
plt.scatter(data.Education, data.Income)
plt.xlabel('Education')
plt.ylabel('Income')
plt.plot(X, model(X).detach().numpy(), c='r')
plt.show()
data.Education.values.reshape(-1,1):data.Education.values是一个有30个变量的数组,这里改变其形态,转变为30个一行一列维度为1的输入。左边的-1位自动计算,数组中有几个数据就多少行,右边的1直接定义了列数只为1。这样更符合输入的定义
加了torch.from_numpy 后,从array转为pytorch的tensor数据类型
type(torch.FloatTensor):转化为FloatTensor模式
X.shape:可看见输入为30个长度为1的输入
内置损失函数MSELoss:可看写法举例,然后看要输入什么参数
注意:期间运行时有个报错
原因是代码写的不规范。这里把forward函数卸载了modle外,等于模型中没有了前向传递这个函数