时间序列 CNN,尝试使用 1,1 输入形状

Time series CNN, trying to use 1,1 input shape

我正在尝试为时间序列做一个 CNN 1D。

第一期: 尝试使用 [1,1] 的输入形状时出现错误:

Error: Negative dimension size caused by adding layer average_pooling1d_AveragePooling1D1 with input shape [,0,128]

第2期 我的数据有 2 个不同的数组 (1d):第一个数组是包含时间序列的输入数据,第二个数组包含带有股票收盘值的输出数据。

让我得到更多结果的是将输入形状设置为 [6,1]。

模型摘要:

_________________________________________________________________
Layer (type)                 Output shape              Param #   
=================================================================
conv1d_Conv1D1 (Conv1D)      [null,5,128]              384       
_________________________________________________________________
average_pooling1d_AveragePoo [null,4,128]              0         
_________________________________________________________________
conv1d_Conv1D2 (Conv1D)      [null,3,64]               16448     
_________________________________________________________________
average_pooling1d_AveragePoo [null,2,64]               0         
_________________________________________________________________
conv1d_Conv1D3 (Conv1D)      [null,1,16]               2064      
_________________________________________________________________
average_pooling1d_AveragePoo [null,0,16]               0         
_________________________________________________________________
flatten_Flatten1 (Flatten)   [null,0]                  0         
_________________________________________________________________
dense_Dense1 (Dense)         [null,1]                  1         
=================================================================

在这里训练模型让我遇到了问题:

const trainX = tf.tensor1d(data.inTime).reshape([100, 6, 1])

100 - 我的数组大小 6 - 特点 1 - 1 个单元作为输出

Error: Size(100) must match the product of shape 100,6,1

我卡在了训练步骤,因为我不知道如何训练它。 我希望有一个 [1,1] 输入形状,只给出 1 个时间序列并从中得到 1 个输出。

模特

async function buildModel() {
  const model = tf.sequential()

  // settings
  const kernelSize = 2
  const poolSize = [2]

  // tf layers
  model.add(tf.layers.conv1d({
    inputShape: [6, 1],
    kernelSize: kernelSize,
    filters: 128,
    strides: 1,
    useBias: true,
    activation: 'relu',
    kernelInitializer: 'varianceScaling'
  }))
  model.add(tf.layers.averagePooling1d({poolSize: poolSize, strides: [1]}))

  // 2nd layer
  model.add(tf.layers.conv1d({
    kernelSize: kernelSize,
    filters: 64,
    strides: 1,
    useBias: true,
    activation: 'relu',
    kernelInitializer: 'varianceScaling'
  }))
  model.add(tf.layers.averagePooling1d({poolSize: poolSize, strides: [1]}))

  model.add(tf.layers.conv1d({
    kernelSize: kernelSize,
    filters: 16,
    strides: 1,
    useBias: true,
    activation: 'relu',
    kernelInitializer: 'varianceScaling'
  }))
  model.add(tf.layers.averagePooling1d({poolSize: poolSize, strides: [1]}))

  model.add(tf.layers.flatten())

  model.add(tf.layers.dense({
    units: 1,
    kernelInitializer: 'VarianceScaling',
    activation: 'linear'
  }))

  // optimizer + learning rate
  const optimizer = tf.train.adam(0.0001)
  model.compile({
    optimizer: optimizer,
    loss: 'meanSquaredError',
    metrics: ['accuracy'],
  })

  return model
}

训练错误发生的地方

async function train(model, data) {
  console.log(`MODEL SUMMARY:`)
  model.summary()
  // Train the model
  const epochs = 2
  // train data size, 28, 28, 1
  const trainX = tf.tensor1d(data.inTime).reshape([100, 6, 1])
  const trainY = tf.tensor([data.outClosed], [1, data.size, 1])

  let result = await model.fit(trainX, trainY, {
      epochs: epochs
  })

  print("Loss after last Epoch (" + result.epoch.length + ") is: " + result.history.loss[result.epoch.length-1])
  return result
}

任何关于如何修复它的想法将不胜感激!

时间序列 是根据wikipedia 在连续的等间隔时间点获取的序列。用于时间序列的神经网络 NN 的目标是找到数据序列之间的模式。卷积神经网络 CNN 很少甚至从未用于此类数据。其他经常使用的 NN 是 RNN 和 LSTM。如果我们有兴趣在一系列数据中寻找模式,那么 inputShape 不能是 [1, 1];否则,这将意味着在一个独特的点上找到一个模式。理论上可以做到,但实际上并没有抓住时间序列的本质。

这里使用的模型是使用带有平均池化层的 CNN。当然,不能将池化层应用于池化大小大于层形状的层,从而引发错误:

Error: Negative dimension size caused by adding layer average_pooling1d_AveragePooling1D1 with input shape [,0,128]

最后一个错误:

Error: Size(100) must match the product of shape 100,6,1

表示张量的大小不匹配。

张量中有 100 * 6 * 1 = 600 个元素(大小 =600),而输入张量有 100 个元素导致错误。