/// <summary> /// Encode source sentences and output encoded weights /// </summary> /// <param name="g"></param> /// <param name="inputSentences"></param> /// <param name="encoder"></param> /// <param name="reversEncoder"></param> /// <param name="Embedding"></param> /// <returns></returns> private IWeightMatrix Encode(IComputeGraph g, List <List <string> > inputSentences, Encoder encoder, Encoder reversEncoder, IWeightMatrix Embedding) { PadSentences(inputSentences); List <IWeightMatrix> forwardOutputs = new List <IWeightMatrix>(); List <IWeightMatrix> backwardOutputs = new List <IWeightMatrix>(); int seqLen = inputSentences[0].Count; List <IWeightMatrix> forwardInput = new List <IWeightMatrix>(); for (int i = 0; i < seqLen; i++) { for (int j = 0; j < inputSentences.Count; j++) { var inputSentence = inputSentences[j]; int ix_source = (int)SENTTAGS.UNK; if (m_srcWordToIndex.ContainsKey(inputSentence[i])) { ix_source = m_srcWordToIndex[inputSentence[i]]; } var x = g.PeekRow(Embedding, ix_source); forwardInput.Add(x); } } var forwardInputsM = g.ConcatRows(forwardInput); List <IWeightMatrix> attResults = new List <IWeightMatrix>(); for (int i = 0; i < seqLen; i++) { var emb_i = g.PeekRow(forwardInputsM, i * inputSentences.Count, inputSentences.Count); attResults.Add(emb_i); } for (int i = 0; i < seqLen; i++) { var eOutput = encoder.Encode(attResults[i], g); forwardOutputs.Add(eOutput); var eOutput2 = reversEncoder.Encode(attResults[seqLen - i - 1], g); backwardOutputs.Add(eOutput2); } backwardOutputs.Reverse(); var encodedOutput = g.ConcatRowColumn(forwardOutputs, backwardOutputs); return(encodedOutput); }