Python 如何在tensorflow中创建自定义激活函数

Python 如何在tensorflow中创建自定义激活函数,python,tensorflow,deep-learning,conv-neural-network,activation-function,Python,Tensorflow,Deep Learning,Conv Neural Network,Activation Function,我需要做一个在tensorflow中不存在的激活函数。我应该怎么做?我曾经看到过这个链接, 但我仍然不知道如何在图片中实现新类型的激活函数。 我想这个可以为您服务。我只使用了以这种方式合并tensorflow的函数,是他管理反向传播 如果使用python函数,则必须同时对向前和向后进行编程。但问题是,当您必须将分段函数的函数掩码保存在“缓存”中时(就我个人而言,我不知道它是如何完成的,知道它会很有趣) 将numpy导入为np 导入tensorflow作为tf def new_relu(x,k=0

我需要做一个在tensorflow中不存在的激活函数。我应该怎么做?我曾经看到过这个链接, 但我仍然不知道如何在图片中实现新类型的激活函数。

我想这个可以为您服务。我只使用了以这种方式合并tensorflow的函数,是他管理反向传播

如果使用python函数,则必须同时对向前和向后进行编程。但问题是,当您必须将分段函数的函数掩码保存在“缓存”中时(就我个人而言,我不知道它是如何完成的,知道它会很有趣)

将numpy导入为np
导入tensorflow作为tf
def new_relu(x,k=0.2):
part_1=tf.to_float(tf.math.less_等于(0.0,x))
part_2=tf.to_float(tf.math.logical_和(tf.math.less_等于(-1.0,x),tf.math.less(x,0.0)))
part_3=tf.to_float(tf.math.less(x,-1.0))
返回部分1*x+部分2*x*k+部分3*0
def new_relu_测试():
#创建数据
x=tf.随机_正态([10])*10000
y=新的(x)
使用tf.Session():
diff=tf.test.compute_gradient_error(x[10],y[10])
打印(差异)
#密集使用
x=tf.placeholder(shape=[None,3],dtype=tf.float32)
nn=tf.layers.dense(x,3,激活=new_relu)
编辑: 如果希望第二个参数也是张量,则必须与输入的大小相同

import numpy as np
import tensorflow as tf

def new_relu(x, k=0.2):
    part_1 = tf.to_float(tf.math.less_equal(0.0, x))
    part_2 = tf.to_float(tf.math.logical_and(tf.math.less_equal(-1.0, x), tf.math.less(x, 0.0)))
    part_3 = tf.to_float(tf.math.less(x, -1.0))
    return part_1*x + part_2*x*k #+ part_3*0

def new_relu_test():
    # create data
    x = tf.random_normal([10])*10000
    y = new_relu(x)
    with tf.Session():
        diff = tf.test.compute_gradient_error(x, [10], y, [10])
        print(diff)

    # use in dense
    x = tf.placeholder(shape=[None, 3], dtype=tf.float32)
    x_b = tf.placeholder(shape=[None], dtype=tf.float32)
    nn_1 = tf.layers.dense(x, 3)
    nn_2 = tf.layers.dense(x, 3)
    nn = tf.layers.dense(nn_2, 1, activation=None)
    new_r = new_relu(x, tf.tile(tf.expand_dims(x_b, -1), [1, 3]))

    with tf.Session() as sess:
        sess.run(tf.initializers.global_variables())
        sess.run(new_r, feed_dict={x: np.random.rand(100, 3), x_b: np.random.rand(100)})

new_relu_test()
编辑2:

使用conv2d

import numpy as np
import tensorflow as tf

def new_relu(x, k=0.2):
    part_1 = tf.to_float(tf.math.less_equal(0.0, x))
    part_2 = tf.to_float(tf.math.logical_and(tf.math.less_equal(-1.0, x), tf.math.less(x, 0.0)))
    part_3 = tf.to_float(tf.math.less(x, -1.0))
    return part_1*x + part_2*x*k #+ part_3*0

def new_relu_test():
    # create data
    x = tf.random_normal([10])*10000
    y = new_relu(x)
    with tf.Session():
        diff = tf.test.compute_gradient_error(x, [10], y, [10])
        print(diff)

    # use in dense
    x = tf.placeholder(shape=[None, 28, 28, 3], dtype=tf.float32)

    conv1_weights = tf.get_variable("weight",[3,3,3,32],initializer=tf.truncated_normal_initializer(stddev=0.1))
    conv1_biases = tf.get_variable("bias", [32], initializer=tf.constant_initializer(0.0))
    conv1 = tf.nn.conv2d(x, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
    relu1 = new_relu(tf.nn.bias_add(conv1, conv1_biases))

    with tf.Session() as sess:
        sess.run(tf.initializers.global_variables())
        sess.run(relu1, feed_dict={x: np.random.rand(100, 28, 28, 3)})
new_relu_test()

谢谢,还有一个问题,relu的输入是一个张量,像这样,conv1_weights=。。。。。。conv1_偏差=。。。。。。。conv1=。。。。。。relu1的relu1=tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases))参数relu1是张量,但new_relu是一个值,如何修改它使new_relu与relu1Ami使用您的代码为我工作的一样,我已经更新了注释,以便您可以看到它。我可能理解。但我仍然有一些问题,我使用new_relu replace tf.nn.relu并运行它。但我没有添加这段代码,将tf.session()作为sess:sess.run(tf.initia…)sess.run(relu1,feed_dict=…),我添加了另一个答案,看看是否可以