Tensorflow,平方根激活函数实现(成形错误)

时间:2018-09-23 06:33:15

标签: python python-3.x tensorflow activation-function

出于实现分类NN的目的,我发现了一些非常有用的教程,例如this one(2个隐藏层,一次热编码输出,辍学正则化,规范化等),这对我有所帮助Tensorflow API背后的学习曲线。但是,通过阅读publication on SQRT activation functions并看到乐观的反馈,我想在我的NN体系结构中进行实验。

在Tensorflow API中找不到它之后,我研究了如何定义自定义激活函数,并发现了this stack-overflow solution,并认为“应该”可以使用Tensorflow原语实现。

因此,如果需要SQRT激活功能(请原谅粘贴,看起来比输入我自己更好):

Square root activation function

我插入了这段代码,而不是隐藏层的ReLU函数:

# ==== old activation function
# b = bias value x bias weight
# inputs = x data 
# w = weights
y = tf.nn.relu( tf.add( tf.matmul(w, tf.transpose(inputs)), b))

# ===== new act function
net = tf.cast( tf.add( tf.matmul(w, tf.transpose(inputs)), b), tf.float32)  # net input to activation function
cond = tf.greater_equal(net, tf.constant(0.0, dtype=tf.float32))            # >= condition
condTrue = tf.sqrt(net)                                   # if True
minOne = tf.constant(-1.0, shape=(N,1) dtype=tf.float32)  # -1 constant value
condFalse = tf.matmul(minOne, tf.sqrt( tf.abs(net)))      # if False
y = tf.cond(cond, lambda: condTrue, lambda: condFalse)    # act. function output 

但是,如果我尝试运行此代码,则会出现整形错误:

  

ValueError(“尺寸必须相等,但输入形状为[107,1],[107 ,?]的'MatMul_2'(op:'MatMul')的尺寸必须为1和107”。)

有人可以看看代码片段,然后告诉我我的方法是否正确吗?除了指出输入之间的等级问题的错误之外,我怀疑我更大的问题仍然是理解和绕过基于矩阵的Tensorflow运算符。

在所有乘法,加法和转置之间,我无法掌握张量所需的基础数据形状。我的代码是否可以正确定义预期的激活函数(以及反向支持派生函数呢?),否则,请描述我在哪里出错以及如何出错?

请提供任何帮助,我想更好地理解问题(因为我仍在学习API)

1 个答案:

答案 0 :(得分:1)

您可以使用更简单的逻辑来实现激活功能:

x = tf.constant([ -4, 4, -2, 2, 0], tf.float32)
act = tf.sign(x)* tf.sqrt(tf.abs(x))

with tf.Session() as sess:
   print(sess.run(act))

#[-2.  2. -1.4142135 1.4142135 0. ]