回顾
之前学习的分类和回归任务都是由x、y组成的数据集,但是我们的输入都是一维向量,那么针对多维向量的输入又该如何处理呢?
- 在数据集里面,我们把一行数据叫做一个样本(在数据库中叫做一个元组)
- 输入数据中的某一列叫做特征,比如说颜色、纹理、形状(在数据库中叫做属性/字段)
多维向量的逻辑回归
- 首先模型会发生变化:
Mini-Batch
torch中的所有数据都是向量形式,可以把向量运算都转化为矩阵运算,利用并行计算提高计算能力。
假设输入数据为8维,输出为1维
请先尝试自己写一下这个逻辑回归模型的model代码!
如果线性层的输出是多维的呢?
上面的这个线性层已经把8维向量转化为了2维,但是我们最终结果是1维的.我们可以再后面再接一个线形层,将二维的转化为1维。
请利用下面这个代码写一个函数模型,完成线性模型的代码(降维到1维)
神经网络
多个神经元之间连接就可以实现维度的变换。
不仅可以实现降维,还可以升维。注意:提升维度可以提高模型的非线性表达能力,即模型的学习能力。但不是维度越高越好,维度过高可能会出现过拟合的现象。所有我们最终还是要注意模型的泛化能力,模型的层数、维度的设置需要合理。(可以利用超参数搜索的方式选择)
构造一个人工神经网络:
构造学习器进行数据预测的流程:
构建模型
1. 数据准备
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
#delimiter:分隔符,dtype:数据类型。pycharm中通常是float32
x_data = torch.from_numpy(xy[:, :-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后一列,保证是矩阵形式
2.定义模型
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6) # 输入数据x的特征是8维,x有8个特征
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)) # y hat
return x
3.构建损失函数和优化器
# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
4. 训练
没有使用mini-batch,后续会讲。
epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100):#没有使用mini-batch
#forward
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
epoch_list.append(epoch)
loss_list.append(loss.item())
#backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.step()
完整代码
import numpy as np
import torch
import matplotlib.pyplot as plt
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
#delimiter:分隔符,dtype:数据类型。pycharm中通常是float32
x_data = torch.from_numpy(xy[:, :-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = 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) # 输入数据x的特征是8维,x有8个特征
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)) # y hat
return x
model = Model()
# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100):#没有使用mini-batch
#forward
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
epoch_list.append(epoch)
loss_list.append(loss.item())
#backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.step()
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
损失曲线图:
练习
请把sigmoid激活函数换成其他的激活函数。
各种激活函数图形曲线
各种激活函数介绍
注意:最后要将预测值归一化到【0,1】,所以最后一层激活函数还是要用sigmoid函数。