/// <summary> /// Extract features from source sequence /// </summary> /// <param name="decoder"></param> /// <param name="srcSequence"></param> /// <param name="targetSparseFeatureSize"></param> /// <param name="srcHiddenAvgOutput"></param> /// <param name="srcSparseFeatures"></param> protected virtual void ExtractSourceSentenceFeature(RNNDecoder decoder, Sequence srcSequence, int targetSparseFeatureSize) { //Extract dense features from source sequence var srcOutputs = decoder.ComputeTopHiddenLayerOutput(srcSequence); int srcSequenceDenseFeatureSize = srcOutputs[0].Length; int srcSequenceLength = srcOutputs.Length - 1; if (srcHiddenAvgOutput == null) { srcHiddenAvgOutput = new float[srcSequenceDenseFeatureSize * 2]; } var j = 0; float[] srcOutputForward = srcOutputs[0]; float[] srcOutputBackward = srcOutputs[srcSequenceLength]; while (j < srcSequenceDenseFeatureSize) { var vForward = new Vector <float>(srcOutputForward, j); var vBackward = new Vector <float>(srcOutputBackward, j); vForward.CopyTo(srcHiddenAvgOutput, j); vBackward.CopyTo(srcHiddenAvgOutput, srcSequenceDenseFeatureSize + j); j += Vector <float> .Count; } //Extract sparse features from source sequence if (srcSparseFeatures == null) { srcSparseFeatures = new Dictionary <int, float>(); } else { srcSparseFeatures.Clear(); } for (var i = 0; i < srcSequence.States.Length; i++) { foreach (var kv in srcSequence.States[i].SparseFeature) { var srcSparseFeatureIndex = kv.Key + targetSparseFeatureSize; if (srcSparseFeatures.ContainsKey(srcSparseFeatureIndex) == false) { srcSparseFeatures.Add(srcSparseFeatureIndex, kv.Value); } else { srcSparseFeatures[srcSparseFeatureIndex] += kv.Value; } } } }
/// <summary> /// Extract features from source sequence /// </summary> /// <param name="decoder"></param> /// <param name="srcSequence"></param> /// <param name="targetSparseFeatureSize"></param> /// <param name="srcHiddenAvgOutput"></param> /// <param name="srcSparseFeatures"></param> private void ExtractSourceSentenceFeature(RNNDecoder decoder, Sequence srcSequence, int targetSparseFeatureSize, List <float[]> srcDenseFeatureGroups, SparseVector srcSparseFeatures) { //Extract dense features from source sequence var srcOutputs = decoder.ComputeTopHiddenLayerOutput(srcSequence); int srcSequenceLength = srcOutputs.Length - 1; srcDenseFeatureGroups.Add(srcOutputs[srcSequenceLength]); if (numSrcDenseFeatureGroups > 1) { srcDenseFeatureGroups.Add(srcOutputs[0]); } if (numSrcDenseFeatureGroups > 2) { float srcOffsetPerBlock = (float)srcSequenceLength / (float)(numSrcDenseFeatureGroups - 1); if (srcOffsetPerBlock < 1.0) { srcOffsetPerBlock = 1.0f; } float idx = srcOffsetPerBlock; while (srcDenseFeatureGroups.Count < numSrcDenseFeatureGroups && idx < srcSequenceLength) { srcDenseFeatureGroups.Add(srcOutputs[(int)idx]); idx += srcOffsetPerBlock; } } //Extract sparse features from source sequence Dictionary <int, float> srcSparseFeaturesDict = new Dictionary <int, float>(); for (var i = 0; i < srcSequence.States.Length; i++) { foreach (var kv in srcSequence.States[i].SparseFeature) { var srcSparseFeatureIndex = kv.Key + targetSparseFeatureSize; if (srcSparseFeaturesDict.ContainsKey(srcSparseFeatureIndex) == false) { srcSparseFeaturesDict.Add(srcSparseFeatureIndex, kv.Value); } else { srcSparseFeaturesDict[srcSparseFeatureIndex] += kv.Value; } } } srcSparseFeatures.SetLength(srcSequence.SparseFeatureSize + targetSparseFeatureSize); srcSparseFeatures.AddKeyValuePairData(srcSparseFeaturesDict); }