深度学习02-神经网络和反向传播算法-pytorch实现多层感知机的神经网络算法

算法详解

1、导入数据
(1)使用np的方式将数据进行导入

print("读取数据")
    train_drug_targets = np.loadtxt('/Users/fengxiaolin/Desktop/data/train_DPI.txt')
    train_drug_fps = np.loadtxt('/Users/fengxiaolin/Desktop/data/train_fps.txt')

(2)将数据转为Tensor类型并转为float类型

print("numpy 转 tensor")
    train_x = torch.from_numpy(train_drug_fps).float()
    train_y = torch.from_numpy(train_drug_targets).float()

2、初始化模型
(1)使用TensorDataset将数据进行打包,打包成[x,y]的形式

train_set = TensorDataset(train_x, train_y)# 将训练数据打包

(2)使用DataLoader将数据多线程进行批量载入并将其顺序打乱

    train_loader = DataLoader(dataset=train_set, batch_size=BATCH_SIZE, shuffle=True, num_workers=6)      # 传入Dataloader,设置批大小、打乱顺序、6线程工作

pytorch 的数据加载到模型的操作顺序是这样的:
① 创建一个 Dataset 对象
② 创建一个 DataLoader 对象
③ 循环这个 DataLoader 对象,将img, label加载到模型中进行训练
该接口的目的:将自定义的Dataset根据batch size大小、是否shuffle(打乱顺序)等封装成一个Batch Size大小的Tensor,用于后面的训练。
详细参考:参考文档

3、实例化MLP(多层感知机)

FC = MLP(drug_feature, protein_num) # 实例化MLP

5、使用Adam优化器对MLP进行优化

optimizer = torch.optim.Adam(FC.parameters(), lr=LR) # 选择Adam为优化器

lr为调整步长,学习率,FC.parameters为调整参数

神经网络优化器,主要是为了优化我们的神经网络,使他在我们的训练过程中快起来,节省社交网络训练的时间。在pytorch中提供了torch.optim方法优化我们的神经网络,torch.optim是实现各种优化算法的包。
用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数E(x)

常用优化器:SGD、Momentum、Momentum、RMSProp、Adam

6、损失函数算法

loss_func = nn.MSELoss() # 选择均方差函数为损失函数

均方损失函数:
在这里插入图片描述

loss 函数都有 size_average 和 reduce 两个布尔类型的参数
(1)如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss
(2)如果 reduce = True,那么 loss 返回的是标量
a)如果 size_average = True,返回 loss.mean();
b)如果 size_average = False,返回 loss.sum();

7、进行优化调整

    for epoch in range(EPOCH):
        for i, data in enumerate(train_loader):
            batch_x, batch_y = data
            pre = FC(batch_x)
            loss = loss_func(pre, batch_y)  # 计算损失
            optimizer.zero_grad()           # 梯度清0
            loss.backward()                 # 反向传播
            optimizer.step()                # 更新

注意:使用enumerate进行遍历iteration会自动在每个数据前面加一个标号
使用多层感知器进行拟合,将得到的结果和预期结果进行计算误差,然后使用反向传播算法进行计算梯度,使用最优算法进行调整使得误差最小,不断调整,最终得到最优的权值
注意,每次梯度计算完成之后要清零,否则会累加

8、MLP(多层感知器)类内部代码分析:

class MLP(nn.Module):
    def __init__(self, size_x, size_y):
        super(MLP, self).__init__()
        self.fc1 = nn.Sequential(
            nn.Linear(size_x, 2048),   # 线性层, 维度从1024 变为2048
            nn.Dropout(0.2),           # Dropout防止过拟合,参数是扔掉的比例
            nn.GELU(),                 # Gelu() 激活函数
            nn.BatchNorm1d(2048),      # BN层防止过拟合(可以略过)
            nn.Linear(2048, 2048),
            nn.Dropout(0.2),
            nn.GELU(),
            nn.BatchNorm1d(2048),
            nn.Linear(2048, protein_num),
            nn.Dropout(0.2),
        )

    def forward(self, x):
        e0 = self.fc1(x)
        e1 = F.softmax(e0, dim=1)
        return e1

使用nn.module+nn.Sequential快速构建神经网络
1、首先需要学习nn.module的相关概念
详解nn.module
(1)nn.module是用来自定义网络层的
(2)使用module的类必须继承自nn.module
(3)在类中必须实现一个含有继承父类init方法的init函数
(4)类中需要有一个前向传播算法

2、了解nn.Sequential的使用
详解nn.Sequential

torch.nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中。另外,也可以传入一个有序模块。

(1)使用目的:使用普通的方法构建神经网络,需要在forward函数中手动调用激活函数,而使用nn.Sequential可以自动的调用激活函数

3、nn.dropout()

详解dropout如何防止过拟合

Dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了

4、GeLU激活函数
几个激活函数:
1、sigmoid函数

sigmoid,在远离0点的地方,梯度变得非常微小,所以求导以后也很难指导我们的梯度下降
在这里插入图片描述

2、ReLU函数

它的主要问题有两个,一个是0点附近不可微,所以通常在0点只求右导数;另一个问题是:它会“谋杀”一些神经元。怎么讲“谋杀”呢,就是说它在反向传播的过程中很快让一些神经元的导数永远是0,导致一些神经元失效
在这里插入图片描述

3、leakyReLU

在小于0的一边有一个很小的梯度,解决了ReLU的问题,常在NLP、图像识别中使用
这里是引用

4、GeLU函数

效果很好
这里是引用

5、Softmax:
进行归一化处理?
dim为维度,dim=1说明按行进行归一化
参考:参考链接

总结:

这个模型相当于使用线性拟合的方法,从输入层的1024个神经元,映射到隐藏层的2048个神经元然后又经过一次线性拟合,保持维度不变,但拟合了一次,然后最后经过映射到输出层的1996维度
在中间使用了dropout、BN等方法防止过拟合

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值