学习内容:B站 刘二大人 《pytorch深度学习实践》课程系列
处理多维度特征的输入
还是以二分类问题为例,输入转换为多个维度
对于每个样本xi->yi的计算过程如上图,x的每个特征都要乘以一个w。
mini-batch
实际处理中,一个mini-batch的向量化操作如上图:
- 输入x的形状:n x d(n是样本个数,d是特征维度)。
- 输出y的形状:n x 1(n表示样本的个数)
- 通过x和y确定,w的形状:d x 1(d是每个特征对应的权重)。
- b的形状:根据张量的广播机制,其形状自动转换为:n x 1。
- z看作是线性变换的输出,sigmoid的操作是point-wise的,即针对z中每个元素。
计算图
将一个8维映射到1维
扩展
在神经网络中,我们的目标是将一个多维空间非线性地映射到一个1维空间,为了使我们的模型更加复杂,可以将模型进行多次线性变换,并在每个linear后边加一个sigmoid激活函数引入非线性。
扩展后的计算图
数据集
diabetes.csv.gz---糖尿病患病率数据集。输入特征有8个维度,分别是人的各个指标,y是是否患病。这个数据去网上下。
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
xy = np.loadtxt('data/diabetes.csv.gz',delimiter = ',',dtype = np.float32)
x_data = torch.from_numpy(xy[:,:-1])
y_data = torch.from_numpy(xy[:,[-1]])
#为了确保y_data得到的是个矩阵,第二个维度切片需要使用[-1]
模型设计
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = nn.Linear(8,6)
self.linear2 = nn.Linear(6,4)
self.linear3 = 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()
损失函数和优化器
criterion = torch.nn.BCELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)
循环训练
#Train Model
for epoch in range(1000):
#Forward
y_pred = model(x_data)#整个数据集都扔进来了
loss = criterion(y_pred,y_data)
print(epoch,loss)
#Backward
optimizer.zero_grad()
loss.backward()
#Update
optimizer.step()
注意:这里并没有做mini-batch的操作,而是把所有数据都放到model了,后面会讲如何做mini-batch操作。
这里训练1000,loss还是很大,应该是要训练更多epoch,所以这里先不写测试了,麻烦。
小结
这讲需要掌握如何用逻辑回归解决"糖尿病诊断"问题,掌握以下:
1)多维特征如何处理
2)如何构建一个多层的线性变换+sigmoid 的模型。