Fork me on GitHub

PyTorch深度学习实践——处理多维特征的输入

处理多维特征的输入

课程来源:PyTorch深度学习实践——河北工业大学

《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili

这一讲介绍输入为多维数据时的分类。

一个数据集示例如下:
image-20210907224540513

由于使用的是多维的数据,因此模型中的x和y都应该变为向量的形式,变为如下式子:

image-20210907225018234

而下方针对多维数据的式子中的一部分可以使用矩阵相乘的方式表示:

\[\hat y^{(i)}=\sigma([x_1^{(i)}...x_8^{(i)}]\begin{bmatrix} w_1\\ .\\ .\\ .\\ w_8 \end{bmatrix}+b) \]

由于我们使用的是mini-batch的计算方式,因此计算的形式如下:

\[\begin{bmatrix} \hat y^{(1)}\\ .\\ .\\ .\\ \hat y^{(N)} \end{bmatrix}=\sigma \begin{bmatrix} z^{(1)}\\ .\\ .\\ .\\ z^{(N)} \end{bmatrix} \]

其中z的计算方式如下:

\[Z^{(N)}=[x_1^{(N)}...x_8^{(N)}]\begin{bmatrix} w_1\\ .\\ .\\ .\\ w_8 \end{bmatrix}+b \]

为了利用并行计算进行优化,因此将计算改为矩阵运算如下:

\[\begin{bmatrix} z^{(1)}\\ .\\ .\\ .\\ z^{(N)} \end{bmatrix}= \begin{bmatrix} x_1^{(1)}...x_8^{(1)}\\ .\\ .\\ .\\ x_1^{(N)}...x_8^{(N)} \end{bmatrix} \begin{bmatrix} w_1\\ .\\ .\\ .\\ w_8 \end{bmatrix}+b \]

由于我们想将神经网络的层数增加几层,不是只用一层来预测,因此模型使用主要部分代码示例如下:

线性层的使用:

self.linear1 = torch.nn.Linear(8, 6)
image-20210907230355423

注:叠加线性层每两层之间一定要加入非线性层,否则没有意义。

非线性层的使用:

x = self.sigmoid(self.linear1(x))

一般而言,神经网络中的隐层越多,中间神经元越多学习能力越强,但是过拟合的可能性也越大。

一个简单的神经网络的模型如下图:

image-20210907231017038

代码如下:

import torch
import numpy as np

import matplotlib.pyplot as plt
##1. Prepare Dataset
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:,:-1])
y_data = torch.from_numpy(xy[:, [-1]])
loss_list=[]
epoch_list=[]

##2. Define Model
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)
        ##定义激活函数,除了sigmoid也有其他的如self.activate = torch.nn.ReLU()
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        ##处理单元(线性层+非线性变化层),三层,用同一个变量x(每一层处理的结果都传递到下一层)
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x
model = Model()

##3. Construct Loss and Optimizer
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

##4. Training Cycle
for epoch in range(10000):
    ##Forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    loss_list.append(loss.item())
    epoch_list.append(epoch)
    print(epoch, loss.item())
    # Backward
    optimizer.zero_grad()
    loss.backward()
    # Update
    optimizer.step()
    print(epoch,loss)
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
image-20210907232146569

注:上述代码没有实现mini-batch的训练模式,还是使用全部输入,一次性训练的结果。

posted @ 2022-02-13 16:18  zsh1234  阅读(289)  评论(0编辑  收藏  举报