コード例 #1
0
        /// <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;
                    }
                }
            }
        }
コード例 #2
0
        /// <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);
        }