如何使火车CNN具有合适的输入形状?

时间:2020-08-20 10:06:32

标签: python keras cnn

我正在尝试使用S&P 500数据集训练CNN和LSTM网络。这是火车数据集的形状:

xtrain形状:(6445,16) ytrain形状:(6445,)

这是我给CNN的输入形状:

model.add(TimeDistributed(Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None,16)))

在代码中显示输入形状参数时出现此错误:

ValueError:conv1d_8层的输入0与该层不兼容::预期的min_ndim = 3,找到的ndim = 2。收到完整的图形:[无,16]

1 个答案:

答案 0 :(得分:1)

expected min_ndim=3, found ndim=2.

在使用Conv1D时,Keras期望使用三维数组:期望的形状为[batch_size, sequence_length, feature_dimension]。在您的情况下,您只有一个特征维,我怀疑价格,但是假设您还想传递交易量数据,您将拥有xtrain.shape == (6445,16,2)。最后一个维度将包含有关价格和数量的信息。

要解决您的问题,您需要将xtrain重塑为

(batch_size, sequence_length, feature_dimension=(6445,16,1)

为此,您可以使用tensorflow:

xtrain = tf.expand_dims(xtrain, axis=-1) # -1 means expand the LAST axis

或使用numpy:

xtrain = np.expand_dims(xtrain, axis=-1) # -1 means expand the LAST axis

此函数的作用与名称含义相同:它在axis指定的位置添加了一个新轴。这样就可以使xtrain具有我们想要的形状,现在您可以继续进行模型制作了,例如:

model = keras.models.Sequential()
model.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None,16,1)))