神经网络与深度学习-8- 前馈神经网络1 -PyTorch

参考

     《神经网络与深度学习》


目录:

  1.          神经元
  2.          sigmoid 函数
  3.         Relu 函数
  4.         Swish 函数
  5.         GELU 函数
  6.        Maxout 函数

一  神经元

   把下面一个模型称为一个神经元

   

  z=w^Tx

  a=f(a)

 其中 f 为激活函数

其具有以下性质

  1: 连续可导

  2: 激活函数以及其导数要竟可能简单

  3: 激活函数的导数要在一个合适的范围内,不能太大或者太小,影响训练的效率和稳定性


二 Sigmoid 型函数

     指的的是一类S型函数,为两端饱和函数,常用的有Logistic 和 Tanh 函数

    备注:

    对于函数f(x),   

    当 x\rightarrow -\infty,其f^{'}(x)\rightarrow 0,称为左饱和

     当x \rightarrow +\infty,其f^{'}(x) \rightarrow 0,称为右饱和

     同时满足左右饱和时,称为两端饱和

    2.1 sigmoid 激活函数

      a=\frac{1}{1+e^{-z}} \in (0,1]

     

      因为 a 范围是0-1,其导数为

      a(1-a) \in [0,\frac{1}{4}] 

 2.2 Tanh 激活函数

      a=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} \in [-1,1]

     其导数为

     1-a^2 \in [0,1]

   

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 30 17:28:03 2022

@author: chengxf2
"""
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 24 21:09:15 2022

@author: cxf
"""

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

class active():
    
    TANH = 1
    SIGMOD =2
    RELU = 3
    SOFTPLUS = 4
    SWISH = 5
    GELU = 6
    MAXOUT = 7
    SOFTMAX = 8

    

'''
激活函数
args
   z: 激活单元输入
return 
   a : 神经元输出
'''
def  f(z, act):
    
    if act is active.TANH:
        a = torch.tanh(z)
        tip ="tanh"
    
    elif act is active.SIGMOD:
         a = torch.sigmoid(z)
         tip = "Sigmoid"
    elif act is active.RELU:
         a = torch.relu(z)
         tip ="Relu"
    elif act is active.SOFTMAX:
         a = 1+torch.exp(z)
         a = torch.log(a)
         tip = "SoftPlus"
    elif  act is active.SWISH:
         beta = 0.5
         a = z*torch.sigmoid(beta*z)
         tip ="Swish"
    elif act is active.GELU:
          tip ="GELU"
          m = np.sqrt(2/np.pi)*(z+0.044715*np.power(z,3))
          a = 0.5*z*(1.0+torch.tanh(m))
         
   
          tip ="GELU"
    return a ,tip
        
    
    
'''
绘画
args
   act: 激活函数类型
'''
def Draw(act):
    z = np.linspace(-10,10,100)
    
    zTensor = torch.FloatTensor(z)
    
    a,tip = f(zTensor,act)
    
    #print(b)
    
    plt.plot(z, a.numpy(), color='g',marker=".",linestyle="-")
    plt.title(tip)
    plt.xlabel("z")
    plt.ylabel("a")
    
    plt.grid()
    plt.show()
    
Draw(active.GELU)


二  Hard-Logistic 函数和  Hard-Tanh 函数

       Logistic 函数 和 Hard-Tanh 都是非线性函数,在SISO算法里面有讲过

其计算时间是线性函数的50倍左右。

    这边给出来其算法简化的方向

    2.1 Logistic 函数 hard-Decision

    g(x)=\sigma(0)+x\sigma^{'}(0)

              =0.25x+0.5

                 hard-logistic(x)=\left\{\begin{matrix} 1, g_(x)\geq 1\\ g(x), 0<g(x)<1 \\ 0, g(x) \leq 1 \end{matrix}\right.

                 = max(min(g(x),1),0)

               

   2.2 tanh 函数 hard-Decision

                    g(x)=tanh(0)+xtanh^{'}(0)

                             =x

                     hard-tanh(x)=max(min(g(x),1),-1)

 2.3 ReLu (Rectfoed Linear Unit   修正线性单元)

        ReLU(x)=\left\{\begin{matrix} x,x \geq 0\\ 0 ,x<0 \end{matrix}\right.

                           =max(0,x)

优点

        为左饱和函数,x>0导数为1 ,一定程度上缓解了梯度消失问题 

缺点:

     输出是非零中心化的,相当于给后面一层引入了偏置偏移,会影响梯度下降的效率

ReLu 在训练时候容易死亡

   

  带泄露的ReLu 

    LeakyReLU(x)=\left\{\begin{matrix} x,x \geq 0\\ rx ,x<0 \end{matrix}\right.

             =max(0,x)+rmin(0,x)

   r 是特别小的常数,比如0.01 ,也可以写作

   =max(x,rx)

   当神经元非激活的时候,能有一个非零的梯度可以更新参数,避免了不能被激活。

  带参数的ReLu

   对第i个神经元

  PReLU_i(x)=\left\{\begin{matrix} x,x \geq 0\\ r_ix ,x<0 \end{matrix}\right.

           =max(x,r_ix)

   2.4 ELU 函数(Exponential Linear Unit)

      ELU(x)=\left\{\begin{matrix} x, if x>0\\ \gamma (exp(x)-1),if x \leq 0 \end{matrix}\right.

                         =max(0,x)+min(0,r(exp(x)-1))

  2.5 softPlus 函数

     softplus(x)=log(1+exp(x))

2.6 Swish 函数

      Swish 是一种自门控(self-Gated)激活函数

      swish(x)=x \sigma(\beta x)

      \sigma: 为Logistic 函数

     \beta 为可学习的参数或一个固定超参数

 

2.7 GELU 函数(Gaussian Error Linear Unit 高斯误差线性单元)

     通过门控制来调整其输出值的激活函数,和Swish 函数相似

     GELU(x)=xP(X \leq x)

     P(X \leq x) \sim N(u,\sigma^2) 的累积分布函数,其中u,\sigma^2为超参数

   

2.8 Maxout 单元

    也是一种线性分段函数,输入是上一个层神经元的原始输出

  是一个向量 

     maxout(x)=max_{k \in[1,K]}(z_k)

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中实现前馈神经网络(FFNN)可以通过使用PyTorch的`torch.nn`模块来完成。下面是一个简单的示例代码,展示了如何创建和训练一个基本的FFNN: ```python import torch import torch.nn as nn import torch.optim as optim # 定义一个简单的前馈神经网络类 class FFNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(FFNN, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x # 定义输入、隐藏和输出层的维度 input_size = 10 hidden_size = 20 output_size = 5 # 创建模型实例 model = FFNN(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 准备输入数据和标签 input_data = torch.randn(32, input_size) # 假设批量大小为32 labels = torch.randint(output_size, (32,)) # 假设批量大小为32 # 进行模型训练 num_epochs = 10 for epoch in range(num_epochs): # 前向传播 output = model(input_data) # 计算损失 loss = criterion(output, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练过程中的损失 print(f"Epoch: {epoch+1}, Loss: {loss.item()}") # 使用训练好的模型进行预测 test_input = torch.randn(1, input_size) # 假设只有一个输入样本 prediction = model(test_input) ``` 以上代码演示了如何使用PyTorch创建一个简单的前馈神经网络(FFNN),并进行训练和预测。你可以根据实际需求修改模型的结构和参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值