问题描述
我试图在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,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