赞
踩
之前学习的分类和回归任务都是由x、y组成的数据集,但是我们的输入都是一维向量,那么针对多维向量的输入又该如何处理呢?





torch中的所有数据都是向量形式,可以把向量运算都转化为矩阵运算,利用并行计算提高计算能力。
假设输入数据为8维,输出为1维

请先尝试自己写一下这个逻辑回归模型的model代码!


如果线性层的输出是多维的呢?

上面的这个线性层已经把8维向量转化为了2维,但是我们最终结果是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] 最后一列,保证是矩阵形式

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

# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
没有使用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函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。