python - 在 TensorFlow2.0.0 中创建自定义激活
问题描述
我正在 Colab 上做一个项目。我想创建一个自定义激活以在 TensorFlow 2.0.0 中使用,如下所示:
def custom_activation(x):
return tf.math.log(x)
model = tf.keras.models.Sequential([
... # some layers
tf.keras.layers.Dense(10, activation=custom_activation),
tf.keras.layers.Dense(1)
])
在训练时,我看到以下内容:
Epoch 1/100
9/Unknown - 6s 674ms/step - loss: nan - mae: nan
为什么是损失和mae nan?据我了解,TF2.0.0 启用了急切执行。那么这不意味着我可以在不设置会话的情况下评估 tf.math.log(x) 吗?自定义激活似乎适用于其他变体,例如 tf.math.abs(x)。知道我在这里做错了什么吗?是因为 Colab 还是我选择的激活?任何帮助表示赞赏。提前致谢。
解决方案
你不能真的只使用对数作为激活函数,因为它没有为 values 定义x <= 0.0
,所以如果在任何时候 Dense 层产生负值或零值,对数将产生nan
,然后传播到损失。
您可以轻松地测试它:
import tensorflow as tf
print(tf.math.log(-1.0))
产生:
<tf.Tensor: id=1, shape=(), dtype=float32, numpy=nan>
所以这不是一个编程问题,而是一个数学理解问题。
推荐阅读
- javascript - 如何计算偏移量以绘制到画布中应用了比例变换的最近像素?
- azure-devops - Azure DevOps Yaml Pipeline 中的调试
- ruby - Ruby:更好地理解 .to_enum
- php - Nextcloud:上传大文件
- google-chrome - chrome错误中无限上下滚动
- node.js - 使用本地 DevOpps buildserver 实现 npm-offline
- reactjs - 为什么我的 firebase 聊天仅在我退出屏幕或关闭聊天并重新打开时才显示消息?
- c# - 在 C# GRPC 服务器中查找分配给端点的端口号
- c# - 使用 DisposeAsync 使用 SuppressFinalize
- windows - 如何在cmd中登录github?