示例#1
0
        // NB: Mirror not really implemented ...
        // Nullable<bool> mirror_ = null;

        public DataLayer(int index, int inputDimension, ImageCoordinates inputCoordinates)
        {
            scale_       = 1.0;
            meanImage_   = null;
            meanChannel_ = null;
            InitLayer(index, LayerType.DATA_LAYER, inputDimension, inputDimension, inputCoordinates, inputCoordinates);
        }
示例#2
0
        public static NeuralNet ReadNeuralNet(Func <int> readInt32, Func <double> readSingle, int inputDimension, ImageCoordinates inputCoordinates)
        {
            NeuralNet nn         = new NeuralNet();
            int       layerCount = readInt32();

            int curDimension = inputDimension;
            ImageCoordinates curCoordinates = inputCoordinates;

            CropTransform cropT = null;

            for (int i = 0; i < layerCount; i++)
            {
                Layer layer = ReadLayer(i, readInt32, readSingle, curCoordinates, curDimension, out cropT);
                if (layer != null)
                {
                    nn.AddLayer(layer);
                    curDimension   = layer.OutputDimension;
                    curCoordinates = layer.OutputCoordinates;

                    if (layer.LayerType == LayerType.DATA_LAYER && cropT != null)
                    {
                        nn.AddCropTransform(cropT);
                    }
                }
            }

            // Currently disabled because perf gains are not enough, in fact things seem somewhat slower ...
            // Console.Write("Linearizing sequences of linear layers ...");
            // Coalesce affine layers for running the network more optimally
            // nn.CoalesceToVirtual();
            // GC.Collect(2);
            // Console.WriteLine("Done.");
            return(nn);
        }
示例#3
0
 public AugmentContrast(ImageCoordinates coords, int how_many, double min_contrast_factor, double max_contrast_factor)
 {
     _coords              = coords;
     _how_many            = how_many;
     _max_contrast_factor = max_contrast_factor;
     _min_contrast_factor = min_contrast_factor;
     _random              = new Random(System.DateTime.Now.Millisecond);
 }
示例#4
0
 public AugmentRotation(ImageCoordinates coords, int how_many, float degrees)
 {
     _coords   = coords;
     _how_many = how_many;
     _degrees  = degrees;
     Trace.Assert(degrees >= -180.0 && degrees <= 180.0);
     _random = new Random(System.DateTime.Now.Millisecond);
 }
示例#5
0
 public AugmentBrightness(ImageCoordinates coords, RANDTYPE typ, int how_many, double max_eps)
 {
     _typ      = typ;
     _coords   = coords;
     _how_many = how_many;
     _max_eps  = max_eps;
     _random   = new Random(System.DateTime.Now.Millisecond);
 }
示例#6
0
        public CropTransform(ImageCoordinates inputCoordinates, int inputDimension, int cropSize, bool fromCenter = true)
        {
            cropSize_         = cropSize;
            inputDimension_   = inputDimension;
            inputCoordinates_ = inputCoordinates;

            outputDimension_   = cropSize * cropSize * inputCoordinates.ChannelCount;
            outputCoordinates_ = new ImageCoordinates(inputCoordinates.ChannelCount, cropSize, cropSize);
        }
示例#7
0
 public AugmentGeometric(ImageCoordinates coords, RANDTYPE typ, int how_many, int xoffest, int yoffset)
 {
     _typ      = typ;
     _coords   = coords;
     _how_many = how_many;
     _xoffset  = xoffest;
     _yoffset  = yoffset;
     _random   = new Random(System.DateTime.Now.Millisecond);
 }
示例#8
0
 /// <summary>
 /// Reading from our own text format. These are the networks we we get as output from our Torch/LUA experiments.
 /// </summary>
 /// <param name="file"></param>
 /// <param name="inputDimension"></param>
 /// <param name="inputCoordinates"></param>
 /// <returns></returns>
 public static NeuralNet ReadTxtNeuralNet(string file, int inputDimension, ImageCoordinates inputCoordinates)
 {
     Console.WriteLine("Reading neural net from file: " + file);
     using (FileStream fs = File.Open(file, FileMode.Open))
     {
         TextReader br = new StreamReader(fs);
         return(ReadNeuralNet(() => ReadInt32_TextNewLine(br),
                              () => ReadSingle_TextNewLine(br), inputDimension, inputCoordinates));
     }
 }
