我对Keras和CNN都是新手,我不知道如何正确地构建CNN网络。
上下文:我使用一个包含39个特征的时间序列,我想使用3个滞后数据。另外,我的问题是多步输出,所以我想预测48个输出。我使用TimeseriesGenerator (使用this article for reference)创建模型输入。
下面是我的代码:
generator = TimeseriesGenerator(
inputs,
outputs,
length=6,
batch_size=1,
)这是我的模型结构:
model = Sequential()
model.add(
Conv1D(
filters=64,
kernel_size=5,
strides=1,
activation="relu",
padding="valid",
input_shape=(6, 39),
use_bias=True,
)
)
model.add(MaxPooling1D(pool_size=2))
model.add(
Conv1D(
filters=64,
kernel_size=5,
strides=1,
activation="relu",
padding="valid",
use_bias=True,
)
)
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(units=100, activation="relu",))
model.add(Dense(units=self.__n_steps_out, activation="softmax",))
model.compile(
optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]
)
model.fit_generator(
generator, steps_per_epoch=1, epochs=100,
)问题:我知道内核大小(具有有效填充)不能大于ts生成器中指定的滞后数量。但是在设置内核size=5
ValueError: Negative dimension size caused by subtracting 5 from 1 for '{{node conv1d_1/conv1d}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](conv1d_1/conv1d/ExpandDims, conv1d_1/conv1d/ExpandDims_1)' with input shapes: [?,1,1,64], [1,5,64,64].
我发现只有当kernel_size设置为2时,我的CNN结构才是正确的,我不知道为什么它会工作,但当我增加值时就不是了……
谁能给我解释一下TimeseriesGenerator和Conv1D层的输入和输出?
发布于 2020-08-18 00:51:07
这是因为你过于积极地降低了维度。由于您的输入维度是(6, 39),因此在第一个Conv1D之后,它具有维度(2, 64),然后在第一个MaxPooling1D之后,它缩减为(1, 64)。因此,在使用kernel_size=5和padding='valid'进行第二次Conv1D之后,您将获得(1-5, 64)维度,即错误实际尝试告诉您的内容。
您可以分别使用Conv2D和Maxpooling2D来代替Conv1D和Maxpooling1D,并在时间维度上设置1。以下是如何执行此操作的示例:
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten
from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
import numpy as np
if __name__ == '__main__':
inputs = np.random.rand(1000, 39, 1)
outputs = np.random.rand(1000, 1, 1)
generator = TimeseriesGenerator(
inputs,
outputs,
length=6,
batch_size=10,
)
model = Sequential()
model.add(
Conv2D(
filters=64,
kernel_size=(1, 5),
strides=1,
activation="relu",
padding="valid",
input_shape=(6, 39, 1),
use_bias=True,
)
)
model.add(MaxPooling2D(pool_size=(1, 2)))
model.add(
Conv2D(
filters=64,
kernel_size=(1, 5),
strides=1,
activation="relu",
padding="valid",
use_bias=True,
)
)
model.add(MaxPooling2D(pool_size=(1, 2)))
model.add(Flatten())
model.add(Dense(units=100, activation="relu", ))
model.add(Dense(units=1, activation="softmax", ))
model.summary()
model.compile(
optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]
)
model.fit_generator(
generator, steps_per_epoch=1, epochs=100,
)https://stackoverflow.com/questions/63454531
复制相似问题