NNDL 实验五 前馈神经网络(1)二分类任务

前言

本篇文章是深度学习第五周的实验内容,主要使用pytorch来搭建简单的前馈神经网络,我们一起来学习吧(ง •_•)ง

pytorch实现

请添加图片描述

导入实验所需要的包:

import numpy as np
import torch
import math
import pandas as pd
import matplotlib.pyplot as plt

4.1 神经元

4.1.1 净活性值

使用pytorch计算一组输入的净活性值z

净活性值z经过一个非线性函数f(·)后,得到神经元的活性值a
请添加图片描述
使用pytorch计算一组输入的净活性值:

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

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

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

运行结果:
在这里插入图片描述

使用pytorch中相应函数torch.nn.Linear(features_in, features_out, bias=False)实现。

torch.nn.Linear((features_in, features_out, bias=False)函数是一个线性变换函数:
在这里插入图片描述

其中,features_in为输入样本的大小,features_out为输出样本的大小,bias默认为true。如果设置bias = false那么该层将不会学习一个加性偏差。

Linear()函数通常用于设置网络中的全连接层。

input = torch.rand([2, 5])
fc = torch.nn.Linear(5, 1, bias=True)
output = fc(input)

print('input: \n', X)
print('fc.weight: \n', fc.weight)
print('fc.bias: \n', fc.bias)
print('output: \n', z)

运行结果:
在这里插入图片描述


【思考题】加权相加仿射变换之间有什么区别和联系?

在这里插入图片描述

在这里插入图片描述
加权和时对输入信息进行线性变换,仿射变换是线性变换+平移。

线性变换有三个特点:

1.变换前是直线,变换后依然是直线;
2.直线比例保持不变
3.变换前是原点,变换后依然是原点

仿射变换有两个特点:

1.变换前是直线,变换后依然是直线;
2.直线比例保持不变

没有了第三点,原点不变,仿射变换后原点是有可能发生变化的。
在这里插入图片描述


4.1.2 激活函数

激活函数通常为非线性函数,可以增强神经网络的表示能力和学习能力。

常用的激活函数有S型函数和ReLU函数。

4.1.2.1 Sigmoid 型函数

常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数。

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

# 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, logistic(z), color='#e4007f', label="Logistic Function")
plt.plot(z, tanh(z), 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()

运行结果:
在这里插入图片描述

在pytorch中使用torch.nn.functional.sigmoid和torch.nn.functional.tanh实现对张量的Logistic和Tanh计算。

out_1 = torch.nn.functional.sigmoid(z)
out_2 = torch.nn.functional.tanh(z)
plt.plot(z, out_1, color='#e4007f', label="Logistic Function_fc")
plt.plot(z, out_2, color='#f19ec2', linestyle ='--', label="Tanh Function_fc")
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('fc-logistic-tanh.pdf')
plt.show()

运行结果:
在这里插入图片描述

4.1.2.2 ReLU型函数

常见的ReLU函数有ReLU和带泄露的ReLU(Leaky ReLU)

使用python实现并可视化可视化“ReLU、带泄露的ReLU的函数”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值