我想对29个特征输入数据(如29x1形状)应用一维卷积。我告诉Keras input_shape=(29,1)
,但是我得到一个错误,它期望输入“具有3个维度,但形状为数组(4000,29)”。 为什么Keras期望3维?
Keras文档给出了如何使用input_shape的奇怪示例:
(无,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]
答案 0 :(得分:2)
为什么Keras期望3维?
这三个维度分别是(batch_size,feature_size,通道)。
定义一维转换层
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)