本节刘老师主要讲的是如何处理多维特征的输入,其实本节的内容主要还是接着上节的一维的特征输入,将特征改为多特征的输入,数据集用的是Diabetes Dataset,这是包括8*8的输入和8*1 的输出,具体数据集如下:其实处理这个多特征的问题和单特征的问题方法大同小异,同样分为4个模块,准备数据集、创造模型、构建损失函数和优化器、循环训练
详细代码:
import torch
import numpy as np
import matplotlib.pyplot as plt
#准备数据集
xy = np.loadtxt('C:/Users/C/Desktop/pytorch实战/pytorch实战/diabetes.csv.gz',delimiter=',',dtype=np.float32)
x_data = torch.from_numpy(xy[:,:-1])
y_data = torch.from_numpy(xy[:,[-1]])
#构建模型
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8,6)
self.linear2 = torch.nn.Linear(6,4)
self.linear3 = torch.nn.Linear(4,1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self,x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model()
#构建损失函数和优化器
Loss = torch.nn.BCELoss(size_average=False)
Optim = torch.optim.SGD(model.parameters(),lr=0.01)
#循环训练
loss_list = []
for epoch in range(1000):
#前馈传播
y_pred = model(x_data)
loss = Loss(y_pred,y_data)
print('epoch:',epoch,'loss',loss.item())
loss_list.append(loss.item())
#反向传播
Optim.zero_grad()
loss.backward()
#更新
Optim.step()
#可视化
plt.style.use('seaborn')
plt.plot(loss_list,color = (0,0.5,0.5))
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
与视频中不同的是我将学习率改为了0.01,因为我设置学习率为0.1时,得到的可视化结果如下:
?损失值不降反升,故我将学习率调小,设置成0.01,得到如下结果
可以看出,训练的效果仍然不是特别的好,可能的原因:一、参数设置;二、激活函数的选择;三、优化器的选择;四、训练轮数不够
所以我将训练轮数改为5000,得到如下结果?
?可以看出损失由一定程度的下降。而我又将优化器改成Adam,在此训练5000轮得到的效果:
发现在这个问题上,Adam优化器训练效果比SGD优化器要好很多。我还对激活函数做了对比,就不一一展示,继续跟着刘老师学习,和小伙伴分享我的收获。?
|