如何设计一个共享权重、多输入/输出的自动编码器网络? [英] How to design a shared weight, multi input/output Auto-Encoder network?

查看:38
本文介绍了如何设计一个共享权重、多输入/输出的自动编码器网络?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两种不同类型的图像(相机图像及其对应的草图).网络的目标是找到两个图像之间的相似性.

I have two different types of images (camera image and it's corresponding sketch). The goal of the network is to find the similarity between both images.

网络由单个编码器和单个解码器组成.单个编码器-解码器背后的动机是在它们之间共享权重.

The network consists of a single encoder and a single decoder. The motivation behind the single encoder-decoder is to share the weights between them.

input_img = Input(shape=(img_width,img_height, channels))

def encoder(input_img):
    # Photo-Encoder Code
    pe = Conv2D(96, kernel_size=11, strides=(4,4), padding = 'SAME')(left_input) # (?, 64, 64, 96)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)
    pe = MaxPool2D((3, 3), strides=(2, 2), padding = 'VALID')(pe) # (?, 31, 31, 96)

    pe = Conv2D(256, kernel_size=5, strides=(1,1), padding = 'SAME')(pe) # (?, 31, 31, 256)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)
    pe = MaxPool2D((3, 3), strides=(2, 2), padding = 'VALID')(pe) #(?, 15, 15, 256)

    pe = Conv2D(384, kernel_size=3, strides=(1,1), padding = 'SAME')(pe) # (?, 15, 15, 384)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)

    pe = Conv2D(384, kernel_size=3, strides=(1,1), padding = 'SAME')(pe) # (?, 15, 15, 384)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)

    pe = Conv2D(256, kernel_size=3, strides=(1,1), padding = 'SAME')(pe) # (?, 15, 15, 256)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)
    encoded = MaxPool2D((3, 3), strides=(2, 2), padding = 'VALID')(pe) # (?, 7, 7, 256)

    return encoded

def decoder(pe):
    pe = Conv2D(1024, kernel_size=7, strides=(1, 1), padding = 'VALID')(pe)
    pe = BatchNormalization()(pe)
    pe = Activation('selu')(pe)

    p_decoder_inp = Reshape((2,2,256))(pe)   

    pd = Conv2DTranspose(128, kernel_size=5, strides=(2, 2), padding='SAME')(p_decoder_inp)
    pd = Activation("selu")(pd)

    pd = Conv2DTranspose(64, kernel_size=5, strides=(2, 2), padding='SAME')(pd) 
    pd = Activation("selu")(pd)

    pd = Conv2DTranspose(32, kernel_size=5, strides=(2, 2), padding='SAME')(pd)
    pd = Activation("selu")(pd)

    pd = Conv2DTranspose(16, kernel_size=5, strides=(2, 2), padding='SAME')(pd) 
    pd = Activation("selu")(pd)

    pd = Conv2DTranspose(8, kernel_size=5, strides=(2, 2), padding='SAME')(pd)
    pd = Activation("selu")(pd)

    pd = Conv2DTranspose(4, kernel_size=5, strides=(2, 2), padding='SAME')(pd)
    pd = Activation("selu")(pd)

    decoded = Conv2DTranspose(3, kernel_size=5, strides=(2, 2), padding='SAME', activation='sigmoid')(pd) # (?, ?, ?, 3)

    return decoded


siamsese_net = Model([camera_img, sketch_img], [decoder(encoder(camera_img)), decoder(encoder(sketch_img))])

siamsese_net.summary()

当我可视化网络时,它显示了两个不同的网络.

When I visualize the network, it show two-different networks.

但我想要的是一个网络,它接受两个输入,例如,一个相机图像和一个草图图像,并通过使用单个编码器-解码器返回相同的图像.

But what I want is a network which takes two inputs, for example, a camera image and a sketch image and returns same images by using a single encoder-decoder.

我哪里做错了?

推荐答案

你的功能"不是模型",而是创造者".

Your "functions" are not "models", they are "creators".

更新您的两个功能,例如:

Update both your functions like:

def create_encoder(): #no arguments!!!
    pe = Input(shape=(img_width,img_height, channels))
    ....
    encoded = ...

    encoder = Model(pe, encoded)
    return encoder

def create_decoder():
    pe = Input(shape=(7,7,256))
     ....
    decoded = ....

    decoder = Model(pe, decoded)
    return decoder

现在创建模型:

encoder = create_encoder()
decoder = create_decoder()

siamsese_net = Model([camera_img, sketch_img],
                     [decoder(encoder(camera_img)), decoder(encoder(sketch_img))])

#where camera_img and sketch_image are 'Input' objects.

这篇关于如何设计一个共享权重、多输入/输出的自动编码器网络?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