TensorFlow常用激活函数

本文探讨了神经网络中关键的激活函数,包括阈值函数、Sigmoid、Tanh、RELU和Softmax,通过代码实现与可视化,展示了这些函数在神经元活动与输出之间的转换特性。

threshold

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
def threshold(x):
    cond = tf.less(x, tf.zeros(x.shape, dtype=x.dtype))
    res = tf.where(cond, tf.zeros(x.shape), tf.ones(x.shape))
    return res

h = np.linspace(-1,1,50)
out = threshold(h)

with tf.Session() as sess:
    y = sess.run(out)
    plt.xlabel('Activity of Neuron')
    plt.ylabel('Output of Neuron')
    plt.title('Threshold Activation Function')
    plt.plot(h, y)
    plt.show()

在这里插入图片描述

Sigmoid

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
h = np.linspace(-10,10,50)
out = tf.sigmoid(h)

with tf.Session() as sess:
    y = sess.run(out)
    plt.xlabel('Activity of Neuron')
    plt.ylabel('Output of Neuron')
    plt.title('Sigmoid Activation Function')
    plt.plot(h, y)
    plt.show()

在这里插入图片描述

Tanh

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
h = np.linspace(-10,10,50)
out = tf.tanh(h)

with tf.Session() as sess:
    y = sess.run(out)
    plt.xlabel('Activity of Neuron')
    plt.ylabel('Output of Neuron')
    plt.title('Tanh Activation Function')
    plt.plot(h, y)
    plt.show()

在这里插入图片描述

RELU

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
h = np.linspace(-10,10,50)
out = tf.nn.relu(h)

with tf.Session() as sess:
    y = sess.run(out)
    plt.xlabel('Activity of Neuron')
    plt.ylabel('Output of Neuron')
    plt.title('RELU Activation Function')
    plt.plot(h, y)
    plt.show()

在这里插入图片描述

Softmax

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
h = np.linspace(-5,5,50)
out = tf.nn.softmax(h)

with tf.Session() as sess:
    y = sess.run(out)
    plt.xlabel('Activity of Neuron')
    plt.ylabel('Output of Neuron')
    plt.title('Softmax Activation Function')
    plt.plot(h, y)
    plt.show()

在这里插入图片描述

