【问题标题】:Making custom activation function in tensorflow 2.0在 tensorflow 2.0 中制作自定义激活函数
【发布时间】:2020-12-07 19:48:11
【问题描述】:

我正在尝试在 tensorflow 中创建一个自定义的 tanh() 激活函数来处理我想要的特定输出范围。我希望我的网络输出浓度乘数,所以我想如果 tanh() 的输出为负,它应该返回 0 到 1 之间的值,如果它是正的,则输出 1 到 10 之间的值。

这是我目前拥有的

def output_activation(x):
    # function to scale tanh activation to be 1-10 if x > 0, or 0-1 if x < 0
    return tf.cond(x >= 0, lambda: tf.math.tanh(x+0.1)*10, lambda: tf.math.tanh(x) + 1)

我相信这适用于单个值,但我想输出一个值向量,python 会向该向量抛出一个值错误 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

张量是不可变的,据我了解,如果我在 GPU 上,转换为 numpy 数组并返回会减慢网络训练速度。解决此错误但仍保留硬件加速优势的最佳方法是什么?

【问题讨论】:

  • tf.math.greater(x,0) 仍然返回一个真值向量,这是我的问题。我尝试使用它来迭代张量中的每个值,但我得到了这个我不太理解的错误“”在图形执行中不允许迭代tf.Tensor。使用急切执行或用@tf装饰这个函数.function."""

标签: tensorflow keras tensorflow2.0 activation-function


【解决方案1】:

我建议你tf.keras.backend.switch。这是一个虚拟的例子

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras import backend as K

def output_activation(x):
    return K.switch(x >= 0, tf.math.tanh(x+0.1)*10, tf.math.tanh(x) + 1)

X = np.random.uniform(0,1, (100,10))
y = np.random.uniform(0,1, 100)

inp = Input((10,))
x = Dense(8, activation=output_activation)(inp)
out = Dense(1)(x)

model = Model(inp, out)
model.compile('adam', 'mse')
model.fit(X,y, epochs=3)

这里是正在运行的笔记本:https://colab.research.google.com/drive/1T_kRNUphJt9xTjiOheTgoIGpGDZaaRAg?usp=sharing

【讨论】:

  • 这似乎正是我想做的。谢谢!
猜你喜欢
  • 2018-09-30
  • 2018-08-30
  • 2019-06-12
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多