Keras中的1D CNN:从合并要素平整到密集层会引发ValueError

时间:2019-10-24 09:58:49

标签: python tensorflow keras

我定义了以下CNN模型。期望一维矢量输入的长度为501。

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
_________________________________________________________________

2 个答案:

答案 0 :(得分:0)

我已经找到解决方案。我没有正确定义Conv1D层的input_shape,应该改为:

model.add(ml.layers.Conv1D(filters=NUMBER_OF_FILTERS, kernel_size=KERNEL_SIZE, activation=ACTIVATION, input_shape=(501, 1)))

答案 1 :(得分:0)

Layerers Flatten将图像的格式从二维数组(a,b)转换为一维数组(aXb).Layer Pooling输出max_pooling1d(MaxPooling1D)(None,None,50)一二维数组(0,0)。因此,图层Flatten:flatten(Flatten)(无,无)