Отражающая обивка Conv2D - PullRequest
0 голосов
/ 04 июня 2018

Я использую кераты для построения сверточной нейронной сети для сегментации изображения и хочу использовать «отступы для отражения» вместо «одинаковых», но я не могу найти способ сделать это в кератах.

inputs = Input((num_channels, img_rows, img_cols))
conv1=Conv2D(32,3,padding='same',kernel_initializer='he_uniform',data_format='channels_first')(inputs)

Есть ли способ реализовать слой отражения и вставить его в модель keras?

Ответы [ 4 ]

0 голосов
/ 17 ноября 2018

Принятый ответ выше не работает в текущей версии Keras.Вот версия, которая работает:

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')
0 голосов
/ 04 июня 2018

Нашли решение!Нам нужно только создать новый класс, который будет принимать слой в качестве входных данных, и использовать для этого предопределенную функцию tenorflow.

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)
0 голосов
/ 24 августа 2018
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

0 голосов
/ 04 июня 2018

Как вы можете проверить в документации , нет такого "отражающего" отступа.Только «то же» и «действительный» реализованы в кератах.

Возможно, вы попытаетесь реализовать это самостоятельно или найдете, если кто-то уже это сделал.Вы должны основать себя в классе Conv2D и проверить, где используется self.padding переменная-член.

...