深度学习知识点总结
专栏链接:
https://blog.csdn.net/qq_39707285/article/details/124005405
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
本章介绍多种激活函数
任何神经网络的主要目标都是使用层次性层次结构将非线性可分的输入数据转换为更线性可分的抽象特征,这些层是线性函数和非线性函数的组合,最流行和最常见的非线性层是激活函数(AFs),如sigmoid、Tanh、ReLU、ELU、Swish和Mish。
使用不同激活函数在CIFAR10上准确率对比:
使用不同激活函数在CIFAR100上准确率对比:
使用不同激活函数在CIFAR100上训练耗时统计:
综合实验分析发现:
x = np.linspace(-15, 15, 1000)
y = 1 / (1 + np.exp(-x)) # sigmoid
x = np.linspace(-15, 15, 1000)
y = np.tanh(x) # tanh
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn.functional as F
fig = plt.figure(figsize=(12, 6))
plt.xlim([-10, 10])
plt.ylim([-1, 1.6])
# 定义数值
x = np.sort(np.linspace(-10,10,1000))
# ReLu 函数
relu= [max(item,0) for item in x]
# LeakReLu函数
alpha = 0.1
leakRelu = [item if item > 0 else item * alpha for item in x]
# ELU函数
alpha = 0.2
elu = [item if item > 0 else (np.exp(item) - 1) * alpha for item in x]
# SELU函数
alpha = 1
r = 0.5
selu = [item if item > 0 else (np.exp(item) - 1) * alpha for item in x]
selu = list(map(lambda x: x * r, selu))
# GELU
gelu = F.gelu(torch.Tensor(x)).numpy()
# CELU
celu = F.celu(torch.Tensor(x)).numpy()
# 绘图
plt.plot(x, relu, color="#ff0000", label=r"ReLu")
plt.plot(x, leakRelu, color="#0000ff", label=r"LeakReLu")
plt.plot(x, elu, color="#00ff00", label=r"ELU")
plt.plot(x, selu, color="#00ffee", label=r"SELU")
plt.plot(x, gelu, color="#e0861a", label=r"GELU")
plt.plot(x, celu, color="#2b4490", label=r"CELU")
plt.legend(prop={'family': 'Times New Roman', 'size': 16})
plt.show()
import numpy as np
from matplotlib import pyplot as plt
import mpl_toolkits.axisartist as axisartist
import torch.nn.functional as F
import torch
# 创建画布
fig = plt.figure()
# 使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)
# 将绘图区对象添加到画布中
fig.add_axes(ax)
# 通过set_visible方法设置绘图区所有坐标轴隐藏
ax.axis[:].set_visible(False)
# ax.new_floating_axis代表添加新的坐标轴
ax.axis["x"] = ax.new_floating_axis(0, 0)
# 给x坐标轴加上箭头
ax.axis["x"].set_axisline_style("->", size=1.0)
# 添加y坐标轴,且加上箭头
ax.axis["y"] = ax.new_floating_axis(1, 0)
ax.axis["y"].set_axisline_style("-|>", size=1.0)
# 设置x、y轴上刻度显示方向
ax.axis["x"].set_axis_direction("top")
ax.axis["y"].set_axis_direction("right")
x = np.linspace(-15, 15, 1000)
x = torch.Tensor(x)
# PReLU
y = F.leaky_relu(x, 0.01)
y2 = F.leaky_relu(x, 0.05)
y3 = F.leaky_relu(x, 0.1)
plt.plot(np.array(x), np.array(y), c="r", label="p=0.01")
plt.plot(np.array(x), np.array(y2), c="b", label="p=0.05")
plt.plot(np.array(x), np.array(y3), c="c", label="p=0.1")
plt.show()
y = (0.5 * x) / (1+np.abs(x)) + 0.5
slu = F.softplus(torch.Tensor(x))
swish = x.mul(F.sigmoid(x))
lisht = x.mul(F.tanh(x))
mish = F.mish(x)
mish = F.silu(x)
总结:
改进建议: