# vocab_size:词表数量
# embedding_dim: 词嵌入后维度
tf.keras.layers.Embedding(vocab_size, embedding_dim)
假设有一句话,I love you
vocab_size:我们传入的词表大小是1000,
embedding_dim:embedding后的维度256。
先将 I love you 这三个词对应的索引(1行3列)传入Embedding层
那么embedding会先将这1行三列的索引转换成One-hot编码,
因为此表有1000个词,那么这句I love you也就转成(3行1000列)的词向量。
embedding层会生成根据你传入的vocab_size词表大小和embedding_dim维度大小生成一个1000行256列的矩阵。
用One-hot编码的3行1000列矩阵乘embedding层生成的1000行256列的矩阵,最后embedding输出的就是3行256列的词嵌入后的输出。
那么我们每次输入不仅仅是一句话,大多数情况下输入的是一个批次,
例如batch_size=64,也就是每批次有64句话输入
那么假设输入的维度是64行15列(64,15)
那么经过One-hot编码得到的矩阵就是64个15行1000列的矩阵(64,15,1000)
再与embedding生成的(64,1000,256)的矩阵相乘。
输出的就是词嵌入后的结果(64,15,256)
假设输入维度是(64, 15),那么也就是代表一句话有15个单词,一共有64句话作为一批次输入。
我们输入经过embedding层之后得到这一批次的词向量是(64,15,256),含义就是GRU分成15个时刻,每个时刻64行256列的输入。
我们假设GRU中间隐层有1024个神经元, 那么在输入与隐层之间的矩阵就是256*1024的W矩阵
输入的每一个时刻是(64,256)的输入与W矩阵相乘后得到每一个时刻的输出是64*1024的矩阵。
因为是15个时刻,所以GRU总的输出就是15个(64, 1024)的矩阵,在tf里用三维向量表示(64,15, 1024)
每一时刻的输入就是一个单词,一句话拆分成多个时刻的输入。