1.声明
本文为哔哩哔哩视频集《PyTorch深度学习实战》课程的学习笔记,仅作为记录分享。
此文所用数据集可从百度网盘链接下载,放置于所写python脚本同级目录之下。
链接:https://pan.baidu.com/s/1Br_g0tW2AWZ87ribhYaaBg
提取码:im6v
2.问题描述
该图为糖尿病数据集的节选,从图中可以看出有8个维度,每一条数据包含八个维度的信息,进行二分类问题,判断是否患有糖尿病。
3.构思模型
之前我们遇到的是单维度的数据,我们采用的是单维度的逻辑回归模型:
此模型仅能解决单维度的数据,而输入变成上图所示的八个维度,其模型也变成了:
而在计算中我们往往是通过矩阵的方式进行的计算:
则原式表示成了:
Mini-Batch
PyTorch中的sigmoid函数,是一种按向量计算的函数,所以在计算中
因为其中每一个z等于:
所以原始又可以写为:
4.维度下降
通过矩阵变换,进行维度下降
通过这段代码可以直接使得八维的数据,降到一维:
self.linear = torch.nn.Linear(8,1)
同时也可以增加网络层数,进行分步降维:
通过如图方法进行分布降维。
5.代码实现
import torch
import numpy as np
"""
Prepare DataSet
"""
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype = np.float32)
#将前八列(除最后一列)和除最后一行作为训练集
x_data = torch.from_numpy(xy[:-1, :-1])
#取最后一列作为输出验证
y_data = torch.from_numpy(xy[:-1, [-1]])
#取最后1行的测试集部分
test_data = torch.from_numpy(xy[[-1], :-1])
pred_test = torch.from_numpy(xy[[-1],[-1]])
"""
Design model using Class
"""
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()
"""
Construct loss and optimizer
"""
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
"""
Training cycle
forward ,backward, update
"""
for epoch in range(1000):
#Forward 并非mini-batch的设计,只是mini-batch的风格
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
print(epoch, loss.item())
#Backward
optimizer.zero_grad()
loss.backward()
#Update
optimizer.step()
"""
Test
"""
print("test_pred = ", model(test_data).item())
print("infact_pred = ", pred_test.item())