如何将MaxPooling1D与Conv1D结合使用

时间:2018-12-09 20:48:33

标签: python keras conv-neural-network

我这样使用Conv1D

X_train_t = X_train.reshape(X_train.shape[0], 1,12)
X_test_t = X_test.reshape(X_test.shape[0], 1,12)

print(X_train_t.shape)
print(X_train_t)

K.clear_session()
model = Sequential()
model.add(Conv1D(12,1, activation='relu', input_shape=(1,12)))

#model.add(MaxPooling1D(pool_size = (6))) 

model.add(LSTM(3))

model.add(Dense(1))

我在模型行.add(Conv1D ..

下添加了maxpooling来提高性能。
model.add(MaxPooling1D(pool_size = (6))) 

但是显示这样的错误

ValueError: Negative dimension size caused by subtracting 6 from 1 for 'max_pooling1d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,12].

如果我将pool_size =(1)设置为有效,则它将增加更多的损失值。如果我不想将pool_size更改为另一个值,请执行以下操作:1.如何编辑模型?

2 个答案:

答案 0 :(得分:0)

MaxPooling1D的形状为(batch_size, steps, features)的输入需要3d张量。根据您的代码,X_train_tX_test_t有1步(*.shape[0], 1, 12)。当Pooling将其窗口移动6步(pool_size=(6))时,它不能这样做。结果,它抛出了这样的异常。

建议:尝试更改输入形状

最小示例:这是Conv1D的一种可能解决方案:

    model = Sequential()
    model.add(Embedding(input_dim=1000, output_dim=128, input_shape=(12,))
    model.add(Convolution1D(filters=2, kernel_size=100, padding='same', activation=tf.nn.relu))
    model.add(MaxPooling1D(pool_size=6))
    model.add(GlobalAveragePooling1D())
    model.add(Dense(2))

答案 1 :(得分:0)

我添加了一个 Dense 层和 Reshape 层来解决这个问题。

model = Sequential()
model.add(Conv1D(12,1, activation='relu', input_shape=(1,12)))
model.add(Dense(32*3))
model.add(Reshape((3,32)))
model.add(MaxPooling1D(pool_size = (3))) 
model.add(LSTM(32))
model.add(Dense(1))