Python线性网络实现分类糖尿病病例
作者:Henry_zs 发布时间:2022-03-13 11:23:25
1. 加载数据集
这次我们搭建一个小小的多层线性网络对糖尿病的病例进行分类
首先先导入需要的库文件
先来看看我们的数据集
观察可以发现,前八列是我们的feature ,根据这八个特征可以判断出病人是否得了糖尿病。所以最后一列是1,0 的一个二分类问题
我们使用numpy 去导入数据集,delimiter 是定义分隔符,这里我们用逗号(,)分割
将前八列的特征放到我们的x_data里面,作为特征输入,最后一列放到y_data作为label
Tip :这里y_data 里面的 [-1] 中括号不可以省略,否则y_data会变成向量的形式
如果不习惯这种写法,可以用view改变一下形状就行
y_data = torch.from_numpy(xy[:,-1]).view(-1,1) #将y_data 的代码改成这样就可以了
下面是xy , x_data , y_data 打印出前两行的结果
2. 搭建网络+优化器
搭建网络的时候,要保证两层网络之间的维数能对应上
首先第一层的时候,因为前八列作为我们的x_data ,也就是说我们输入的特征是 8 维度的,那么由于 y = x * wT + b ,因为输入数据的x是(n * 8) 的,而我们定义的y维度是(n * 6) ,所以wT的维度应该是(8,6)
这里不需要知道啥时候转置,啥时候不转置之类的,只要满足线性的方程y = w*x+b,并且维度一致就行了。因为不管是转置,或者w和x谁在前,只是为了保证满足矩阵相乘而已
一个小的技巧就是:只需要看输入特征是多少,然后保证第一层第一个参数对应就行了,然后第一层第二个参数是想输出的维度。其次是第二层的第一个参数对应第一层第二个参数,以此类推....
我们采用的激活函数是ReLU , 由于是二元分类,最后一个网络的输出我们采用sigmoid输出
接下来,搭建实例化我们的网络,然后建立优化器
这里我们选择SGD随机梯度下降算法,学习率设置为0.01
3. 训练网络
训练网络的过程较为简单,大概的过程为
1. 计算预测值
2. 计算损失函数
3. 反向传播,之前要进行梯度清零
4. 梯度更新
5. 重复这个过程,epoch 为所有样本计算一次的周期,这次让epoch 迭代1000次
4. 代码
import torch.nn as nn # 神经网络库
import matplotlib.pyplot as plt # 绘图
import torch # 张量
from torch import optim # 优化器库
import numpy as np # 数据处理
xy = np.loadtxt('./diabetes.csv.gz',delimiter=',',dtype=np.float32) # 加载数据集
x_data = torch.from_numpy(xy[:,:-1]) # 所有行,除了最后一列的元素
y_data = torch.from_numpy(xy[:,-1]).view(-1,1) # -1也能拿出来是向量,但是[-1]会保证拿出来的是个矩阵
epoch_list =[]
loss_list = []
class Model(nn.Module):
def __init__(self):
super(Model,self).__init__()
self.linear1 = nn.Linear(8,6)
self.linear2 = nn.Linear(6,3)
self.linear3 = nn.Linear(3,1)
self.sigmoid = nn.Sigmoid()
self.relu = nn.ReLU()
def forward(self,x):
x = self.relu(self.linear1(x))
x = self.relu(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model()
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(),lr =0.01)
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred,y_data) # 计算损失
if epoch % 100 ==0: # 每隔100次打印一下
print(epoch,loss.item())
#back propagation
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 梯度更新
epoch_list.append(epoch)
loss_list.append(loss.item())
plt.plot(epoch_list,loss_list)
plt.show()
输出结果为:
来源:https://blog.csdn.net/qq_44886601/article/details/127347389


猜你喜欢
- 这篇文章主要介绍了python多进程并发demo实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 你可以输入'脚本'查查看 查找页面中的字符 <script language="JavaScript&quo
- 今天研究了下Python中的传值问题,通常在C、C++中有按值传递和按引用传递两种情况,按值传递时会拷贝实参,而按引用传递时只是给形参赋了一
- 文件名称:ByVal.aspByRef.asp具体代码:<%Sub TestMain()Dim A : A=5Call TestBy(
- 一、普通进度条示例代码import sysimport timedef progress_bar(): for i in ran
- 作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system()、os.popen()、s
- 首先谈谈它们的共同点吧:它们本质上都是一种对资源的独占锁定,都是由并发引起(如果数据库只有一个session,就谈不上锁定)。接着着重谈谈它
- 我就废话不多说了,大家还是直接看代码吧!print("thresh =",thresh)coords = np.colu
- 一、问题描述当用JS调用form的方法submit直接提交form的时候,submit事件不响应。为什么?知道的请回复。类比一下,我用inp
- If...Then...Else 语句的一种变形,即添加任意多个 ElseIf 子句以扩充 If...Then...Else 语句的功能,允
- 如何最大限度地实现安全登录功能? 具体方法如下(这是一个程序,为便于说明,中间用虚线“------”将代
- 本文实例讲述了Python实现网络端口转发和重定向的方法。分享给大家供大家参考,具体如下:【任务】需要将某个网络端口转发到另一个主机(for
- 基于邮件通知的服务监控和告警系统主要功能点:配置专用日志格式记录耗时日志格式:'simple':{'format
- 数字字符串前后有空格没事:>>> print(int(" 3 "))3但是下面这种带小数点的情况是不可
- 这篇文章主要介绍了python如果快速判断数字奇数偶数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言在对着产品高举中指怒发心中之愤后,真正能够解决问题的是自身上的改变,有句话说的好:你虽然改变不了全世界,但是你有机会改变你自己。秉承着“
- 原来是在系统上出了问题.是2003的IIS出现了问题,因为是2003的系统,它对ASP的上传文件做出了200K的限制,解决问题方法如下 :
- el-col-group"el-col-group" 是一个 Vue.js 函数式组件,允许您在 "el-ta
- 改变列的数据类型 [sql] ALTER TABLE visitor MODIFY nam VARCHAR(30); 追加新列 [sql]
- WordPress 页面模板是特定的模板文件,用于特定页面或页面组,这些用于单页数据的模板显示在前端。我们还可以在 WordPre