如何在Keras / Tensorflow中实现One2Seq NN,以基于单个输入生成句子?

时间:2019-07-07 13:29:37

标签: python tensorflow machine-learning keras neural-network

我正在尝试开发一种神经网络,它将根据上下文向量(标签的一键编码数组)生成短句。

简化的输入向量-[isCat?,isFish?,isDog?,hasFurr?]

输出向量-['数字,数字,数字,数字...']-数字表示词汇索引。

示例输入: [0,0,1,1]-狗

示例输出: [“真是个好狗狗!”,“他肯定喜欢吃”]

示例输入: [1,0,0,1]-猫

示例输出: ['Kinda cute cat :)','Meow meow meow!']

哪种架构最适合我的需求?

我已经阅读了一些文章并通过了教程,但通常有Seq2Seq(编码器-解码器)模型。我认为情况并非如此,因为我没有一系列输入,并且标签对顺序不敏感。

到目前为止,我已经收集了所有数据,矢量化的输入和输出-句子以词汇索引(大约5000个单词)表示-并尝试在不使用任何RNN的情况下制作了DNN,但效果确实很差。 / p>

我是ML的初学者,但我认为应该有一些RNN(LSTM,GRU),它的标记用作输入,弹出一些单词并传递内部状态 (之前的单词+标记输入)和单词输出到下一次迭代,直到达到预期的句子长度。但是我不确定如何实现这一目标。

我的简单DNN方法无法解决的示例。它使用长度为input_size的标签数组,并返回10个单词的句子,其中3490是当前词汇量。接受了大约1万个句子的训练。

model = keras.Sequential([
    keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(input_size,)),
    keras.layers.Dense(512, activation=tf.nn.relu),
    keras.layers.Dense(512, activation=tf.nn.relu),
    keras.layers.Dense(34900, activation=None),
    keras.layers.Reshape((10, 3490)),
    keras.layers.Activation("softmax")])

0 个答案:

没有答案