神经网络中的激活函数:Sigmoid、ReLU、LeakyReLU、Tanh 和 Softmax 实现
神经网络中的激活函数:Sigmoid、ReLU、LeakyReLU、Tanh 和 Softmax 实现
激活函数是神经网络中不可或缺的一部分,它决定了神经元输出的非线性变换。不同的激活函数具有不同的特性,适合不同的场景。本文将介绍几种常用的激活函数,并提供 Python 代码实现。
1. Sigmoid 激活函数
Sigmoid 激活函数是早期神经网络中常用的激活函数,其输出值介于 0 到 1 之间,可以将输入信号映射到概率值。
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
2. ReLU 激活函数
ReLU 激活函数是近年来较为流行的激活函数,它将小于 0 的输入值设为 0,大于 0 的输入值则保持不变。
def relu(x):
return np.maximum(0, x)
3. LeakyReLU 激活函数
LeakyReLU 激活函数是 ReLU 的改进版本,它在小于 0 的输入值上乘以一个小的系数,以避免 ReLU 在负半轴上的梯度消失问题。
def leaky_relu(x, alpha=0.01):
return np.maximum(alpha * x, x)
4. Tanh 激活函数
Tanh 激活函数是双曲正切函数,其输出值介于 -1 到 1 之间。
def tanh(x):
return np.tanh(x)
5. Softmax 激活函数
Softmax 激活函数通常用于多分类问题,它将一组数值转换为概率分布,使得所有概率值之和为 1。
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=0)
神经网络实现示例
以下代码示例展示了使用 sigmoid 激活函数构建一个简单的神经网络:
# 定义神经网络函数
class neuralNetwork:
# 初始化神经网络
def __init__(self, inputnodes, hiddennodes, outputnodes, learnrate):
# 设立每个神经网络的输入、隐藏、输出层的节点数
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# 设置学习率
self.lrate = learnrate
self.wi_h = (np.random.rand(self.hnodes, self.inodes) - 0.5)
self.wh_o = (np.random.rand(self.onodes, self.hnodes) - 0.5)
pass
# 训练神经网络
def train(self, inputs_list, targets_list):
# 输入与标准结果
inputs = np.array(inputs_list, ndmin=2).T
targets = np.array(targets_list, ndmin=2).T
# 计算隐藏层的信号值
hidden_inputs = np.dot(self.wi_h, inputs)
hidden_outputs = sigmoid(hidden_inputs)
# 计算输出层的信号值
outputs_inputs = np.dot(self.wh_o, hidden_outputs)
outputs_outputs = sigmoid(outputs_inputs)
# 计算误差:精确值-实际值
output_errors = targets - outputs_outputs
hidden_errors = np.dot(self.wh_o.T, output_errors)
# 根据公式得出的表达式,直接用
self.wh_o += self.lrate * np.dot((output_errors * outputs_outputs * (1.0 - outputs_outputs)),
np.transpose(hidden_outputs))
self.wi_h += self.lrate * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
np.transpose(inputs))
pass
# 接受输入,返回输出
# 将输出进行激活,归一化
def query(self, input_list):
inputs = np.array(input_list, ndmin=2).T
hidden_inputs = np.dot(self.wi_h, inputs)
hidden_outputs = sigmoid(hidden_inputs)
outputs_inputs = np.dot(self.wh_o, hidden_outputs)
outputs_outputs = sigmoid(outputs_inputs)
return outputs_outputs
pass
pass
总结
本文介绍了五种常用的激活函数,并提供了 Python 代码实现。在选择激活函数时,需要根据具体问题和数据特点进行选择。例如,对于图像识别任务,ReLU 和 LeakyReLU 往往比 Sigmoid 和 Tanh 更加有效。
希望本文能够帮助读者更好地理解激活函数在神经网络中的作用。
原文地址: https://www.cveoy.top/t/topic/k4W2 著作权归作者所有。请勿转载和采集!