《PyTorch深度学习实践》第七节:处理多维特征的输入

如图:在这里插入图片描述
当多输入单输出时,我们其实可以理解为降维,输入为8维,输出为1维。

下面几个图就展示了这种变换:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线性代数中的概念—空间变换:
在这里插入图片描述

我们经常做的空间变换不一定是线性的,通常是一些非线性的,所以我们可以采用多个线性变换层, 找到最优的权重,通过组合起来以模拟这种非线性的变换。因此神经网络本质上可以理解为寻找一种非线性的空间变换函数。

Linear在这节课中就可以做到一种空间维度的变换。

我们的目的是想从8维到1维,通过引入激活函数,给线性变换增加非线性因子,使得我们可以通过线性变换来拟合非线性。如图:
在这里插入图片描述
Linear(8,6)可以从8维降到6维,之后我们再连接Linear(6,2)Linear(2,1)即可,但Linear是一个纯线性变换,所以在连接之前一定要加入simoid函数。这样我们每一步只需要调整线性变换,来拟合我们想要的(空间)非线性变换。

同样我们也可以先8D到24D再降维;

一般来说中间的隐层越多,神经元越多,对非线性变换的学习能力就越强。但事实上并不是学习能力越强越好,太强的学习能力会把输入样本中的噪声也学到,但噪声我们是不想要的,也就是过拟合。 学习能力需要有泛化能力。

下图中:在这里插入图片描述
激活函数也可以采用别的函数,如rule函数,图中标注可以看出,rule函数小于0时输出是一个常值0,我们还是希望最后得到一个0-1的概率,所以计算图的最后一层我们还是要使用sigmoid函数来让最终结果在0,1之间。此处采用rule和sigmoid结合效果最佳。

import numpy as np
import torch
import matplotlib.pyplot as plt

# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.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)  # 输入数据8维,输出1维
        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_pred
        return x


model = Model()

criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = []
loss_list = []
# training cycle
for epoch in range(1000):
    y_pred = model(x_data)  #前向传播
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())

    optimizer.zero_grad()  #梯度清零
    loss.backward()  #反向传播

    optimizer.step()  #更新权重

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

补充:torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别
指路

1.torch.sigmoid:是一个方法,拥有Parametrs和Returns。
2.torch.nn.Sigmoid:官网文档在左上角标注着显眼的CLASS,torch.nn.Sigmoid在我们的神经网络中使用时,我们应该将其看作是网络的一层,而不是简单的函数使用。
3.torch.nn.functional.sigmoid :torch.nn.functional从这个包名就能看出来,这个包里的都是函数。torch.nn.funtional.sigmoid是一个方法,可以直接在我们的神经网络的forward中使用,并不需要在init的时候初始化。也就是说torch.nn.functional.sigmoid和torch.sigmoid没有什么区别,同理,本文对于其他的激活函数一样适用。

Guess you like

Origin blog.csdn.net/weixin_44894550/article/details/121062843