我有一个定制的Keras层,我想从特定的输入返回特定的输出。我不希望它是可训练的。
该图层应执行以下操作
if input = [1,0] then output = 1
if input = [0,1] then output = 0
相反,它总是输出-1,如果有问题,我会设置该值。
我认为行不如预期的是:
if(test_mask_1_result_count == 2)
这是自定义图层:
class my_custom_layer(layers.Layer):
def __init__(self, **kwargs):
super(my_custom_layer, self).__init__(**kwargs)
def call(self, inputs,training=None):
def encode():
# set up the test mask:
test_mask_1 = np.array([0,1],dtype=np.int32)
k_test_mask_1 = backend.variable(value=test_mask_1)
# test if the input is equal to the test mask
test_mask_1_result = backend.equal(inputs,k_test_mask_1)
# add up all the trues
test_mask_1_result_count = tf.reduce_sum(tf.cast(test_mask_1_result, tf.int32))
# return if we've found the right mask
if(test_mask_1_result_count == 2):
res = np.array([0]).reshape((1,)) #top left
k_res = backend.variable(value=res)
return k_res
# set up to test the second mask
test_mask_2 = np.array([1,0],dtype=np.int32)
k_test_mask_2 = backend.variable(value=test_mask_2)
# test if the input is equal to the test mask
test_mask_2_result = backend.equal(inputs,k_test_mask_2)
# add up all the trues
test_mask_2_result_count = tf.reduce_sum(tf.cast(test_mask_2_result, tf.int32))
# return if we've found the right mask
if(test_mask_2_result_count == 2):
res = np.array([1]).reshape((1,)) #top left
k_res = backend.variable(value=res)
return k_res
# if we've got here we're in trouble:
res = np.array([-1]).reshape((1,)) #top left
k_res = backend.variable(value=res)
return k_res
return encode()
def compute_output_shape(self, input_shape):
return (input_shape[0],1)
为什么if
永远不会触发?
我还使用网络外部的keras制作了MWE。这似乎按预期工作:
mask_1 = np.array([1,0],dtype=np.int32)
k_mask_1 = backend.variable(value=mask_1)
input_1 = np.array([1,0],dtype=np.int32)
k_input_1 = backend.variable(value=input_1)
mask_eq = backend.equal(k_input_1,k_mask_1)
mask_eq_sum = tf.reduce_sum(tf.cast(mask_eq, tf.int32))
# keras backend
sess = backend.get_session()
print(sess.run(mask_eq_sum))
输出2
我怀疑有些根本不了解的东西。
答案 0 :(得分:1)
我不确定您的代码出了什么问题,但是您的层似乎比所需的要复杂得多。例如,
my_custom_layer = layers.Lambda(lambda x: x[0])
应符合您的规格。如果您希望它更可靠,可以使用
my_custom_layer = layers.Lambda(lambda x: 1 if x == [1,0] else 0 if x == [0,1] else -1)
或
def mask_func(in_t):
if in_t == [1,0]:
return 1
elif in_t == [0,1]:
return 0
else:
return -1
my_custom_layer = layers.Lambda(mask_func)
相反。假设您使用的是TF2.0
,则自定义图层的宽容度很高。显然,如果您要使用它来处理批处理,则需要对其进行一些修改,但希望您会明白这一点。