神经网络中的激活函数: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 更加有效。

希望本文能够帮助读者更好地理解激活函数在神经网络中的作用。

神经网络中的激活函数:Sigmoid、ReLU、LeakyReLU、Tanh 和 Softmax 实现

原文地址: https://www.cveoy.top/t/topic/k4W2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录