【问题标题】:Keras/Tensorflow Conv1D expected input shapeKeras/Tensorflow Conv1D 预期输入形状
【发布时间】:2019-09-21 08:07:07
【问题描述】:

我想对我的 29 个特征输入数据(如 29x1 形状)应用一维卷积。我告诉 Keras input_shape=(29,1),但我得到一个错误,它期望输入“有 3 个维度,但得到了形状为 (4000, 29) 的数组”。 为什么 Keras 需要 3 个维度?

Keras 文档给出了这个如何使用 input_shape 的奇怪示例:

(None, 128) 用于每步具有 128 个特征的可变长度序列。

我不确定可变长度序列是什么意思,但由于我有 29 个功能,我也尝试了 (None,29)(1,29) 并遇到了类似的错误。

我对一维卷积的作用有误解吗?

在给定 7x1 输入的情况下,这是我期望 Conv1D 在内核大小为 3 时所做的可视化描述。

[x][x][x][ ][ ][ ][ ]
[ ][x][x][x][ ][ ][ ]
[ ][ ][x][x][x][ ][ ]
[ ][ ][ ][x][x][x][ ]
[ ][ ][ ][ ][x][x][x]

【问题讨论】:

    标签: tensorflow keras neural-network conv-neural-network convolution


    【解决方案1】:

    为什么 Keras 需要 3 个维度?

    三个维度是(batch_size、feature_size、channels)。

    定义一维卷积层

    Conv1D(32, (3), activation='relu' , input_shape=( 29, 1 ))
    

    将 (4000, 29, 1) 个样本馈送到该层。

    简单示例:

    from keras import models, layers
    import numpy as np
    
    x = np.ones((10, 29, 1))
    y = np.zeros((10,))
    model = models.Sequential()
    model.add(layers.Conv1D(32, (3), activation='relu' , input_shape=( 29,1)))
    model.add(layers.Flatten())
    model.add(layers.Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer= "adam", metrics=['accuracy'])
    print(model.summary())
    model.fit(x,y)
    

    【讨论】:

    • 所以batch_size 参数(按照惯例?)从input_shape 中省略,其中(29,1) 的定义实际上意味着(batch_size_omitted, 29, 1)。并且 Keras 拒绝吃一维 np 数组,因为 CNN 通常用于我们具有 3 维(“通道”R、G、B)的图像。即使我们只有 1 个通道,我们也必须将 1d 数组包装成一个大小为 29x1 的矩阵。
    • 是的,文档中提到不包括批处理轴(keras.io/layers/convolutional)。即使对于具有一个通道的灰度图像,也必须指定通道尺寸。 github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多