第七讲处理多维特征的输入的笔记和源码
B站 刘二大人 教学视频 传送门:处理多维特征的输入
这里一上来先敲黑板,有没有和我一样苦恼的报错!!!!
所以不要跟着视频里面去找那个数据集,大概率是里面的数据集有非数字字符的东西
ValueError: could not convert string to float 发生这个错误的通常原因都是:要转换成浮点数的字符串中包含 非数字字符 的东西,比如空字符串、字母都不可以转换为浮点数。
所以,我的建议是进入【刘二大人老师】的教学视频【链接在上方】置顶下载课件中下载,里面包含课件和数据集。
视频截图部份
1、数据集
糖尿病数据集
2、对于多个特征输入
我们应该把每个特征乘以一个权值,在逻辑回归的时候,将特征的值乘以相应权值再加上一个偏置值,最后放入sigmoid函数进行二分类。具体计算肯定是使用矩阵,如右边所示,具体推导就不一一介绍了。不清楚,可以看刘老师的视频。
3、从八维降到一维的运算过程,如下图
self.linear1=torch.nn.Linear(8,6)
self.linear2=torch.nn.Linear(6,4)
self.linear3=torch.nn.Linear(4,1)
为什么不从八维直接降低到一维,因为会损失信息太多,导致不准确。
4、损失、优化器
源码:注,这里使用的是Adam优化器 学习率为0.005 用不同优化器以及学习率会有不同的效果
import torch
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
xy=np.loadtxt('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__()
#输入8维 输出1维
self.linear1=torch.nn.Linear(8,32)
self.linear2=torch.nn.Linear(32,8)
self.linear3=torch.nn.Linear(8,4)
self.linear4=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))
x=self.sigmoid(self.linear4(x))
return x
#linearModel继承了nn.module对象,会调用该对象的__call__。__call__方法内部,会调用forward
model=Model()
criterion=torch.nn.BCELoss(reduction='mean')
optimizer=torch.optim.Adam(model.parameters(),lr=0.005)
epoch_list=[]
accept_list=[]
for epoch in range(3000):
#Forward
y_pred=model(x_data)
loss=criterion(y_pred,y_data)
#Backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.step()
if epoch %500 == 499:
y_pred_label = torch.where(y_pred >= 0.5, torch.tensor([1.0]), torch.tensor([0.0]))
accept = torch.eq(y_pred_label, y_data).sum().item() / y_data.size(0)
print("epoch",epoch,"loss = ", loss.item(), "acc = ", accept)
epoch_list.append(epoch)
accept_list.append(accept)
plt.plot(epoch_list,accept_list)
plt.xlabel('epoch')
plt.ylabel("accept")
plt.show()
print("success")
运行结果:
epoch 499 loss = 0.40699055790901184 acc = 0.8076416337285902
epoch 999 loss = 0.2465842366218567 acc = 0.9143610013175231
epoch 1499 loss = 0.13527891039848328 acc = 0.9631093544137023
epoch 1999 loss = 0.0894508883357048 acc = 0.9815546772068511
epoch 2499 loss = 0.07144498080015182 acc = 0.9841897233201581
epoch 2999 loss = 0.06440845131874084 acc = 0.9855072463768116
success
结果图:
完结,如文章有何不妥,敬请指正,万分感谢!