神经网络与深度学习day05---前馈神经网络初识


前言

神经网络是由神经元按照一定的连接结构组合而成的网络。神经网络可以看作一个函数,通过简单非线性函数的多次复合,实现输入空间到输出空间的复杂映射 。 前馈神经网络是最早发明的简单人工神经网络。整个网络中的信息单向传播,可以用一个有向无环路图表示,这种网络结构简单,易于实现。
本文基于Jupyter来进行解释,用torch框架复述前馈神经网络的一些问题。


一、神经元简介

神经网络的基本组成单元为带有非线性激活函数的神经元,其结构如如图4.2所示。神经元是对生物神经元的结构和特性的一种简化建模,接收一组输入信号并产生输出。
在这里插入图片描述

1.1 净活性值

假设一个神经元接收的输入为 x ∈ R D \mathbf{x}\in \mathbb{R}^D xRD,其权重向量为 w ∈ R D \mathbf{w}\in \mathbb{R}^D wRD,神经元所获得的输入信号,即净活性值 z z z的计算方法为
z = w T x + b z =\mathbf{w}^T\mathbf{x}+b z=wTx+b
我们使用torch计算一组输入的净活性值。代码实现如下:

import torch

# 2个特征数为5的样本
X = torch.rand([2, 5])

# 含有5个参数的权重向量
w = torch.rand([5, 1])
# 偏置项
b = torch.rand([1, 1])

# 使用'torch.matmul'实现矩阵相乘
z = torch.matmul(X, w) + b
print("input X:", X)
print("weight w:", w, "\nbias b:", b)
print("output z:", z)

实现效果:
在这里插入图片描述

1.2 激活函数

1.2.1 Sigmoid函数和Tanh函数

Sigmoid 型函数是指一类S型曲线函数,为两端饱和函数。常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数,其数学表达式为

Logistic 函数:

σ ( z ) = 1 1 + exp ⁡ ( − z ) 。( 4.4 ) \sigma(z) = \frac{1}{1+\exp(-z)}。(4.4) σ(z)=1+exp(z)1。(4.4

Tanh 函数:

t a n h ( z ) = exp ⁡ ( z ) − exp ⁡ ( − z ) exp ⁡ ( z ) + exp ⁡ ( − z ) 。( 4.5 ) \mathrm{tanh}(z) = \frac{\exp(z)-\exp(-z)}{\exp(z)+\exp(-z)}。(4.5) tanh(z)=exp(z)+exp(z)exp(z)exp(z)。(4.5

Logistic函数和Tanh函数的代码实现和可视化如下:
代码:

%matplotlib inline
import matplotlib.pyplot as plt

# Logistic函数
def logistic(z):
    return 1.0 / (1.0 + torch.exp(-z))

# Tanh函数
def tanh(z):
    return (torch.exp(z) - torch.exp(-z)) / (torch.exp(z) + torch.exp(-z))

# 在[-10,10]的范围内生成10000个输入值,用于绘制函数曲线
z = torch.linspace(-10, 10, 10000)

plt.figure()
plt.plot(z.tolist(), logistic(z).tolist(), color='#e4007f', label="Logistic Function")
plt.plot(z.tolist(), tanh(z).tolist(), color='#f19ec2', linestyle ='--', label="Tanh Function")

ax = plt.gca() # 获取轴,默认有4个
# 隐藏两个轴,通过把颜色设置成none
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 调整坐标轴位置   
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='lower right', fontsize='large')

plt.savefig('fw-logistic-tanh.pdf')
plt.show()

可视化结果:
在这里插入图片描述

1.2.2 ReLU 函数

常见的ReLU函数有ReLU和带泄露的ReLU(Leaky ReLU),数学表达式分别为:

R e L U ( z ) = max ⁡ ( 0 , z ) , ( 4.6 ) \mathrm{ReLU}(z) = \max(0,z),(4.6) ReLU(z)=max(0,z),4.6

L e a k y R e L U ( z ) = max ⁡ ( 0 , z ) + λ min ⁡ ( 0 , z ) , ( 4.7 ) \mathrm{LeakyReLU}(z) = \max(0,z)+\lambda \min(0,z),(4.7) LeakyReLU(z)=max(0,z)+λmin(0,z),4.7

其中 λ \lambda λ为超参数。

可视化ReLU和带泄露的ReLU的函数的代码实现和可视化如下:

# ReLU
def relu(z):
    return torch.maximum(z, torch.tensor(0.))

# 带泄露的ReLU
def leaky_relu(z, negative_slope=0.1):
    # 当前版本torch暂不支持直接将bool类型转成int类型,因此调用了torch的cast函数来进行显式转换
    a1 = (torch.can_cast((z > 0).dtype, to=torch.float32) * z) 
    a2 = (torch.can_cast((z <= 0).dtype, to=torch.float32) * (negative_slope * z))
    return a1 + a2

# 在[-10,10]的范围内生成一系列的输入值,用于绘制relu、leaky_relu的函数曲线
z = torch.linspace(-10, 10, 10000)

plt.figure()
plt.plot(z.tolist(), relu(z).tolist(), color="#e4007f", label="ReLU Function")
plt.plot(z.tolist(), leaky_relu(z).tolist(), color="#f19ec2", linestyle="--", label="LeakyReLU Function")

ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='upper left', fontsize='large')
plt.savefig('fw-relu-leakyrelu.pdf')
plt.show()

可视化结果:
在这里插入图片描述

1.2.3(选做)其他函数

二、基于前馈神经网络的二分类任务


图4.3: 前馈神经网络结构

2.1 数据集构建

我们使用带噪声的弯月数据集进行数据集的构建。

from nndl.dataset import ma
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鬼缠身、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值