<think>嗯,用户问的是TensorFlow.NET中的激活函数是什么。首先,我需要确认用户对TensorFlow.NET的了解程度。可能他们已经在用这个库做深度学习,特别是之前提到的DQN模型,所以现在需要更深入了解激活函数的部分。 激活函数在神经网络中非常重要,因为它们引入非线性,让网络可以学习复杂的模式。TensorFlow.NET是C#的一个库,所以用户可能是在C#环境中进行开发,比如游戏或者企业应用,需要集成机器学习模型。 用户可能想知道TensorFlow.NET支持哪些激活函数,以及如何在代码中使用它们。他们可能已经看过前面的DQN示例,里面用了ReLU,所以现在想扩展知识,或者遇到问题需要调试不同的激活函数。 我需要先列出常见的激活函数,比如ReLU、Sigmoid、Tanh、LeakyReLU、Softmax等,并说明它们在TensorFlow.NET中的具体用法。注意要提到如何通过字符串名称或Keras接口来调用,比如使用`activation: "relu"`或者`Activations.Relu`。还要强调参数设置,比如LeakyReLU的alpha参数。 然后,需要给出代码示例,展示如何在构建网络层的时候添加激活函数,比如Dense层的使用。同时,对比不同激活函数的适用场景,比如ReLU适合隐藏层,Sigmoid适合二分类输出层,帮助用户选择合适的函数。 可能用户的实际问题是在模型训练中出现梯度消失或爆炸,想知道如何通过更换激活函数来改善。这时候需要解释激活函数的影响,比如ReLU缓解梯度消失,但可能有死亡神经元的问题,LeakyReLU可以解决这个问题。 另外,用户可能需要了解如何自定义激活函数,虽然常见的情况不需要,但高级用户可能有这个需求。所以需要简单提到可以通过Lambda层或继承Layer类来实现自定义函数,但要注意复杂度和性能问题。 还需要注意TensorFlow.NET的版本是否支持某些激活函数,比如Swish可能在新版本中才有,或者是否有不同的命名方式。建议用户查阅官方文档确认。 最后,结合之前的DQN例子,说明为什么选择ReLU,比如在隐藏层中增加非线性而不增加计算量,适合处理高维状态输入。这样用户能更好地理解实际应用中的选择依据。 总结,回答的结构应该是先介绍激活函数的作用,再列出常见函数及其用法,给出代码示例,讨论选择建议,最后结合之前的例子加强理解。确保信息准确,特别是API的使用方式,避免用户因为语法错误而无法运行代码。</think>在TensorFlow.NET中,激活函数是神经网络层的核心组成部分。以下是最常用激活函数及其实现方式,通过数学公式和代码示例为您详细解析: --- ### **1. 常见激活函数及数学表达式** #### (1) ReLU (Rectified Linear Unit) $$ f(x) = \max(0, x) $$ ```csharp // 在Dense层中直接指定 new Dense(64, activation: "relu") // 或使用Keras接口 Activations.Relu(x) ``` #### (2) Sigmoid $$ \sigma(x) = \frac{1}{1 + e^{-x}} $$ ```csharp new Dense(1, activation: "sigmoid") // 常用于二分类输出层 ``` #### (3) Tanh $$ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$ ```csharp new LSTM(32, activation: "tanh") // 常用于RNN层 ``` #### (4) LeakyReLU $$ f(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{otherwise} \end{cases} $$ ```csharp // 需要显式创建层 var layer = new LeakyReLU(alpha: 0.3f); // α默认为0.2 ``` #### (5) Softmax $$ \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}} $$ ```csharp new Dense(10, activation: "softmax") // 多分类输出层 ``` --- ### **2. 代码实现对比** #### 全连接层使用不同激活函数 ```csharp using Tensorflow.Keras.Layers; // ReLU激活的隐藏层 var denseRelu = new Dense(128, activation: "relu"); // Sigmoid激活的输出层(二分类) var denseSigmoid = new Dense(1, activation: "sigmoid"); // 自定义LeakyReLU参数 var leakyRelu = new LeakyReLU(alpha: 0.1f); var denseWithLeaky = new Dense(64); denseWithLeaky.Activation = leakyRelu; ``` --- ### **3. 激活函数选择建议** | 场景 | 推荐激活函数 | 理由 | |----------------------|-------------------|----------------------------------------------------------------------| | 隐藏层 | ReLU/LeakyReLU | 缓解梯度消失,计算高效 | | 二分类输出层 | Sigmoid | 输出范围(0,1),符合概率特性 | | 多分类输出层 | Softmax | 输出归一化为概率分布 | | RNN/LSTM | Tanh | 对称输出特性有利于时序数据处理 | | 需要负值输出的隐藏层 | LeakyReLU/ELU | 避免ReLU的"神经元死亡"问题 | --- ### **4. 自定义激活函数** 通过Lambda层实现自定义函数(示例实现Swish激活): $$ \text{Swish}(x) = x \cdot \sigma(\beta x) $$ ```csharp var swishLayer = new Lambda(x => x * TF.Sigmoid(0.5f * x)); var dense = new Dense(64); dense.Activation = swishLayer; ``` --- ### **5. 与DQN模型结合的实战示例** 基于之前DQN代码的改进: ```csharp // 修改Q网络激活函数 public Model BuildModel(int stateSize, int actionSize) { var inputs = new InputLayer(input_shape: (stateSize)); var dense1 = new Dense(64, activation: "leaky_relu").Apply(inputs); // 改用LeakyReLU var dense2 = new Dense(64, activation: tf.keras.activations.ELU()).Apply(dense1); // 使用ELU var outputs = new Dense(actionSize).Apply(dense2); return new Model(inputs, outputs); } ``` --- ### **注意事项** 1. **梯度问题**:ReLU系列的激活函数可能导致梯度爆炸,建议配合`BatchNormalization`使用 2. **初始化适配**:使用He初始化配合ReLU,Xavier初始化配合Tanh 3. **性能监控**:通过TensorBoard观察激活值分布 ```csharp var tensorboard = new TensorBoard(log_dir: "./logs"); model.Fit(..., callbacks: new[] { tensorboard }); ``` 实际项目中建议通过实验选择最佳激活函数组合,不同任务(如DQN中的Q值预测)可能对激活函数敏感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值