Я работаю над 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,:]```