示例#9
0
        public AugmentLossyJpeg(ImageCoordinates coords, int how_many, int loss)
        {
            _coords   = coords;
            _how_many = how_many;
            _loss     = loss;

            Trace.Assert(loss >= 0 && loss <= 100);

            _random = new Random(System.DateTime.Now.Millisecond);
        }
        public InnerProductLayer(int index, Matrix <double> weights, Vector <double> intercepts, ImageCoordinates inputCoordinates)
        {
            weightMatrix_ = weights;

            weightMatrixRows_ = new Vector <double> [weightMatrix_.RowCount];
            for (int i = 0; i < weightMatrix_.RowCount; i++)
            {
                weightMatrixRows_[i] = weightMatrix_.Row(i);
            }

            interceptVector_  = intercepts;
            inputCoordinates_ = inputCoordinates;
            InitLayer(index, LayerType.INNER_PRODUCT, weights.ColumnCount, weights.RowCount, inputCoordinates, null);
        }
示例#11
0
        ImageCoordinates outputCoordinates_; // NB: null means there is no particular structure in the output

        public void InitLayer(
            int index,
            LayerType layerType,
            int inputDimension,
            int outputDimension,
            ImageCoordinates inputCoordinates,
            ImageCoordinates outputCoordinates)
        {
            index_             = index;
            layerType_         = layerType;
            inputDimension_    = inputDimension;
            outputDimension_   = outputDimension;
            inputCoordinates_  = inputCoordinates;
            outputCoordinates_ = outputCoordinates;
        }
示例#12
0
        public static Layer ReadLayer(int index, Func <int> readInt32, Func <double> readSingle,
                                      ImageCoordinates inputCoordinates,
                                      int inputDim,
                                      out CropTransform cropT
                                      )
        {
            int typeID = readInt32();

            cropT = null;
            Console.Write("Reading layer with index {0,2}, of type {1}, input dimension {2}:", index, typeID, inputDim);
            switch (typeID)
            {
            case 0:         // "Data"
                Console.WriteLine("Data");
                var res = ReadDataLayer(index, readInt32, readSingle, inputCoordinates, inputDim);
                cropT = res.Item1;
                return(res.Item2);

            case 1:         // "InnerProduct"
                Console.Write("InnerProduct");
                return(ReadInnerProductLayer(index, readInt32, readSingle, inputCoordinates, inputDim));

            case 2:         // "ReLU"
                Console.WriteLine("ReLU");
                return(ReadRectifiedLinearLayer(index, readInt32, readSingle, inputCoordinates, inputDim));

            case 3:         // "SoftmaxWithLoss"
                Console.WriteLine("SoftMax");
                return(ReadSoftmaxLayer(readInt32, readSingle));

            case 4:         // "Convolution"
                Console.WriteLine("Convolution");
                return(ReadConvolutional(index, readInt32, readSingle, inputCoordinates, inputDim));

            case 5:         // "Pooling"
                Console.Write("Pooling, ");
                return(ReadPooling(index, readInt32, readSingle, inputCoordinates));

            case 6:         // "Dropout"
                Console.Write("Dropout, ");
                return(null);

            default:
                throw new Exception("Layer type ID not recognized: " + typeID);
            }
        }
示例#13
0
        public PoolingLayer(int index, ImageCoordinates inputCoordinates, int kernelDimension, int padding, int stride) : base()
        {
            inputCoordinates_ = inputCoordinates;
            kernelDimension_  = kernelDimension;
            padding_          = padding;
            stride_           = stride;

            int inputDimension = inputCoordinates_.ChannelCount * inputCoordinates_.RowCount * inputCoordinates_.ColumnCount;

            int rowCount    = Utils.UImageCoordinate.ComputeOutputCounts(kernelDimension, inputCoordinates.RowCount, stride, padding, true);
            int columnCount = Utils.UImageCoordinate.ComputeOutputCounts(kernelDimension, inputCoordinates.ColumnCount, stride, padding, true);

            int outputDimension = inputCoordinates.ChannelCount * rowCount * columnCount;

            ImageCoordinates ouputCoordinates = new ImageCoordinates(inputCoordinates.ChannelCount, rowCount, columnCount);

            InitLayer(index, LayerType.POOLING_LAYER, inputDimension, outputDimension, inputCoordinates, ouputCoordinates);
        }
