我的目的是构建类似Q& A bot的东西,它可以根据用户的输入句子生成句子。我在gensim中使用预先训练过的word2vec来输入模型 我的话是中文,但我认为word2vec并不重要。 我首先把每个句子变成了一个3d数组。形状是
(sample_n,time_step,word_dim)
x = [sentence_1, sentence_2, ... , sentence_n]
sentence = [word_1, word_2, ...]
word = [250 dimensions array]
time_step等于序列的长度。序列已经完成零填充。因此,长度是固定的。
接下来,我构建一个简单的seq2seq模型:
(我说“简单”,因为它没有任何关注层并将最后一个输出提供给解码器中的当前输入。)
model = Sequential
# Encoder
model.add(LSTM(units=HIDDEN_SIZE, input_shape=(X_TIME_STEP, WORD_DIM), return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(units=HIDDEN_SIZE, input_shape=(X_TIME_STEP, WORD_DIM), return_sequences=False))
model.add(Dense(HIDDEN_SIZE, activation="relu"))
model.add(RepeatVector(Y_TIME_STEP))
# Decoder
model.add(LSTM(units=WORD_DIM, return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(units=WORD_DIM, return_sequences=True))
model.add(TimeDistributed(Dense(WORD_DIM, activation="linear")))
optimizer = optimizers.Adam()
model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=['acc'])
model.fit(train_x, train_y, batch_size=BATCH_SIZE, epochs=EPOCHS)
培训期间的损失值为负。 之后,我只使用训练数据进行预测并将输出向量转回句子 但是,句子中的单词都是相同或奇怪的。
我将损失功能更改为“mse”。似乎它有所改善,至少损失不是负面的,但我认为这不是解决这个问题的正确方法。
我能弄清楚的是,每个维度中word2vec的值不在0和1之间。
为了使用“categorical_crossentropy”,需要在训练前用字向量进行标准化,并使用softmax作为输出层的激活功能。
预测后,将标准化向量转换回原点(称为非正规化?),然后将其转换为句子
如果没问题,我可以用什么方法进行规范化?
只需更改可处理未绑定值的损失函数或图层。
我是NN和Keras的新手,有什么方法可以解决它吗?谢谢!