【发布时间】:2019-07-30 08:56:00
【问题描述】:
我正在尝试为时间序列制作 CNN 1D。
第一期: 尝试使用 [1,1] 的输入形状时出现错误:
Error: Negative dimension size caused by adding layer average_pooling1d_AveragePooling1D1 with input shape [,0,128]
第二期 我的数据有 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
}
任何关于如何解决它的想法将不胜感激!
【问题讨论】:
-
也许有一些建议,为什么它更喜欢作为输入参数发送多个时间序列而不是一个,因为这是我在网络上的大多数示例中看到的。
-
能否将模型添加到您的问题中?
-
是的,现在添加它
-
你能用 stackblitz.com 来演示这个问题吗?发现错误会更容易