Я пытаюсь сверточный автоэнкодер на нескольких участках. Тем не менее, я сталкиваюсь с проблемами с нулевыми краями декодированного сигнала (рисунок se)
График истинности земли (слева) и расшифрованный график (справа)
Я так понимаю, это из-за заполнения. Фильтры, как при кодировании, так и при декодировании, дают меньшие значения по краям при использовании заполнения нулями. Следовательно, края декодированного сигнала приближаются к нулю.
Есть ли способ обойти это? Я мог бы вычесть среднее значение сигнала, чтобы уменьшить проблему ... Однако, это важная цифра, которую я хочу быть частью закодированных значений (без обхода сверток). Пульсация при высоком значении может означать нечто иное, чем та же пульсация при низком значении.
Я пробовал тип причинного заполнения, и, хотя проблема, кажется, теряет симметрию (конец выглядит лучше), это явление все еще сохраняется. Я уменьшил размеры фильтра и убрал расширение, и это, кажется, помогает. Однако проблема все еще сохраняется.
Помощь? : -)
Код:
class Autoencoder(object):
(...)
padding = 'same'
filter_sizes = [3,3,3,3,3,3]
(...)
def build_model(self):
self.inputs = Input(shape=(intSampleLength,1))
x = Conv1D(50, self.filter_sizes[0], padding=self.padding, input_shape=(dim1,1), activation=keras.layers.LeakyReLU(alpha=0.2))(self.inputs)
x = Conv1D(80, self.filter_sizes[1], padding=self.padding, strides=2, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(100, self.filter_sizes[2], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(100, self.filter_sizes[3], padding=self.padding, strides=2, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(100, self.filter_sizes[4], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
self.encoded = Conv1D(100, self.filter_sizes[5], padding=self.padding, strides=2, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(100, self.filter_sizes[5], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(self.encoded)
x = Conv1D(100, self.filter_sizes[4], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = UpSampling1D(2)(x)
x = Conv1D(100, self.filter_sizes[3], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(100, self.filter_sizes[2], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = UpSampling1D(2)(x)
x = Conv1D(80, self.filter_sizes[1], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = Conv1D(50, self.filter_sizes[0], padding=self.padding, activation=keras.layers.LeakyReLU(alpha=0.2))(x)
x = UpSampling1D(2)(x)
decoded = Conv1D(1,3,padding=self.padding, activation=None)(x)
self.autoencode_model=Model(inputs=self.inputs,outputs = decoded)
return self.autoencode_model