首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CNN Conv1D理解TimeseriesGenerator

用CNN Conv1D理解TimeseriesGenerator
EN

Stack Overflow用户
提问于 2020-08-18 00:02:44
回答 1查看 396关注 0票数 0

我对Keras和CNN都是新手,我不知道如何正确地构建CNN网络。

上下文:我使用一个包含39个特征的时间序列,我想使用3个滞后数据。另外,我的问题是多步输出,所以我想预测48个输出。我使用TimeseriesGenerator (使用this article for reference)创建模型输入。

下面是我的代码:

代码语言:javascript
复制
generator = TimeseriesGenerator(
        inputs,
        outputs,
        length=6,
        batch_size=1,
)

这是我的模型结构:

代码语言:javascript
复制
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

代码语言:javascript
复制
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层的输入和输出?

EN

回答 1

Stack Overflow用户

发布于 2020-08-18 00:51:07

这是因为你过于积极地降低了维度。由于您的输入维度是(6, 39),因此在第一个Conv1D之后,它具有维度(2, 64),然后在第一个MaxPooling1D之后,它缩减为(1, 64)。因此,在使用kernel_size=5padding='valid'进行第二次Conv1D之后,您将获得(1-5, 64)维度,即错误实际尝试告诉您的内容。

您可以分别使用Conv2DMaxpooling2D来代替Conv1DMaxpooling1D,并在时间维度上设置1。以下是如何执行此操作的示例:

代码语言:javascript
复制
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,
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63454531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档