首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射填充Conv2D

反射填充Conv2D
EN

Stack Overflow用户
提问于 2018-06-04 17:37:55
回答 5查看 11.4K关注 0票数 6

我正在使用keras构建一个用于图像分割的卷积神经网络,我想使用“反射填充”而不是填充“相同”,但我找不到在keras中这样做的方法。

代码语言:javascript
复制
inputs = Input((num_channels, img_rows, img_cols))
conv1=Conv2D(32,3,padding='same',kernel_initializer='he_uniform',data_format='channels_first')(inputs)

有没有一种方法可以实现反射层并将其插入到keras模型中?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-04 19:27:05

找到解决方案了!我们只需要创建一个以层作为输入的新类,并使用tensorflow预定义函数来完成它。

代码语言:javascript
复制
import tensorflow as tf
from keras.engine.topology import Layer
from keras.engine import InputSpec

class ReflectionPadding2D(Layer):
    def __init__(self, padding=(1, 1), **kwargs):
        self.padding = tuple(padding)
        self.input_spec = [InputSpec(ndim=4)]
        super(ReflectionPadding2D, self).__init__(**kwargs)

    def get_output_shape_for(self, s):
        """ If you are using "channels_last" configuration"""
        return (s[0], s[1] + 2 * self.padding[0], s[2] + 2 * self.padding[1], s[3])

    def call(self, x, mask=None):
        w_pad,h_pad = self.padding
        return tf.pad(x, [[0,0], [h_pad,h_pad], [w_pad,w_pad], [0,0] ], 'REFLECT')

# a little Demo
inputs = Input((img_rows, img_cols, num_channels))
padded_inputs= ReflectionPadding2D(padding=(1,1))(inputs)
conv1 = Conv2D(32, 3, padding='valid', kernel_initializer='he_uniform',
               data_format='channels_last')(padded_inputs)
票数 3
EN

Stack Overflow用户

发布于 2018-11-17 17:41:34

上面接受的答案在当前的Keras版本中不起作用。以下是正在运行的版本:

代码语言:javascript
复制
class ReflectionPadding2D(Layer):
    def __init__(self, padding=(1, 1), **kwargs):
        self.padding = tuple(padding)
        self.input_spec = [InputSpec(ndim=4)]
        super(ReflectionPadding2D, self).__init__(**kwargs)

    def compute_output_shape(self, s):
        """ If you are using "channels_last" configuration"""
        return (s[0], s[1] + 2 * self.padding[0], s[2] + 2 * self.padding[1], s[3])

    def call(self, x, mask=None):
        w_pad,h_pad = self.padding
        return tf.pad(x, [[0,0], [h_pad,h_pad], [w_pad,w_pad], [0,0] ], 'REFLECT')
票数 7
EN

Stack Overflow用户

发布于 2018-08-25 01:51:34

代码语言:javascript
复制
import tensorflow as tf
from keras.layers import Lambda

inp_padded = Lambda(lambda x: tf.pad(x, [[0,0], [27,27], [27,27], [0,0]], 'REFLECT'))(inp)

Akihiko的解决方案不适用于新的keras版本,因此我提出了自己的解决方案。该代码段将一批202x202x3图像填充到256x256x3

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50677544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档