【问题标题】:Keras - Fusion of a Dense Layer with a Convolution2D LayerKeras - 密集层与 Convolution2D 层的融合
【发布时间】:2017-04-10 04:29:25
【问题描述】:

我想制作一个自定义层,它应该将密集层的输出与 Convolution2D 层融合。

创意来自this paper,网络如下:

融合层尝试将 Convolution2D 张量 (256x28x28) 与密集张量 (256) 融合。这是它的方程式:

y_global => Dense layer output with shape 256 y_mid => Convolution2D layer output with shape 256x28x28

这里是关于 Fusion 过程的论文的描述:

我最终制作了一个新的自定义层,如下所示:

class FusionLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(FusionLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        input_dim = input_shape[1][1]
        initial_weight_value = np.random.random((input_dim, self.output_dim))
        self.W = K.variable(initial_weight_value)
        self.b = K.zeros((input_dim,))
        self.trainable_weights = [self.W, self.b]

    def call(self, inputs, mask=None):
        y_global = inputs[0]
        y_mid = inputs[1]
        # the code below should be modified
        output = K.dot(K.concatenate([y_global, y_mid]), self.W)
        output += self.b
        return self.activation(output)

    def get_output_shape_for(self, input_shape):
        assert input_shape and len(input_shape) == 2
        return (input_shape[0], self.output_dim)

我认为我的 __init__build 方法是正确的,但我不知道如何在 call 层中将 y_global(256 个维度)与 y-mid(256x28x28 尺寸)连接起来,以便输出将与上述等式相同。

如何在call 方法中实现这个等式?

非常感谢...

更新:任何其他成功整合这 2 层数据的方式对我来说也是可以接受的......它不一定是论文中提到的方式,但它至少需要返回一个可接受的输出。 ..

【问题讨论】:

    标签: python neural-network theano keras keras-layer


    【解决方案1】:

    在我看来,实现一种新的层是使这项任务复杂化的一种方式。我强烈建议您使用以下层:

    为了获得预期的行为。

    【讨论】:

      【解决方案2】:

      我不得不在 Keras Github 页面上问这个问题,有人帮我解决了如何正确实现它...这是 github 上的 issue...

      【讨论】:

        【解决方案3】:

        我正在从事图像着色项目并最终面临融合层问题,然后我找到了一个包含融合层的模型。 在这里希望能在一定程度上解决你的问题。

            embed_input = Input(shape=(1000,))
            encoder_input = Input(shape=(256, 256, 1,))
        
            #Encoder
            encoder_output = Conv2D(64, (3,3), activation='relu', padding='same', strides=2,
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_input)
            encoder_output = Conv2D(128, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(128, (3,3), activation='relu', padding='same', strides=2,
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(256, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(256, (3,3), activation='relu', padding='same', strides=2,
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(512, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(512, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
            encoder_output = Conv2D(256, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(encoder_output)
        
            #Fusion
            fusion_output = RepeatVector(32 * 32)(embed_input)
            fusion_output = Reshape(([32, 32, 1000]))(fusion_output)
            fusion_output = concatenate([encoder_output, fusion_output], axis=3)
            fusion_output = Conv2D(256, (1, 1), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(fusion_output)
        
            #Decoder
            decoder_output = Conv2D(128, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(fusion_output)
            decoder_output = UpSampling2D((2, 2))(decoder_output)
            decoder_output = Conv2D(64, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(decoder_output)
            decoder_output = UpSampling2D((2, 2))(decoder_output)
            decoder_output = Conv2D(32, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(decoder_output)
            decoder_output = Conv2D(16, (3,3), activation='relu', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(decoder_output)
            decoder_output = Conv2D(2, (3, 3), activation='tanh', padding='same',
                                    bias_initializer=TruncatedNormal(mean=0.0, stddev=0.05))(decoder_output)
            decoder_output = UpSampling2D((2, 2))(decoder_output)
        
            model = Model(inputs=[encoder_input, embed_input], outputs=decoder_output)
        

        这里是源链接:https://github.com/hvvashistha/Auto-Colorize

        【讨论】:

          猜你喜欢
          • 2016-10-24
          • 2017-05-25
          • 2015-09-15
          • 2016-03-24
          • 1970-01-01
          • 2021-05-07
          • 2021-07-20
          • 2020-08-17
          • 2023-03-06
          相关资源
          最近更新 更多