我正试图在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.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