我正在尝试创建一个能够在文本序列中发现异常的自编码器:
X_train_pada_seq.shape(28840, 999)
我想使用一个Embedding层。这是我的模型:
encoder_inputs = Input(shape=(max_len_str, ))encoder_emb = Embedding(input_dim=len(word_index)+1, output_dim=20, input_length=laenge_pads)(encoder_inputs)encoder_LSTM_1 = Bidirectional(LSTM(400, activation='relu', return_sequences=True))(encoder_emb)encoder_drop = Dropout(0.2)(encoder_LSTM_1)encoder_LSTM_2 = Bidirectional(GRU(200, activation='relu', return_sequences=False, name = 'bottleneck'))(encoder_drop)decoder_repeated = RepeatVector(200)(encoder_LSTM_2)decoder_LSTM = Bidirectional(LSTM(400, activation='relu', return_sequences=True))(decoder_repeated)decoder_drop = Dropout(0.2)(decoder_LSTM)decoder_output = TimeDistributed(Dense(999, activation='softmax'))(decoder_drop)autoencoder = Model(encoder_inputs, decoder_output)autoencoder.compile(optimizer=keras.optimizers.Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])autoencoder.summary()Model: "model_7"_________________________________________________________________Layer (type) Output Shape Param # =================================================================input_10 (InputLayer) [(None, 999)] 0 _________________________________________________________________embedding_19 (Embedding) (None, 999, 20) 159660 _________________________________________________________________bidirectional (Bidirectional (None, 999, 800) 1347200 _________________________________________________________________dropout (Dropout) (None, 999, 800) 0 _________________________________________________________________bidirectional_1 (Bidirection (None, 400) 1202400 _________________________________________________________________repeat_vector (RepeatVector) (None, 200, 400) 0 _________________________________________________________________bidirectional_2 (Bidirection (None, 200, 800) 2563200 _________________________________________________________________dropout_1 (Dropout) (None, 200, 800) 0 _________________________________________________________________time_distributed_6 (TimeDist (None, 200, 999) 800199 =================================================================Total params: 6,072,659Trainable params: 6,072,659Non-trainable params: 0
但是在训练模型时:
history = autoencoder.fit(X_train_pada_seq, X_train_pada_seq, epochs=10, batch_size=64, validation_data=(X_test_pada_seq, X_test_pada_seq))
我得到一个错误:
ValueError: Shapes (None, 999) and (None, 200, 999) are incompatible
如何重新构建模型以修复这个错误?
回答:
我已经看过您的代码片段,看起来您的模型输出需要与目标形状匹配,即(None, 999),但您的输出形状是(None, 200, 999)。
您需要使模型的输出形状与目标形状匹配。
尝试使用tf.reduce_mean
并设置axis=1
(对所有序列进行平均):
decoder_drop = Dropout(0.2)(decoder_LSTM)decoder_time = TimeDistributed(Dense(999, activation='softmax'))(decoder_drop)decoder_output = tf.math.reduce_mean(decoder_time, axis=1)
这样应该可以让模型正常训练。