keras定制激活到在一定条件下滴

问题描述 投票:0回答:1

我想的降幅超过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"]()]]

我的理解是什么问题;自定义激活功能无法找到输入正确的批量大小。但我不知道如何控制它们。

任何人都可以解决这个问题或建议其他方法来代替某些元素值在某些情况下?

replace keras keras-layer activation activation-function
1个回答
1
投票

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

ValueError异常:与输入的形状:不能重塑张量与19200个元素塑造[1028,300,64](19737600种元素)关于 'Reshape_8'( '整形' OP):[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)
© www.soinside.com 2019 - 2024. All rights reserved.