Keras自定义图层:如何将图层的输入与自定义图层的已定义参数相乘?

时间:2019-01-25 09:38:36

标签: python tensorflow keras

我正在尝试在Keras中创建一个自定义图层,在该图层中它接受输入并将其与张量相乘,该张量作为参数传递给该图层。我还进行了诸如fft和ifft的操作(以及它们各自的移位),这些操作与我认为的这个问题无关,因为已经测试了它们的正确性,因此需要定义一个自定义层。

我尝试逐行调试我的代码,它似乎可以正常工作,但是当我在模型中对其进行测试时,该层无法提供预期的结果。我还尝试获取变量的形状,并尝试通过压缩参数进行调整,但无济于事。

inputs1 = Input(shape=(256, 256, 1), name='inputs')
inputs2 = Input(shape=(256, 256, 1), name='k_space_real')
inputs3 = Input(shape=(256, 256, 1), name='k_space_imag')

concat1 = concatenate([inputs2, inputs3], axis=3)

concat2 = concatenate([inputs1, concat1], axis=3)

outputs = CustomLayer(arg)(concat2)

self.model = Model(inputs=[inputs1, inputs2, inputs3], outputs=[outputs])
#################################   
class CustomLayer(layers.Layer):
    def __init__(self, mask, **kwargs):
        super(UpdatedDCLayer, self).__init__(**kwargs)
        self.mask = mask

    def call(self, inputs):
        a = inputs[:, :, :, 0] 
        input_k_space_real = inputs[:, :, :, 1] 
        input_k_space_imag = inputs[:, :, :, 2] 
        input_k_space = tf.complex(input_k_space_real, input_k_space_imag) 
        input_k_space = tf.cast(input_k_space, dtype=tf.complex128)

        mask_bool = tf.cast(self.mask, dtype=tf.bool) 
        inv_mask = tf.cast(tf.math.logical_not(mask_bool), dtype=tf.complex128) 

        intermediary = tf.cast(a, dtype=tf.complex128)
        intermediary_k_space = tf.spectral.fft2d(intermediary)
        intermediary_k_space = tf.roll(intermediary_k_space, shift=[128, 128], axis=[0, 1]) 

        output_intermediary = tf.math.multiply(intermediary_k_space, tf.squeeze(inv_mask))
        input_dc_k_space = tf.math.add(output_intermediary, input_k_space)
        input_dc_k_space = tf.roll(input_dc_k_space, shift=[-128, -128], axis=[0, 1])
        output_dc = tf.spectral.ifft2d(input_dc_k_space)
        output_intermediary = tf.roll(output_intermediary, shift=[-128, -128], axis=[0, 1]) 
        output_intermediary = tf.spectral.ifft2d(output_intermediary)
        output_dc = tf.expand_dims(output_dc, -1) 
        output_intermediary = tf.expand_dims(output_intermediary, -1) 
        return [tf.cast(tf.math.abs(output_dc), dtype=tf.float32),
            tf.cast(tf.math.abs(output_intermediary), dtype=tf.float32)]



    def compute_output_shape(self, input_shape):
        shape = list(input_shape)
        shape[-1] = 1
        return [tuple(shape), tuple(shape)]

此层将在模型期间多次使用,并且input1取决于先前的CNN,其中input2和3是常量。所有输入都具有相同的形状[sample_size,256、256、1]。

此自定义层给出了结果,但没有给出预期的结果。问题似乎源于此行:

output_intermediary = tf.math.multiply(intermediary_k_space, tf.squeeze(inv_mask))

因此,如上所述,我的问题是关于这个乘法过程的。如果是这样的话,我可能会问得很不好。

非常感谢:)

0 个答案:

没有答案