Модели Wav enet: Почему так много выходов? - PullRequest
0 голосов
/ 06 августа 2020

Я работаю над решениями машинного обучения для задачи прогнозирования и пробовал много разных вещей. Затем я хочу попробовать wav enet, так как я читал, что он может неплохо прогнозировать. Это реализация, которую я использую:

# source: https://github.com/ageron/handson-ml2/blob/master/15_processing_sequences_using_rnns_and_cnns.ipynb
class GatedActivationUnit(keras.layers.Layer):
    def __init__(self, activation="tanh", **kwargs):
        super().__init__(**kwargs)
        self.activation = keras.activations.get(activation)
        
    def get_config(self):
        config = super().get_config().copy()
        config.update({
            'activation': self.activation,
        })
        return config 
    
    def call(self, inputs):
        n_filters = inputs.shape[-1] // 2
        linear_output = self.activation(inputs[..., :n_filters])
        gate = keras.activations.sigmoid(inputs[..., n_filters:])
        return self.activation(linear_output) * gate
        

def wavenet_residual_block(inputs, n_filters, dilation_rate):
    z = keras.layers.Conv1D(2 * n_filters, kernel_size=2, padding="causal",
                            dilation_rate=dilation_rate)(inputs)
    z = GatedActivationUnit()(z)
    z = keras.layers.Conv1D(n_filters, kernel_size=1)(z)
    return keras.layers.Add()([z, inputs]), z
    

def wavenet_model_setup(n_layers_per_block, n_blocks, n_filters, n_outputs, feature_dim, name, last_activation='relu'):
    # n_layers_per_block = 10 in the paper
    # n_blocks = 3 in the paper
    # n_filters = 128 in the paper
    # n_outputs = 256 in the paper
    # last_activation determines the output codomain
    
    inputs = keras.layers.Input(shape=[train_size, feature_dim])
    z = keras.layers.Conv1D(n_filters, kernel_size=2, padding="causal")(inputs)
    skip_to_last = []
    for dilation_rate in [2**i for i in range(n_layers_per_block)] * n_blocks:
        z, skip = wavenet_residual_block(z, n_filters, dilation_rate)
        skip_to_last.append(skip)
    z = keras.activations.relu(keras.layers.Add()(skip_to_last))
    z = keras.layers.Conv1D(n_filters, kernel_size=1, activation="relu")(z)
    out = keras.layers.Conv1D(n_outputs, kernel_size=1, activation=last_activation)(z)
    return keras.models.Model(inputs=[inputs], outputs=[out], name = name)

Мне кажется, что вход и выход, имеющие одинаковые размеры, являются основной функцией Wav enet, но я не понимаю почему это должно быть желательно.

Глядя на диаграммы расширенных сверток в Wav enet, кажется, что в выходном слое есть один нейрон для каждого нейрона входного слоя, и только конечный выходной нейрон на нее влияет последний входной нейрон. Предполагая, что последний входной нейрон имеет единственное наибольшее влияние на следующий временной шаг (который я хотел бы спрогнозировать), почему какой-либо из других выходных нейронов должен быть мне полезен? Являются ли они косвенно полезными, используются для обучения сети, но не для фактического получения нового значимого вывода?

Вот изображение, которое иллюстрирует мое замешательство:

образ

Почему какие-либо из зачеркнутых нейронов на изображении полезны, если они не учитывают окончательный временной шаг моего ввода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...