简单的 Conv1D 作为 keras 中的第一层

And*_*idy 2 python keras tensorflow

这是我的输入

x_train.shape # (12, 7) 12 observations each of length 7
x_train # dtype('int32')
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的架构:

在此处输入图片说明

我想要一个大小为 3 的内核对序列进行卷积。来自https://keras.io/layers/convolutional/ 的keras 文档

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

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

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'])
Run Code Online (Sandbox Code Playgroud)

我一直在得到

ValueError:输入 0 与层 conv1d_30 不兼容:预期 ndim=3,发现 ndim=2

And*_*ner 5

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

与以下

docs_sequence = Input(shape=(7,1), ...
Run Code Online (Sandbox Code Playgroud)

代替

docs_sequence = Input(shape=(7,), ...
Run Code Online (Sandbox Code Playgroud)

Keras 接受该模型。基本上,这会为输入添加一个大小为 1 的维度(错误消息中的三个维度包括小批量维度,人们可以认为该维度被添加到上述shape参数之前)。

cnn_model.summary() 然后给出:

_________________________________________________________________
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
=================================================================
Run Code Online (Sandbox Code Playgroud)

在准备实际输入数据时,您可能必须将这个大小为 1 的维度添加到您的输入数据中。您可能想要使用numpy.atleast_2d()numpy.atleast_3d()为此,可能结合使用转置或使用numpy.expand_dims()

在你的情况下,np.atleast_3d(x_train)给出一个形状(12, 7, 1)