示例#14
0
        public ConvolutionLayer(int index, ImageCoordinates inputCoordinates, double[][] kernels, double[] intercepts, int kernelDimension, int padding)
        {
            kernelMatrix_    = DenseMatrix.OfRowArrays(kernels);
            interceptVector_ = DenseVector.OfArray(intercepts);
            kernelDimension_ = kernelDimension;
            padding_         = padding;

            int inputDimension = inputCoordinates.ChannelCount * inputCoordinates.RowCount * inputCoordinates.ColumnCount;

            kernelCoordinates_ = new ImageCoordinates(kernels.Length, kernelDimension_, kernelDimension_);

            outputRowCount_     = Utils.UImageCoordinate.ComputeOutputCounts(kernelDimension, inputCoordinates.RowCount, 1, padding, false);
            outputColumnCount_  = Utils.UImageCoordinate.ComputeOutputCounts(kernelDimension, inputCoordinates.ColumnCount, 1, padding, false);
            outputChannelCount_ = kernels.Length;

            ImageCoordinates outputCoordinates = new ImageCoordinates(outputChannelCount_, outputRowCount_, outputColumnCount_);

            int outputDimension = outputChannelCount_ * outputRowCount_ * outputColumnCount_;

            InitLayer(index, LayerType.CONVOLUTION_LAYER, inputDimension, outputDimension, inputCoordinates, outputCoordinates);

            symbolic_output_storage = new ThreadLocal <LPSTerm[]>();

            // Fast convolution stuff:

            var jBound = Utils.UImageCoordinate.ComputeOutputCounts(KernelDimension, InputCoordinates.RowCount, 1, Padding, false);
            var kBound = Utils.UImageCoordinate.ComputeOutputCounts(KernelDimension, InputCoordinates.ColumnCount, 1, Padding, false);

            int kernelpositions = jBound * kBound;

            CheckInitThreadLocalScratch(kernelpositions);

            _intercept_scratch = DenseMatrix.Create(kernelMatrix_.RowCount, kernelpositions, 0.0);
            for (int k = 0; k < kernelMatrix_.RowCount; k++)
            {
                for (int x = 0; x < kernelpositions; x++)
                {
                    _intercept_scratch[k, x] = interceptVector_[k];
                }
            }
        }
示例#15
0
        public DataLayer(int index, int inputDimension,
                         ImageCoordinates inputCoordinates,
                         double scale,
                         double[] meanImage,
                         List <double> meanChannel
                         )
        {
            scale_     = scale;
            meanImage_ = meanImage;
            if (meanChannel != null && meanChannel.Count > 0)
            {
                int channel_count = inputCoordinates.ChannelCount;
                meanChannel_ = new double[channel_count];
                for (int i = 0; i < channel_count; i++)
                {
                    meanChannel_[i] = meanChannel[i % meanChannel.Count()];
                }
            }

            InitLayer(index, LayerType.DATA_LAYER, inputDimension, inputDimension, inputCoordinates, inputCoordinates);
        }
示例#16
0
        static Layer ReadConvolutional(int index, Func <int> readInt32, Func <double> readSingle, ImageCoordinates inputCoordinates, int inputDim)
        {
            int kernelCount     = readInt32();
            int kernelDimension = readInt32();
            int padding         = readInt32();

            // read kernels
            int kernelTotalDataCount = readInt32();
            int kernelDataCount      = kernelTotalDataCount / kernelCount;

            double[][] kernels = new double[kernelCount][];
            for (int i = 0; i < kernelCount; i++)
            {
                kernels[i] = new double[kernelDataCount];
                for (int j = 0; j < kernelDataCount; j++)
                {
                    kernels[i][j] = readSingle();
                }
            }

            // read intercepts
            int interceptTotalDataCount = readInt32();

            if (interceptTotalDataCount != kernelCount)
            {
                throw new Exception("Invalid parameters!");
            }
            double[] intercepts = new double[kernelCount];
            for (int i = 0; i < kernelCount; i++)
            {
                intercepts[i] = readSingle();
            }

            int channelCount = (kernelDataCount / (kernelCount * kernelDimension * kernelDimension));
            ImageCoordinates kernelCoordinates = new ImageCoordinates(channelCount, kernelDimension, kernelDimension);

            return(new ConvolutionLayer(index, inputCoordinates, kernels, intercepts, kernelDimension, padding));
        }
 public InnerProductLayer(int index, double[][] weights, double[] intercepts, ImageCoordinates inputCoordinates)
     : this(index, SparseMatrix.OfRowArrays(weights), DenseVector.OfArray(intercepts), inputCoordinates)
 {
 }
示例#18
0
 static Layer ReadRectifiedLinearLayer(int index, Func <int> readInt32, Func <double> readSingle, ImageCoordinates inputCoordinates, int inputDim)
 {
     return(new ReLULayer(index, inputDim, inputCoordinates));
 }
示例#19
0
        static Layer ReadPooling(int index, Func <int> readInt32, Func <double> readSingle, ImageCoordinates inputCoordinates)
        {
            int kernelDimension = readInt32();
            int stride          = readInt32();
            int padding         = readInt32();

            int poolMeth = readInt32();

            if (kernelDimension == 0)
            {
                Console.WriteLine("Kernel dimension = 0, treating this as global pooling!");
                Debug.Assert(inputCoordinates.ColumnCount == inputCoordinates.RowCount);
                Debug.Assert(padding == 0);

                kernelDimension = inputCoordinates.ColumnCount;
            }


            if (poolMeth == 0)
            {       // MAX
                Console.WriteLine("Pool method = MAX");
                return(new MaxPoolingLayer(index, inputCoordinates, kernelDimension, padding, stride));
            }
            else
            {       // AVG
                Console.WriteLine("Pool method = AVG");
                return(new AvgPoolingLayer(index, inputCoordinates, kernelDimension, padding, stride));
            }
        }
