我有一个二元分类问题。我想包括一个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层的参数,但它不这样工作…
谢谢。
可以通过添加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
_________________________________________________________________