Слои Tensorflow / Keras Conv2D с отступом = 'ЖЕ' ведут себя странно - PullRequest
0 голосов
/ 20 февраля 2020

Мой вопрос:

Проведенный мной простой эксперимент показал, что использование padding='SAME' в слое conv2d в Keras / TF отличается от использования padding='VALID' с предыдущим нулем. слой заполнения.

  1. Как это возможно?
  2. Располагает ли Keras / TF нули симметрично вокруг тензора?

Объяснение эксперимента - просто если вам интересно читать дальше:

Я использовал пакет onnx2keras для преобразования моей модели Pytorch в keras / TF.

Когда onnx2keras встречает сверточный Слой с padding > 0 в модели ONNX переводит его в Keras 'Conv2D с valid дополнением (то есть без заполнения!), перед которым стоит слой Keras ZeroPadding2D. Это работает очень хорошо и возвращает выходные данные, которые идентичны полученным сетью Pytorch.

Я все же подумал, что странно, что он просто не использовал padding='SAME', так как большинство ссылок говорят, что Keras / TF использует заполнение нулями, точно так же, как Pytorch.

Тем не менее, я пропатчил onnx2keras и сделал так, чтобы я получал Conv2D слоев с padding='SAME', а не существующее решение заполнения 'VALID' с предшествующим нулем слой Это привело к тому, что результирующая модель возвращала разные выходные данные, чем та, которая имела слой с нулевым заполнением, и, конечно, отличалась от моей модели Pytorch, которая была идентична до исправления.

1 Ответ

1 голос
/ 02 апреля 2020

padding='Same' в Keras означает, что при необходимости добавляются отступы, чтобы компенсировать перекрытия, когда размер входных данных и размер ядра не полностью совпадают.

Пример заполнения = 'Same':

# Importing dependency
import keras
from keras.models import Sequential
from keras.layers import Conv2D

# Create a sequential model
model = Sequential()

# Convolutional Layer
model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Same'))

# Model Summary
model.summary()

Вывод кода -

Model: "sequential_20"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_28 (Conv2D)           (None, 3, 3, 24)          120       
=================================================================
Total params: 120
Trainable params: 120
Non-trainable params: 0
_________________________________________________________________

Графическое представление: На рисунке ниже показано, как заполнение для ввода (input_shape = (5,5,1), kernel_size = (2,2), шаги = (2,2)) при заполнении = 'Same' .

enter image description here

---------------------------- -------------------------------------------------- ------------------------------------

padding='Valid' в керасе означает отсутствие заполнения

Пример заполнения = 'Valid': Использовали тот же ввод для Conv2D, который мы использовали выше для заполнения = 'Same' .ie (input_shape = (5,5,1 ), kernel_size = (2,2), шаги = (2,2))

# Importing dependency
import keras
from keras.models import Sequential
from keras.layers import Conv2D

# Create a sequential model
model = Sequential()

# Convolutional Layer
model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

# Model Summary
model.summary()

Вывод кода -

Model: "sequential_21"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_29 (Conv2D)           (None, 2, 2, 24)          120       
=================================================================
Total params: 120
Trainable params: 120
Non-trainable params: 0
_________________________________________________________________

Графическое представление: На рисунке ниже показано, что для ввода не добавляются отступы (input_shape = (5,5,1), kernel_size = (2,2), шаги = (2,2)) при заполнении = 'Valid' , enter image description here

----------------------------------- -------------------------------------------------- -----------------------------

Теперь давайте попробуем тот же код, который мы использовали для padding='Valid' для ввода (input_shape = (6,6,1), kernel_size = (2,2), шаги = (2,2)). Здесь padding='Valid' должен вести себя так же, как padding='Same'.

Код -

# Importing dependency
import keras
from keras.models import Sequential
from keras.layers import Conv2D

# Create a sequential model
model = Sequential()

# Convolutional Layer
model.add(Conv2D(filters=24, input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

# Model Summary
model.summary()

Вывод кода -

Model: "sequential_22"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_30 (Conv2D)           (None, 3, 3, 24)          120       
=================================================================
Total params: 120
Trainable params: 120
Non-trainable params: 0
_________________________________________________________________
...