tf.keras 无法完成 Conv1D

Can't get done Conv1D with tf.keras

我有以下模型,数据集包含 186093 个时间序列,其中每个时间序列的长度为 48

Tensorflow 版本2.x

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv1D(30, 4, activation=tf.nn.selu, input_shape=(train_data.shape[1], train_data.shape[0])),
    tf.keras.layers.MaxPooling1D(3),
    tf.keras.layers.Conv1D(15, 2, padding='same', activation=tf.keras.activations.selu),
    tf.keras.layers.MaxPooling1D(3),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.keras.activations.relu),
    tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid)
])

模型总结如下

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 45, 30)            22331190  
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 15, 30)            0         
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 15, 15)            915       
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 5, 15)             0         
_________________________________________________________________
flatten (Flatten)            (None, 75)                0         
_________________________________________________________________
dense (Dense)                (None, 128)               9728      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 129       
=================================================================
Total params: 22,341,962
Trainable params: 22,341,962
Non-trainable params: 0

但是,当我尝试按如下方式训练模型时

model.fit(train_data, train_result, epochs=2000, validation_split=0.2, verbose=0, callbacks=[early_stop])

我收到以下错误

ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (186093, 48)

我尝试将 input_shape 更改为 (None, 48),因为我有 48 个特征。但是后来我什至无法创建模型,因为它会抛出以下错误

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

谁能帮我弄清楚我做错了什么或遗漏了什么?

问题仅在于数据的形状。

首先,我假设 train_data.shape[0] 给出 186093。这是离散样本的数量。它不是单个样本中的特征数。

所以把input_shape=(train_data.shape[1], train_data.shape[0])改成 input_shape=(train_data.shape[1], 1)

接下来,

Conv1D(当用于时间序列时)需要形状为 [batch_size、时间步长、特征] 的数据。在你的例子中,features 是 1.

因此您可以如下设置正确的形状(假设您使用的是 numpy):

train_data = np.expand_dims(train_data, axis=-1)

在调用之前添加这一行 model.fit()