【问题标题】:How to change the shape of input dimention for Conv1D convolutional error in keras?如何改变keras中Conv1D卷积误差的输入维度的形状?
【发布时间】:2022-06-11 01:09:00
【问题描述】:

我有一个二元分类问题。我想包含一个 Conv1D 层,但在将输入形状从 2D 更改为 3D (https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv1D) 时遇到了输入形状问题。

所以我的代码是

#Hyperparameters
EMBEDDING_DIM = 50
MAXLEN = 500 #1000, 1400
VOCAB_SIZE =  33713

DENSE1_DIM = 64
DENSE2_DIM = 32

LSTM1_DIM = 32 
LSTM2_DIM = 16
WD = 0.001
FILTERS = 64  
KERNEL_SIZE = 5

# Stacked hybrid model
model_lstm = tf.keras.Sequential([
    tf.keras.layers.Embedding(VOCAB_SIZE+1, EMBEDDING_DIM, input_length=MAXLEN,weights=[EMBEDDINGS_MATRIX], trainable=False),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(LSTM1_DIM, dropout=0.5, kernel_regularizer = regularizers.l2(WD), return_sequences=True)), 
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(LSTM2_DIM, dropout=0.5, kernel_regularizer = regularizers.l2(WD))), 
    tf.keras.layers.Dense(DENSE2_DIM, activation='relu'),

#    tf.keras.layers.Conv1D(FILTERS, KERNEL_SIZE, activation='relu'),

#    tf.keras.layers.Dropout(0.1),
#    tf.keras.layers.GlobalAveragePooling1D(), 
#    tf.keras.layers.Dense(1, activation='sigmoid')
])
...

给出了这个总结

Model: "sequential_6"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding_10 (Embedding)    (None, 500, 50)           1685700   
                                                                 
 bidirectional_19 (Bidirecti  (None, 500, 64)          21248     
 onal)                                                           
                                                                 
 bidirectional_20 (Bidirecti  (None, 32)               10368     
 onal)                                                           
                                                                 
 dense_11 (Dense)            (None, 32)                1056      
                                                                 
=================================================================
Total params: 1,718,372
Trainable params: 32,672
Non-trainable params: 1,685,700

所以如果我使用 Conv1D 层,我会得到这个错误:

ValueError: Input 0 of layer "conv1d_4" is incompatible with the layer: expected min_ndim=3, found ndim=2. Full shape received: (None, 32)

我已经尝试过,例如,input_shape = (None, 16, 32) 作为 Conv1D 层中的参数,但是这样不起作用..

谢谢。

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning conv-neural-network


    【解决方案1】:

    您可以添加tf.keras.layers.Reshape层来改变数据的形状,如下所示。

    EMBEDDING_DIM = 50
    MAXLEN = 500 #1000, 1400
    VOCAB_SIZE =  33713
    
    DENSE1_DIM = 64
    DENSE2_DIM = 32
    
    LSTM1_DIM = 32 
    LSTM2_DIM = 16
    WD = 0.001
    FILTERS = 64  
    KERNEL_SIZE = 5
    
    EMBEDDINGS_MATRIX = np.zeros((VOCAB_SIZE+1, EMBEDDING_DIM))
    
    # Stacked hybrid model
    model_lstm = tf.keras.Sequential([
        tf.keras.layers.Embedding(VOCAB_SIZE+1, EMBEDDING_DIM, input_length=MAXLEN,weights=[EMBEDDINGS_MATRIX], trainable=False),
        tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(LSTM1_DIM, dropout=0.5, kernel_regularizer = tf.keras.regularizers.L1(WD), return_sequences=True)), 
        tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(LSTM2_DIM, dropout=0.5, kernel_regularizer = tf.keras.regularizers.L1(WD))), 
        tf.keras.layers.Dense(DENSE2_DIM, activation='relu'),
        tf.keras.layers.Reshape((32,1)),
        tf.keras.layers.Conv1D(FILTERS, KERNEL_SIZE, activation='relu'),
        tf.keras.layers.Dropout(0.1),
        tf.keras.layers.GlobalAveragePooling1D(), 
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    model_lstm.summary()
    

    输出如下。

    Model: "sequential_14"
    _________________________________________________________________
     Layer (type)                Output Shape              Param #   
    =================================================================
     embedding_16 (Embedding)    (None, 500, 50)           1685700   
                                                                     
     bidirectional_8 (Bidirectio  (None, 500, 64)          21248     
     nal)                                                            
                                                                     
     bidirectional_9 (Bidirectio  (None, 32)               10368     
     nal)                                                            
                                                                     
     dense_15 (Dense)            (None, 32)                1056      
                                                                     
     reshape_3 (Reshape)         (None, 32, 1)             0         
                                                                     
     conv1d (Conv1D)             (None, 28, 64)            384       
                                                                     
    =================================================================
    Total params: 1,718,756
    Trainable params: 33,056
    Non-trainable params: 1,685,700
    _________________________________________________________________
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 2018-06-16
      • 2016-12-04
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多