示例#20
0
        static Tuple <CropTransform, Layer> ReadDataLayer(
            int index,
            Func <int> readInt32, Func <double> readSingle,
            ImageCoordinates inputCoordinates,
            int inputDim)
        {
            int has_transform_param = readInt32();

            if (has_transform_param == 0)
            {
                DataLayer layer = new DataLayer(index, inputDim, inputCoordinates);
                return(new Tuple <CropTransform, Layer>(null, layer));
            }

            // Scale
            double scale     = 1.0;
            int    has_scale = readInt32();

            if (has_scale != 0)
            {
                scale = readSingle();
            }

            // Mirror
            int has_mirror = readInt32();     // ignore

            // Crop size
            CropTransform cropT_       = null;
            int           has_crop_siz = readInt32();

            if (has_crop_siz != 0)
            {
                int crop_siz = readInt32();
                cropT_ = new CropTransform(inputCoordinates, inputDim, crop_siz, true);
            }
            // Mean value
            List <double> mean_val     = new List <double>();
            int           mean_val_cnt = readInt32();

            for (int x = 0; x < mean_val_cnt; x++)
            {
                mean_val.Add(readSingle());
            }
            // Mean file
            int has_mean_file = readInt32();

            double[] mean_image = null;
            if (has_mean_file != 0)
            {
                int mean_image_siz = readInt32();
                if (mean_image_siz > 0)
                {
                    mean_image = new double[mean_image_siz];
                }
                for (int x = 0; x < mean_image_siz; x++)
                {
                    mean_image[x] = readSingle();
                }
            }

            ImageCoordinates dataLayerInputCoordinates = inputCoordinates;
            int dataLayerInputDim = inputDim;

            double[] dataLayerMeanImage = mean_image;
            if (cropT_ != null)
            {
                dataLayerInputCoordinates = cropT_.TransformedCoordinates();
                dataLayerInputDim         = cropT_.TransformedDimension();
                if (mean_image != null)
                {
                    dataLayerMeanImage = cropT_.Transform(DenseVector.OfArray(mean_image)).ToArray();
                }
            }

            Layer l = new DataLayer(
                index,
                dataLayerInputDim,
                dataLayerInputCoordinates,
                scale,
                dataLayerMeanImage,
                mean_val);

            return(new Tuple <CropTransform, Layer>(cropT_, l));
        }
示例#21
0
 public ReLULayer(int index, int dimension, ImageCoordinates coordinates)
 {
     dimension_ = dimension;
     InitLayer(index, LayerType.RECTIFIED_LINEAR, dimension, dimension, coordinates, coordinates);
 }
示例#22
0
 public MaxPoolingLayer(int index, ImageCoordinates inputCoordinates, int kernelDimension, int padding, int stride) :
     base(index, inputCoordinates, kernelDimension, padding, stride)
 {
 }
示例#23
0
        static Layer ReadInnerProductLayer(int index, Func <int> readInt32, Func <double> readSingle, ImageCoordinates inputCoordinates, int inputDim)
        {
            // Caffe format:
            // K : input dimension
            // N : output dimension
            // A : N * K dimensional matrix (row major order)
            // B : N dimensional vector
            // Matrix formula: output = A * input + B
            // Array formula: output[i] = (\sum_j A[i][j] * x[j]) + B[i]
            int inputDimension  = readInt32();
            int outputDimension = readInt32();

            double[][] weights = new double[outputDimension][];
            for (int i = 0; i < outputDimension; i++)
            {
                weights[i] = new double[inputDimension];
                for (int j = 0; j < inputDimension; j++)
                {
                    weights[i][j] = readSingle();
                }
            }
            double[] intercept = new double[outputDimension];
            for (int i = 0; i < outputDimension; i++)
            {
                intercept[i] = readSingle();
            }
            Console.WriteLine("Dimensions: " + inputDimension + " * " + outputDimension);
            return(new InnerProductLayer(index, weights, intercept, inputCoordinates));
        }
 public InnerProductLayer(int index, Tuple <Matrix <double>, Vector <double> > ws_and_is, ImageCoordinates inputCoordinates)
     : this(index, ws_and_is.Item1, ws_and_is.Item2, inputCoordinates)
 {
 }