【问题标题】:Timeseries Prediction using Dilated Causal Convolutions with Tensorflow 2.0使用扩张因果卷积和 Tensorflow 2.0 的时间序列预测
【发布时间】:2020-01-31 18:01:57
【问题描述】:

我的任务是使用 Tensorflow 2.0.0 和 Python 3.6 根据之前的 200 个时间步长(类似于 WaveNet)预测下一个时间序列值。 我遇到了训练数据形状不匹配的问题。我收到以下错误消息:

ValueError: 形状为 (495, 1, 1) 的目标数组被传递为形状 (None, 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)

如果有任何帮助和建议,我将不胜感激。 谢谢!

【问题讨论】:

  • seq_length 丢失,所以我无法运行您的示例
  • seq_length 为 200。我现在在代码中添加了它
  • 您的网络将形状(None, 200, 1)作为输出层,但您希望最后一层为(None, 1, 1)
  • 我认为您在这里有些困惑。一般形状为(batch, dimensions, filters)。如果您应用带有 1 个过滤器的卷积,则结果是 (batch, dimensions, 1) 而不是 (batch, 1, 1)
  • 我宁愿说你必须重组你的模型,使输出层的形状为 (batch, 1, 1) 并且你可以在你的标签上训练

标签: python tensorflow shapes


【解决方案1】:

Time Series Analysis Prediction 中的重要步骤是准备数据,以便模型生成相应的Prediction

执行Important StepFunction 如下所示:

def multivariate_data(dataset, target, start_index, end_index, history_size,
                      target_size, step, single_step=False):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])

    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])

  return np.array(data), np.array(labels)

上述函数需要解释的重要参数是history_sizetarget_size

在您的情况下,history_size 将是 200,target_size 将是 1。

我有一个真诚的建议给你(请不要冒犯。意图是真诚地帮助你)。由于您对Tensorflow比较陌生,所以请您仔细阅读Tensorflow网站中给出的Time Series Tutorial,它是使用LSTMs实现的,完全理解它,然后尝试使用Dilated Convolutions实现它。

希望这会有所帮助。快乐学习!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多