Проблема заполнения в 1D сверточном автоэнкодере (Keras) - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь сверточный автоэнкодер на нескольких участках. Тем не менее, я сталкиваюсь с проблемами с нулевыми краями декодированного сигнала (рисунок 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...