时间序列 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 个元素导致错误。
我正在尝试为时间序列做一个 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 个元素导致错误。