Прогнозирование временных рядов с использованием развернутых причинных сверток с Tensorflow 2.0 - PullRequest
1 голос
/ 31 января 2020

Моя задача состоит в том, чтобы предсказать значение следующей временной серии в зависимости от 200 временных шагов до (аналогично Wav eNet), используя Tensorflow 2.0.0 и Python 3.6. У меня проблема с несоответствием форм моих тренировочных данных. Я получаю следующее сообщение об ошибке:

ValueError: Целевой массив с формой (495, 1, 1) был передан для вывода формы (Нет, 200, 1) при использовании в качестве потери mean_squared_error. Эта потеря предполагает, что цели будут иметь ту же форму, что и выходные данные.

Мой код:

import tensorflow as tf
import tensorflow.keras as k
import numpy as np

batch_size = 495
epochs = 5
learning_rate = 0.001
dilations = 7
seq_length=200

class TCNBlock(k.Model):
    def __init__(self, dilation, seq_length):
        super(TCNBlock, self).__init__()
        self.seq_length = seq_length

        self.convolution0 = k.layers.Conv1D(8, kernel_size=4, strides=1, padding='causal', dilation_rate=dilation)
        self.BatchNorm0 = k.layers.BatchNormalization(momentum=0.6)
        self.relu0 = k.layers.ReLU()
        self.dropout0 = k.layers.Dropout(rate=0.2)

        self.convolution1 = k.layers.Conv1D(8, kernel_size=4, strides=1, padding='causal', dilation_rate=dilation)
        self.BatchNorm1 = k.layers.BatchNormalization(momentum=0.6)
        self.relu1 = k.layers.ReLU()
        self.dropout1 = k.layers.Dropout(rate=0.2)
        self.residual = k.layers.Conv1D(1, kernel_size=1, padding='same')


    def build_block(self, dilation, training=False):
        inputs = k.Input(shape=(200, 1))
        output_layer1 = self.convolution0(inputs)
        output_layer2 = self.BatchNorm0(output_layer1)
        output_layer3 = self.relu0(output_layer2)
        output_layer4 = self.dropout0(output_layer3, training)
        output_layer5 = self.convolution1(output_layer4)
        output_layer6 = self.BatchNorm1(output_layer5)
        output_layer7 = self.relu1(output_layer6)
        output = self.dropout1(output_layer7, training)
        residual = self.residual(output)
        outputs = k.layers.add([inputs, residual])

        return k.models.Model(inputs=inputs, outputs=outputs)


def build_model():
    mdl = k.models.Sequential()
    for dilation in range(dilations):
        dilation_actual = int(np.power(2, dilation))
        block = TCNBlock(dilation_actual, seq_length).build_block(dilation_actual)
        mdl.add(block)
    return mdl


Model_complete = build_model()
opt = k.optimizers.Adam(learning_rate=learning_rate)
Model_complete.compile(loss='mean_squared_error', optimizer=opt, metrics=["accuracy"])

# Train Model
training_process = Model_complete.fit(x_train, y_train, epochs=epochs, verbose=1, batch_size=495, validation_split=0.1)

Мои данные имеют следующую форму:

x_train.shape = (495, 200, 1) 
y_train.shape = (495, 1, 1)

Буду признателен за любую помощь и предложения. Спасибо!

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