首页 > 解决方案 > 在 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 还是我选择的激活?任何帮助表示赞赏。提前致谢。

标签: pythontensorflowkerastensorflow2.0

解决方案


你不能真的只使用对数作为激活函数,因为它没有为 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>

所以这不是一个编程问题,而是一个数学理解问题。


推荐阅读