keras 自定义激活在某些条件下下降

Posted

技术标签:

【中文标题】keras 自定义激活在某些条件下下降【英文标题】:keras custom activation to drop under certain conditions 【发布时间】:2019-07-01 01:46:37 【问题描述】:

我正在尝试在我的自定义激活中删除小于 1 和大于 -1 的值,如下所示。

def ScoreActivationFromSigmoid(x, target_min=1, target_max=9) :
    condition = K.tf.logical_and(K.tf.less(x, 1), K.tf.greater(x, -1))
    case_true = K.tf.reshape(K.tf.zeros([x.shape[1] * x.shape[2]], tf.float32), shape=(K.tf.shape(x)[0], x.shape[1], x.shape[2]))
    case_false = x
    changed_x = K.tf.where(condition, case_true, case_false)

    activated_x = K.sigmoid(changed_x)
    score = activated_x * (target_max - target_min) + target_min
    return  score

数据类型有 3 个维度:batch_size x sequence_length x 特征数。

但我得到了这个错误

nvalidArgumentError: Inputs to operation activation_51/Select of type Select must have the same size and shape.  Input 0: [1028,300,64] != input 1: [1,300,64]
     [[node activation_51/Select = Select[T=DT_FLOAT, _class=["loc:@training_88/Adam/gradients/activation_51/Select_grad/Select_1"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](activation_51/LogicalAnd, activation_51/Reshape, dense_243/add)]]
     [[node metrics_92/acc/Mean_1/_9371 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_473_metrics_92/acc/Mean_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

我了解问题所在;自定义激活函数找不到合适的输入批量大小。但我不知道如何控制它们。

谁能解决这个问题或建议其他方法在某些情况下替换某些元素值?

【问题讨论】:

您确定可以为您的激活函数提供可微分性吗? 【参考方案1】:

我在运行你的代码时得到的错误信息是:

ValueError: 无法重塑具有 19200 个元素的张量以进行整形 [1028,300,64](19737600 个元素)用于“Reshape_8”(操作:“Reshape”) 输入形状:[19200],[3],输入张量计算为部分 形状:输入[1] = [1028,300,64]。

问题应该是你不能将形状 [x.shape[1] * x.shape[2]] 的张量重塑为 (K.tf.shape(x)[0], x.shape[1 ],x.shape[2])。这是因为它们的元素数量不同。

所以解决方案只是创建一个正确形状的零数组。 这一行:

case_true = K.tf.reshape(K.tf.zeros([x.shape[1] * x.shape[2]], tf.float32), shape=(K.tf.shape(x)[0], x.shape[1], x.shape[2]))

应该替换为:

case_true = K.tf.reshape(K.tf.zeros([x.shape[0] * x.shape[1] * x.shape[2]], K.tf.float32), shape=(K.tf.shape(x)[0], x.shape[1], x.shape[2]))

或使用K.tf.zeros_like:

case_true = K.tf.zeros_like(x)

可行的代码:

import keras.backend as K
import numpy as np

def ScoreActivationFromSigmoid(x, target_min=1, target_max=9) :
    condition = K.tf.logical_and(K.tf.less(x, 1), K.tf.greater(x, -1))
    case_true = K.tf.zeros_like(x)
    case_false = x
    changed_x = K.tf.where(condition, case_true, case_false)

    activated_x = K.tf.sigmoid(changed_x)
    score = activated_x * (target_max - target_min) + target_min
    return  score

with K.tf.Session() as sess:
    x = K.tf.placeholder(K.tf.float32, shape=(1028, 300, 64), name='x')
    score = sess.run(ScoreActivationFromSigmoid(x), feed_dict='x:0':np.random.randn(1028, 300, 64))

print(score)

【讨论】:

非常感谢,我已经以与您非常相似的方式解决了这个问题。我仍然感谢您详细解释!

以上是关于keras 自定义激活在某些条件下下降的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中使用自定义步骤激活函数会导致“'tuple' object has no attribute '_keras_shape'”错误。如何解决这个问题?

keras中模型如何传递到函数里供函数体使用

如何强制 TensorFlow 在 float16 下运行?

在具有条件的 keras 中实现自定义损失函数

用条件在keras中实现自定义丢失函数

如何为层中的每个节点为 Keras relu 函数分配自定义 alpha?