课后作业
①数据集准备
以糖尿病数据集(diabetes.csv)为例,数据集免费下载,仅供学习使用。
下载完解压,将解压后得到的压缩包放到指定的路径下,我这边放到了我的jupyter里面了
数据集是一个以逗号分割的数据集,有九个特征,八个输入,一个输出
八个维度的输入分别是不同的患者参数,输出表示一年后是否患糖尿病
②加载数据集
np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)
加载指定位置的数据集diabetes.csv.gz,以,
进行分割,数据的类型为np.float32
一般的Nvidia显卡仅支持float32的数据类型,较为贵的GPU像Tesla显卡才支持double类型,不过float32够用了
torch.from_numpy(data[:,:-1])
将数据集data中的[:,:-1]
所有行,[0,-1)除了最后一列所有数据取出来,以矩阵的形式返回
torch.from_numpy(data[:,[-1]])
数据集data中的所有行,[-1]
表示仅最后一列,且以向量形式返回
import numpy as np
import torch
import matplotlib.pylab as plt #绘图
# 加载数据集
data = np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)
x = torch.from_numpy(data[:,:-1])
y = torch.from_numpy(data[:,[-1]])
epoch_all = [] #存epoch方便绘图
loss_all = [] #存每次的loss方便绘图
x为输入数据,八维度;y为输出结果,0或1
③模型架构搭建
通过线性层,先将输入数据从8维度降到6维度,再通过一个非线性激活函数sigmoid;
以此类推,6降4;4降2;2降1;最终得到一个1维的结果;
class y_model (torch.nn.Module):
def __init__(self):
super(y_model,self).__init__()
self.linear_1 = torch.nn.Linear(8,6)
self.linear_2 = torch.nn.Linear(6,4)
self.linear_3 = torch.nn.Linear(4,2)
self.linear_4 = torch.nn.Linear(2,1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self,x):
x = self.sigmoid(self.linear_1(x))
x = self.sigmoid(self.linear_2(x))
x = self.sigmoid(self.linear_3(x))
x = self.sigmoid(self.linear_4(x))
return x
ymodel = y_model()
④损失函数和优化器
损失函数选择MSELoss
优化器选择SGD
官网很多,不局限于这两个啊
size_average
要不要bais,也就那个b,负责微调的
lossf = torch.nn.MSELoss(size_average=False) #损失函数
optimzer = torch.optim.SGD(ymodel.parameters(),lr=0.001) #优化器
#不同优化器的选择,只需要把SGD改成其他的优化器即可
⑤训练
for epoch in range(1000):
y_hat = ymodel(x)
loss = lossf(y_hat ,y)
print(epoch,loss.item())
epoch_all.append(epoch)
loss_all.append(loss)
optimzer.zero_grad()
loss.backward()
optimzer.step()
⑥绘图
plt.plot(epoch_all,loss_all)
plt.ylabel("loss")
plt.xlabel("epoch")
plt.show()
⑦完整代码
import numpy as np
import torch
import matplotlib.pylab as plt
# 加载数据集
data = np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)
x = torch.from_numpy(data[:,:-1])
y = torch.from_numpy(data[:,[-1]])
epoch_all = []
loss_all = []
class y_model (torch.nn.Module):
def __init__(self):
super(y_model,self).__init__()
self.linear_1 = torch.nn.Linear(8,6)
self.linear_2 = torch.nn.Linear(6,4)
self.linear_3 = torch.nn.Linear(4,2)
self.linear_4 = torch.nn.Linear(2,1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self,x):
x = self.sigmoid(self.linear_1(x))
x = self.sigmoid(self.linear_2(x))
x = self.sigmoid(self.linear_3(x))
x = self.sigmoid(self.linear_4(x))
return x
ymodel = y_model()
lossf = torch.nn.MSELoss(size_average=False) #损失函数
optimzer = torch.optim.SGD(ymodel.parameters(),lr=0.001) #优化器
#不同优化器的选择,只需要把SGD改成其他的优化器即可
for epoch in range(1000):
y_hat = ymodel(x)
loss = lossf(y_hat ,y)
print(epoch,loss.item())
epoch_all.append(epoch)
loss_all.append(loss)
optimzer.zero_grad()
loss.backward()
optimzer.step()
plt.plot(epoch_all,loss_all)
plt.ylabel("loss")
plt.xlabel("epoch")
plt.show()
⑧测试
这我哪知道如何测试啊,随便从数据集中巴拉一个吧
-0.411765,0.165829,0.213115,0,0,-0.23696,-0.894962,-0.7,1
test = torch.Tensor([[-0.411765,0.165829,0.213115,0,0,-0.23696,-0.894962,-0.7]])
print("predect:",ymodel(test).item())
"""
predect: 0.6534900069236755
"""
效果还行,最起码大于0.5,也就是偏向于1呗。