关于python:简单的Conv1D作为keras的第一层

Simple Conv1D as first layer in keras

这是我的意见

1
2
x_train.shape # (12, 7) 12 observations each of length 7
x_train # dtype('int32')

这是我想要实现的架构:

enter image description here

我想要一个大小为3的内核卷积整个序列。 从位于https://keras.io/layers/convolutional/的keras文档中

"当将此层用作模型中的第一层时,请提供一个input_shape参数(整数元组或None,例如对于10个向量的128维向量的序列,为(10,128),对于变量-为(-None,128)- 128维向量的长度序列。"

老实说,我很难理解他们的逻辑。 这是我的尝试

1
2
3
4
5
6
7
8
9
10
docs_sequence = Input(shape=(7,), dtype='float32') # Longest document is 7 words
convolution = Conv1D(filters = 1,  # only 1 convolution
                     kernel_size = 3, # tri grams
                     strides = 1,
                     input_shape = (1, 7),
                     padding = 'valid',
                     activation = 'relu')(docs_sequence)
output = Dense(1, activation='sigmoid')(convolution)
cnn_model = Model(inputs = docs_sequence, outputs = [output])
cnn_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

而且我一直都在

ValueError:输入0与层conv1d_30不兼容:预期ndim = 3,找到的ndim = 2


如错误消息所述,您的输入是二维的,而卷积层需要一个三维的输入。

随着以下

1
docs_sequence = Input(shape=(7,1), ...

代替

1
docs_sequence = Input(shape=(7,), ...

Keras接受该模型。 基本上,这会在输入中增加一个尺寸为1的尺寸(错误消息的三个尺寸包括minibatch尺寸,您可以认为该尺寸位于上述shape参数的前面)。

cnn_model.summary()然后给出:

1
2
3
4
5
6
7
8
9
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 7, 1)              0
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 5, 1)              4
_________________________________________________________________
dense_1 (Dense)              (None, 5, 1)              2
=================================================================

在准备实际的输入数据时,可能必须将尺寸为1的此维添加到输入数据中。 为此,您可能要使用numpy.atleast_2d()numpy.atleast_3d(),可能与移调结合使用,或者使用numpy.expand_dims()

在您的情况下,np.atleast_3d(x_train)的形状为(12, 7, 1)