代码之家  ›  专栏  ›  技术社区  ›  user288609

ValueError:输入0与层conv1d\u 1不兼容:预期ndim=3,发现ndim=4

  •  20
  • user288609  · 技术社区  · 6 年前

    我正在使用Keras提供的conv1d层为层序数据建立预测模型。我就是这样做的

    model= Sequential()
    model.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(None,64,1)))
    model.add(Conv1D(80,10, strides=1, activation='relu',padding='causal'))
    model.add(Dropout(0.25))
    model.add(Conv1D(100,5, strides=1, activation='relu',padding='causal'))
    model.add(MaxPooling1D(1))
    model.add(Dropout(0.25))
    model.add(Dense(300,activation='relu'))
    model.add(Dense(1,activation='relu'))
    print(model.summary())
    

    但是,调试信息

    Traceback (most recent call last):
    File "processing_2a_1.py", line 96, in <module>
    model.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(None,64,1)))
    File "build/bdist.linux-x86_64/egg/keras/models.py", line 442, in add
    File "build/bdist.linux-x86_64/egg/keras/engine/topology.py", line 558, in __call__
    File "build/bdist.linux-x86_64/egg/keras/engine/topology.py", line 457, in assert_input_compatibility
    ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3, found ndim=4
    

    培训数据和验证数据形状如下

    ('X_train shape ', (1496000, 64, 1))
    ('Y_train shape ', (1496000, 1))
    ('X_val shape ', (374000, 64, 1))
    ('Y_val shape ', (374000, 1))
    

    我认为 input_shape 在第一层中,设置不正确。如何设置?


    使现代化 :使用后 input_shape=(64,1) ,即使模型摘要贯穿

    ________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    conv1d_1 (Conv1D)            (None, 64, 60)            1980
    _________________________________________________________________
    conv1d_2 (Conv1D)            (None, 64, 80)            48080
    _________________________________________________________________
    dropout_1 (Dropout)          (None, 64, 80)            0
    _________________________________________________________________
    conv1d_3 (Conv1D)            (None, 64, 100)           40100
    _________________________________________________________________
    max_pooling1d_1 (MaxPooling1 (None, 64, 100)           0
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 64, 100)           0
    _________________________________________________________________
    dense_1 (Dense)              (None, 64, 300)           30300
    _________________________________________________________________
    dense_2 (Dense)              (None, 64, 1)             301
    =================================================================
    Total params: 120,761
    Trainable params: 120,761
    Non-trainable params: 0
    _________________________________________________________________
    None
    Traceback (most recent call last):
      File "processing_2a_1.py", line 125, in <module>
        history=model.fit(X_train, Y_train, batch_size=batch_size, validation_data=(X_val,Y_val), epochs=nr_of_epochs,verbose=2)
      File "build/bdist.linux-x86_64/egg/keras/models.py", line 871, in fit
      File "build/bdist.linux-x86_64/egg/keras/engine/training.py", line 1524, in fit
      File "build/bdist.linux-x86_64/egg/keras/engine/training.py", line 1382, in _standardize_user_data
      File "build/bdist.linux-x86_64/egg/keras/engine/training.py", line 132, in _standardize_input_data
    ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (1496000, 1)
    
    3 回复  |  直到 6 年前
        1
  •  12
  •   Maxim    6 年前

    你要么改变 input_shape

    input_shape=(64,1)
    

    ... 或使用 batch_input_shape :

    batch_input_shape=(None, 64, 1)
    

    This discussion 详细解释了keras中两者之间的差异。

        2
  •  5
  •   Frightera    3 年前

    我也有同样的问题。我发现扩展输入数据的维度可以使用 tf.expand_dims

    x = expand_dims(x, axis=-1)
    
        3
  •  0
  •   Axel Bregnsbo    4 年前

    我想用我的箱子 Conv2D 在单个20*32要素地图上,并执行了以下操作:

    print(kws_x_train.shape)                     # (8000,20,32)
    model = tf.keras.models.Sequential([
      tf.keras.layers.Conv2D(16, (3, 8), input_shape=(20,32)),
    ])
    ...
    model.fit(kws_x_train, kws_y_train, epochs=15)
    

    这使得 expected ndim=4, found ndim=3. Full shape received: [None, 20, 32] . 但是你需要告诉我 Conv2D 只有1个特征映射,并向输入向量添加额外维度。这起到了作用:

    kws_x_train2 = kws_x_train.reshape(kws_x_train.shape + (1,))
    print(kws_x_train2.shape)                     # (8000,20,32,1)
    model = tf.keras.models.Sequential([
      tf.keras.layers.Conv2D(16, (3, 8), input_shape=(20,32,1)),
    ])
    ...
    model.fit(kws_x_train2, kws_y_train, epochs=15)