深度学习中的激活函数与神经网络初始化
在深度学习中,激活函数和网络的初始化对于模型的性能和收敛性至关重要。本文将探讨不同类型的激活函数,并展示如何使用PyTorch进行神经网络参数的初始化。
激活函数对比
激活函数是神经网络中的关键组成部分,它们在神经元之间引入非线性,使得网络能够学习和模拟复杂的数据关系。
Tanh 函数
Tanh(双曲正切)函数是一种常见的激活函数,它的输出范围在-1到1之间。
函数图像
python
复制
import torch
import matplotlib.pyplot as plt
# 创建画布和坐标轴
_, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.tanh(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('Tanh 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.tanh(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('Tanh 导数图像')
plt.show()
ReLU 函数
ReLU(修正线性单元)是当前最流行的激活函数之一,它在正输入时输出相同值,在负输入时输出为零。
函数图像
python
复制
import torch
from matplotlib import pyplot as plt
_, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.relu(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('ReLU 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.relu(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('ReLU 导数图像')
plt.show()
神经网络初始化参数与技术选型
神经网络的初始化对于模型的学习能力和泛化性能至关重要。以下是几种常见的初始化技术:
均匀分布随机初始化
python
复制
def test01():
Linear=nn.Linear(5,3)
nn.init.uniform_(Linear.weight)
print(Linear.weight.data)
固定初始化
python
复制
def test02():
Linear=nn.Linear(5,3)
nn.init.constant_(Linear.weight,5)
print(Linear.weight.data)
全0初始化
python
复制
def test03():
linear=nn.Linear(5,3)
nn.init.zeros_(linear.weight)
print(linear.weight.data)
全1初始化
python
复制
def test04():
linear=nn.Linear(5,3)
nn.init.ones_(linear.weight)
print(linear.weight.data)
正态分布随机初始化
python
复制
def test05():
linear=nn.Linear(5,3)
nn.init.normal_(linear.weight,mean=0,std=1)
print(linear.weight.data)
Kaiming 初始化
python
复制
def test06():
# kaiming 正态分布初始化
linear=nn.Linear(5,3)
nn.init.kaiming_normal_(linear.weight)
print(linear.weight.data)
# kaiming 均匀分布初始化
linear=nn.Linear(5,3)
nn.init.kaiming_uniform_(linear.weight)
print(linear.weight.data)
Xavier 初始化
python
复制
def test07():
# xavier 正太分布初始化
linear=nn.Linear(5,3)
nn.init.xavier_normal_(linear.weight)
print(linear.weight.data)
# xavier 均匀分布初始化
linear=nn.Linear(5,3)
nn.init.xavier_uniform_(linear.weight)
print(linear.weight.data)
在实际应用中,选择合适的初始化方法对于网络的性能至关重要。通常,对于不同的网络层和激活函数,会有更合适的初始化策略。例如,ReLU激活函数通常与He初始化(即Kaiming初始化的变体)一起使用。
标签:初始化,函数,nn,axes,Linear,weight,神经网络,激活,linear From: https://blog.csdn.net/qq_45003504/article/details/139535401