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()
我有以下模型,数据集包含 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()