可以使用哪些方法来扩大图层输出blob的spartial维度?
据我可以从文档中看到,它可以是:
Repeats the rows and columns of the data by size[0] and size[1] respectively.
并且它不是很聪明。Conv2DTranspose 它可以有任意输出大小(不是2个上升的功率)吗?
如何使用任意尺寸进行双线性插值高级扩展(它可以是具有固定权重的Conv2DTranspose?)
还可以使用哪些其他选项来放大图层输出blob的spartial尺寸?
答案 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