我定义了以下CNN模型。它期望长度为501的1D矢量输入。
model = ml.models.Sequential()
model.add(ml.layers.Conv1D(filters=NUMBER_OF_FILTERS, kernel_size=KERNEL_SIZE, activation=ACTIVATION, input_shape=(None, 501)))
model.add(ml.layers.MaxPooling1D(pool_size=POOL_SIZE, padding='valid'))
model.add(ml.layers.Flatten())
model.add(ml.layers.Dense(HIDDEN_SIZE-1, activation=ACTIVATION))
然而,这引发了一个价值错误:
ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.
我不知道为什么Flatten没有创建类似(None, x)
的形状,而是创建(None, None)
的形状。这里好像出了什么问题?
这是模型摘要:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d (Conv1D) (None, None, 50) 250550
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, None, 50) 0
_________________________________________________________________
flatten (Flatten) (None, None) 0
=================================================================
Total params: 250,550
Trainable params: 250,550
Non-trainable params: 0
_________________________________________________________________
我已经找到了解决方案。我没有正确定义Conv1D层的input_shape,它应该是:
model.add(ml.layers.Conv1D(filters=NUMBER_OF_FILTERS, kernel_size=KERNEL_SIZE, activation=ACTIVATION, input_shape=(501, 1)))
Layers Flatten将图像的格式从二维数组(a,b(转换为一维数组(aXb(。Layer Pooling输出max_pooling1d(MaxPooling1D((None,None,50(为二维数组(0,0(