Keras:扩大图层输出blob的spartial维度的方法

时间:2017-05-25 17:04:47

标签: deep-learning keras conv-neural-network convolution keras-layer

可以使用哪些方法来扩大图层输出blob的spartial维度?

据我可以从文档中看到,它可以是:

  1. UpSampling2D   它仅以2的幂进行上采样吗?   它也Repeats the rows and columns of the data by size[0] and size[1] respectively.并且它不是很聪明。
  2. Conv2DTranspose 它可以有任意输出大小(不是2个上升的功率)吗?

    如何使用任意尺寸进行双线性插值高级扩展(它可以是具有固定权重的Conv2DTranspose?)

    还可以使用哪些其他选项来放大图层输出blob的spartial尺寸?

2 个答案:

答案 0 :(得分:9)

扩展answer from y300,这是在Keras Lambda图层中包装TensorFlow双线性图像大小的完整示例:

from keras import Sequential
from keras.layers import Lambda
import tensorflow as tf

def UpSampling2DBilinear(size):
    return Lambda(lambda x: tf.image.resize_bilinear(x, size, align_corners=True))

upsampler = Sequential([UpSampling2DBilinear((256, 256))])

upsampled = upsampler.predict(images)

请注意,align_corners=True可以获得与其他双线性图像上采样算法类似的效果,如this post中所述。

要使用双三次重采样,请创建一个新功能并将resize_bilinear替换为resize_bicubic

对于与UpSampling2D更相似的实现,请尝试以下方法:

from keras import backend as K

def UpSampling2DBilinear(stride, **kwargs):
    def layer(x):
        input_shape = K.int_shape(x)
        output_shape = (stride * input_shape[1], stride * input_shape[2])
        return tf.image.resize_bilinear(x, output_shape, align_corners=True)
    return Lambda(layer, **kwargs)

这将允许您使用name=''input_shape=''Lamba的其他参数,并允许您传递整数步幅/上采样量。

答案 1 :(得分:0)

您可以定义自己的调整大小图层:

from keras import layers, models, utils
from keras.backend import tf as ktf

class Interp(layers.Layer):
    def __init__(self, new_size, **kwargs):
        self.new_size = new_size
        super(Interp, self).__init__(**kwargs)

    def build(self, input_shape):
        super(Interp, self).build(input_shape)

    def call(self, inputs, **kwargs):
        new_height, new_width = self.new_size
        resized = ktf.image.resize_images(inputs, [new_height, new_width],
                                          align_corners=True)
        return resized

    def compute_output_shape(self, input_shape):
        return tuple([None, self.new_size[0], self.new_size[1], input_shape[3]])

    def get_config(self):
        config = super(Interp, self).get_config()
        config['new_size'] = self.new_size
        return config