Маска или ломтик переменного размера Keras - PullRequest
1 голос
/ 02 ноября 2019

Я работаю над CNN Super Resolution (5x), который работает с одноканальными изображениями с входной формой (None, None, None, 1)

Предположим, что изображение с верхним рядом

[x, x, x, x, x, y, y, y, y, y]

с уменьшением в 5 раз становится

[x, y]

Рассмотрим сеть, состоящую из одного слоя Conv2DTranspose с шагом 5x5 и матрицы с постоянными матрицами 9x9. Применение этого к [x, y] дает

[x, x, x, x, X, x+y, x+y, x+y, x+y, Y, y, y, y, y]

(здесь X, Y обозначает центр набора пикселей, сгенерированных из x, y)

Итак, мы перешли от матрицы с 2 столбцами к матрице из 14 столбцов.

Один из способов сравнить этот масштабированный вывод с исходным изображением - это дополнить исходное изображение с помощью (filter_size - stride_size)/2 = (9-5)/2 =2 записи на каждой стороне

[0, 0, x, x, x, x, x, y, y, y, y, y, 0, 0]

, которые затем хорошо сочетаются с нашей уменьшенной версией уменьшенного изображения

[x, x, x, x, X, x+y, x+y, x+y, x+y, Y, y, y, y, y]

На данный моментЯ готов взять разницу между этими двумя строками и рассчитать потери.

Однако искусственные 4 граничные точки будут способствовать потере. Я явно не забочусь об ошибке в этой искусственной граничной области. Как я могу убедиться, что эти значения не включены в потери?

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

import keras
import numpy as np
model = keras.Sequential()
model.add(keras.layers.Conv2DTranspose(1, (9,9), strides=(5,5), input_shape=(None, None, 1),
        kernel_initializer='ones', bias_initializer='zeros'))
#x is downscaled image
x = np.zeros([1,2,2,1])
x[0,0,0,0] = 1
x[0,0,-1,0] = .5

#y is original image
y = np.zeros([1,10,10,1])
y[0,0,:,0]= [1,1,1,1,1,.5,.5,.5,.5,.5]

y_pred = model.predict(x)

paddings = ((0,0),(2,2),(2,2),(0,0))
y_pad = np.pad(y, paddings, mode='constant')

# want keras to calculate loss of
# y_pad[:,2:-2,2:-2,:] - y_pred[:,2:-2,2:-2,:]```

1 Ответ

0 голосов
/ 04 ноября 2019

Похоже, что самый простой способ обрезать слой заполнения - это использовать слой Conv2D с фиксированным ядром и смещением без заполнения.

depad_kernel = np.zeros([2*padding+1,2*padding+1])
depad_kernel[padding, padding,0,0] = 1

depad_bias = np.zeros([1])

depadded_output = model.add_layer(
        keras.layers.Conv2D(1, (2*padding+1, 2*padding+1), strides=(1,1),
                            weights=[depad_kernel, depad_bias], trainable=False))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...