第七讲处理多维特征的输入

第七讲处理多维特征的输入的笔记和源码

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


结果图:


完结,如文章有何不妥,敬请指正,万分感谢! 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值