コード例 #1
0
        public void GenerateValueFromString()
        {
            var primes  = new ulong[] { 40961, 65537, 114689, 147457, 188417 };
            var Factory = new EncryptedSealBfvFactory(primes, 4096);


            var expected = new ulong[] { 21399, 63588, 101610, 90324, 148561 };
            var str      = String.Join(",", expected.Select(x => x.ToString()));
            var v        = Factory.GetValueFromString(str);

            for (int i = 0; i < primes.Length; i++)
            {
                Assert.AreEqual(expected[i], (ulong)(v % primes[i]));
            }
        }
コード例 #2
0
        public void SaveLoadKeys()
        {
            if (Factory is EncryptedSealBfvFactory factory)
            {
                var now = DateTime.Now;
                factory.Save("keys.keys");
                factory.Save("keys2.keys", true);
                Console.WriteLine("Saved in {0}", (DateTime.Now - now).TotalSeconds);
                var v = Vector <Double> .Build.Dense(new double[] { 1, 2, 3 });

                IVector         vEnc     = factory.GetEncryptedVector(v, EVectorFormat.dense, 1);
                var             factory2 = new EncryptedSealBfvFactory("keys2.keys");
                Vector <double> w        = null;
                Utils.ProcessInEnv(env =>
                {
                    w = vEnc.Decrypt(env);
                }, factory2);
                Compare(v, w);
            }
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: ranigb/CryptoNets-1
        static void Main(string[] args)
        {
            // without encryption
            //var factory = new RawFactory(4096);
            DateTime start = DateTime.Now;
            // with encryption and allow 60+ bits long numbers
            var Factory = new EncryptedSealBfvFactory();

            //var factory = new EncryptedFactory(new ulong[] { 34359771137}, 16384, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 7);
            //var factory = new EncryptedFactory(new ulong[] { 5308417 }, 32768, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 7);

            Console.WriteLine("Generated keys in {0} seconds", (DateTime.Now - start).TotalSeconds);
            start = DateTime.Now;
            // with encryption and allow 17+ bits long numbers
            //var factory = new EncryptedFactory(new ulong[] { 188417 }, 4096, 60, 60);
            // with encryption and allow 70+ bits long numbers
            //var factory = new EncryptedFactory(new ulong[] { 40961, 65537, 114689, 147457, 188417 }, 4096);



            Vector <double> v = Vector <double> .Build.DenseOfArray(new double[] { 1, 2, 3 });

            Vector <double> z = Vector <double> .Build.DenseOfArray(new double[] { -1, 5, -4 });

            Utils.ProcessInEnv(env =>
            {
                var chipertext = Factory.GetEncryptedVector(v, EVectorFormat.dense, 1);
                var w          = chipertext.DotProduct(chipertext, env);
                var decrypted  = w.Decrypt(env);
                Console.WriteLine("Norm Sqared is:\n{0}", decrypted);

                var sum = chipertext.SumAllSlots(env).Decrypt(env);
                Console.WriteLine("sum of elements in a vector:\n{0}", sum);

                var z_chipertext = Factory.GetEncryptedVector(z, EVectorFormat.dense, 1);
                Console.WriteLine("elementwise multiply = \n{0}", chipertext.PointwiseMultiply(z_chipertext, env).Decrypt(env));
            }, Factory);

            Console.WriteLine("Compute in {0} seconds", (DateTime.Now - start).TotalSeconds);
        }
コード例 #4
0
        public void CryptoNetsPoolLayer()
        {
            OperationsCount.Reset();
            int batchSize = 8192;

            var Factory = new EncryptedSealBfvFactory(new ulong[] { 549764251649 /*, 549764284417*/ }, (ulong)batchSize);


            int weightscale = 32;
            var DenseLayer3 = new PoolLayer()
            {
                Source       = new DummyLayer(),
                InputShape   = new int[] { 5 * 13 * 13 },
                KernelShape  = new int[] { 5 * 13 * 13 },
                Stride       = new int[] { 1000 },
                MapCount     = new int[] { 100 },
                Weights      = CryptoNets.CryptoNets.Transpose(Weights.Weights_1, 5 * 13 * 13, 100),
                Bias         = Weights.Biases_2,
                WeightsScale = weightscale * weightscale,
                Factory      = Factory
            };

            DenseLayer3.Prepare();
            var input = Matrix <double> .Build.Dense(8192, 5 * 13 * 13);

            var m     = Factory.GetEncryptedMatrix(input, EMatrixFormat.ColumnMajor, 1);
            var start = DateTime.Now;
            var z     = DenseLayer3.Apply(m);
            var stop  = DateTime.Now;
            var time  = (stop - start).TotalMilliseconds;

            Console.WriteLine("time {0}", time);
            OperationsCount.Print();
            z.Dispose();
            m.Dispose();
            DenseLayer3.Dispose();
        }
コード例 #5
0
        static void Main(string[] args)
        {
            string fileName        = "MNIST-28x28-test.txt";
            int    batchSize       = 8192;
            int    numberOfRecords = 10000;
            var    Factory         = new EncryptedSealBfvFactory(new ulong[] { 2148728833, 2148794369, 2149810177 }, 16384, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 7);
            int    weightscale     = 32;

            var ReaderLayer = new BatchReader
            {
                FileName            = fileName,
                SparseFormat        = true,
                MaxSlots            = batchSize,
                NormalizationFactor = 1.0 / 256.0,
                Scale = 16.0
            };

            var EncryptedLayer = new EncryptLayer()
            {
                Source = ReaderLayer, Factory = Factory
            };

            var StartTimingLayer = new TimingLayer()
            {
                Source = EncryptedLayer, StartCounters = new string[] { "Batch-Time" }
            };

            var ConvLayer1 = new PoolLayer()
            {
                Source       = StartTimingLayer,
                InputShape   = new int[] { 28, 28 },
                KernelShape  = new int[] { 5, 5 },
                Upperpadding = new int[] { 1, 1 },
                Stride       = new int[] { 2, 2 },
                MapCount     = new int[] { 5, 1 },
                WeightsScale = weightscale,
                Weights      = Weights.Weights_0
            };

            //var ActivationLayer2 = new SquareActivation() { Source = ConvLayer1 };
            var ActivationLayer2 = new AppxReLUActivation()
            {
                Source = ConvLayer1
            };

            var DenseLayer3 = new PoolLayer()
            {
                Source       = ActivationLayer2,
                InputShape   = new int[] { 5 * 13 * 13 },
                KernelShape  = new int[] { 5 * 13 * 13 },
                Stride       = new int[] { 1000 },
                MapCount     = new int[] { 100 },
                Weights      = Transpose(Weights.Weights_1, 5 * 13 * 13, 100),
                Bias         = Weights.Biases_2,
                WeightsScale = weightscale * weightscale
            };

            //var ActivationLayer4 = new SquareActivation() { Source = DenseLayer3 };
            var ActivationLayer4 = new AppxReLUActivation()
            {
                Source = DenseLayer3
            };

            var DenseLayer5 = new PoolLayer()
            {
                Source       = ActivationLayer4,
                InputShape   = new int[] { 100 },
                KernelShape  = new int[] { 100 },
                Stride       = new int[] { 1000 },
                MapCount     = new int[] { 10 },
                Weights      = Weights.Weights_3,
                Bias         = Weights.Biases_3,
                WeightsScale = weightscale
            };

            var StopTimingLayer = new TimingLayer()
            {
                Source = DenseLayer5, StopCounters = new string[] { "Batch-Time" }
            };
            var network = StopTimingLayer;

            OperationsCount.Reset();
            Console.WriteLine("Preparing");
            network.PrepareNetwork();
            OperationsCount.Print();
            OperationsCount.Reset();
            for (var p = (INetwork)network; p != null; p = p.Source)
            {
                if (p is BaseLayer b)
                {
                    b.Verbose = true;
                }
            }

            int count = 0;
            int errs  = 0;

            while (count < numberOfRecords)
            {
                using (var m = network.GetNext())
                    Utils.ProcessInEnv(env =>
                    {
                        var decrypted = m.Decrypt(env);
                        for (int i = 0; i < decrypted.RowCount; i++)
                        {
                            int pred = 0;
                            for (int j = 1; j < decrypted.ColumnCount; j++)
                            {
                                if (decrypted[i, j] > decrypted[i, pred])
                                {
                                    pred = j;
                                }
                            }
                            if (pred != ReaderLayer.Labels[i])
                            {
                                errs++;
                            }
                            count++;
                            if (count % 100 == 0)
                            {
                                Console.WriteLine("errs {0}/{1} accuracy {2:0.000}% prediction {3} label {4}", errs, count, 100 - (100.0 * errs / (count)), pred, ReaderLayer.Labels[i]);
                            }
                        }
                        Console.WriteLine("Batch size {0} {1}", batchSize, TimingLayer.GetStats());
                    }, Factory);
            }
            Console.WriteLine("errs {0}/{1} accuracy {2:0.000}%", errs, count, 100 - (100.0 * errs / (count)));
            network.DisposeNetwork();
        }
コード例 #6
0
        public static void Main(string[] args)
        {
            WeightsReader wr = new WeightsReader("CifarWeight.csv", "CifarBias.csv");

            Console.WriteLine("Generating encryption keys {0}", DateTime.Now);
            var factory = new EncryptedSealBfvFactory(new ulong[] { 2148728833, 2148794369, 2149810177 }, 16384, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 7);

            Console.WriteLine("Encryption keys ready {0}", DateTime.Now);


            string fileName    = "cifar-test.tsv";
            var    readerLayer = new LLConvReader
            {
                FileName            = fileName,
                SparseFormat        = false,
                InputShape          = new int[] { 3, 32, 32 },
                KernelShape         = new int[] { 3, 8, 8 },
                Upperpadding        = new int[] { 0, 1, 1 },
                Lowerpadding        = new int[] { 0, 1, 1 },
                Stride              = new int[] { 1000, 2, 2 },
                NormalizationFactor = 1.0,
                Scale = 128.0
            };

            var encryptLayer = new EncryptLayer()
            {
                Source = readerLayer, Factory = factory
            };

            var convLayer1 = new LLPoolLayer()
            {
                Source       = encryptLayer,
                InputShape   = new int[] { 3, 32, 32 },
                KernelShape  = new int[] { 3, 8, 8 },
                Upperpadding = new int[] { 0, 1, 1 },
                Lowerpadding = new int[] { 0, 1, 1 },
                Stride       = new int[] { 1000, 2, 2 },
                MapCount     = new int[] { 83, 1, 1 },
                WeightsScale = 256.0,
                Weights      = (double[])wr.Weights[0],
                Bias         = (double[])wr.Biases[0]
            };

            var VectorizeLayer2 = new LLVectorizeLayer()
            {
                Source = convLayer1
            };

            var activationLayer3 = new SquareActivation()
            {
                Source = VectorizeLayer2
            };

            var convEngine = new ConvolutionEngine()
            {
                InputShape  = new int[] { 83, 14, 14 },
                KernelShape = new int[] { 83, 6, 6 },
                Padding     = new bool[] { false, false, false },
                Stride      = new int[] { 83, 2, 2 },
                MapCount    = new int[] { 163, 1, 1 }
            };

            var denseLayer4 = new LLDenseLayer
            {
                Source           = activationLayer3,
                WeightsScale     = 512.0,
                Weights          = convEngine.GetDenseWeights((double[])wr.Weights[1]),
                Bias             = convEngine.GetDenseBias((double[])wr.Biases[1]),
                InputFormat      = EVectorFormat.dense,
                ForceDenseFormat = true
            };


            var activationLayer5 = new SquareActivation()
            {
                Source = denseLayer4
            };

            var denseLayer6 = new LLDenseLayer()
            {
                Source       = activationLayer5,
                Weights      = (double[])wr.Weights[2],
                Bias         = (double[])wr.Biases[2],
                WeightsScale = 1024.0,
                InputFormat  = EVectorFormat.dense
            };

            var network = denseLayer6;

            Console.WriteLine("Preparing");
            // Visualize layer construction
            for (var p = (INetwork)network; p != null; p = p.Source)
            {
                if (p is BaseLayer b)
                {
                    b.Verbose = true;
                }
            }

            network.PrepareNetwork();

            var m = network.GetNext();

            Utils.Show(m, factory, readerLayer.Labels);
            Console.WriteLine("Max computed value {0} ({1})", RawMatrix.Max, Math.Log(RawMatrix.Max) / Math.Log(2));
        }
コード例 #7
0
        public static void Main(string[] args)
        {
            var options = new Options();
            var parsed  = Parser.Default.ParseArguments <Options>(args).WithParsed(x => options = x);

            if (parsed.Tag == ParserResultType.NotParsed)
            {
                Environment.Exit(-2);
            }

            WeightsReader wr = new WeightsReader("CifarWeight.csv", "CifarBias.csv");

            // Model has accuracy of 76.5
            // Current parameters (scale) provide accuracy of 76.31% and uses 78.55 + 1 bits in message length
            // It has a latency of 740 seconds on the reference machine (Azure B8ms server at rest)

            Console.WriteLine("Generating encryption keys {0}", DateTime.Now);
            IFactory factory = null;

            if (options.Encrypt)
            {
                factory = new EncryptedSealBfvFactory(new ulong[] { 957181001729, 957181034497 }, 16384, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 8);
            }
            else
            {
                factory = new RawFactory(16 * 1024);
            }
            Console.WriteLine("Encryption keys ready {0}", DateTime.Now);
            int  numberOfRecords = 10000;
            bool verbose         = options.Verbose;

            string fileName    = "cifar-test.tsv";
            var    readerLayer = new LLConvReader
            {
                FileName            = fileName,
                SparseFormat        = false,
                InputShape          = new int[] { 3, 32, 32 },
                KernelShape         = new int[] { 3, 8, 8 },
                Upperpadding        = new int[] { 0, 1, 1 },
                Lowerpadding        = new int[] { 0, 1, 1 },
                Stride              = new int[] { 1000, 2, 2 },
                NormalizationFactor = 1.0 / 256.0,
                Scale   = 8,
                Verbose = verbose
            };


            var EncryptLayer = new EncryptLayer()
            {
                Source = readerLayer, Factory = factory
            };
            var StartTimingLayer = new TimingLayer()
            {
                Source = EncryptLayer, StartCounters = new string[] { "Inference-Time" }
            };


            var ConvLayer1 = new LLPoolLayer()
            {
                Source       = StartTimingLayer,
                InputShape   = new int[] { 3, 32, 32 },
                KernelShape  = new int[] { 3, 8, 8 },
                Upperpadding = new int[] { 0, 1, 1 },
                Lowerpadding = new int[] { 0, 1, 1 },
                Stride       = new int[] { 1000, 2, 2 },
                MapCount     = new int[] { 83, 1, 1 },
                WeightsScale = 256.0,
                Weights      = (double[])wr.Weights[0],
                Bias         = (double[])wr.Biases[0],
                Verbose      = verbose
            };

            var VectorizeLayer2 = new LLVectorizeLayer()
            {
                Source  = ConvLayer1,
                Verbose = verbose
            };

            var ActivationLayer3 = new SquareActivation()
            {
                Source  = VectorizeLayer2,
                Verbose = verbose
            };



            var ConvEngine = new ConvolutionEngine()
            {
                InputShape   = new int[] { 83, 14, 14 },
                KernelShape  = new int[] { 83, 10, 10 },
                Upperpadding = new int[] { 0, 4, 4 },
                Lowerpadding = new int[] { 0, 4, 4 },
                Stride       = new int[] { 83, 2, 2 },
                MapCount     = new int[] { 112, 1, 1 }
            };

            var DenseLayer4 = new LLDenseLayer
            {
                Source           = ActivationLayer3,
                WeightsScale     = 512.0,
                Weights          = ConvEngine.GetDenseWeights((double[])wr.Weights[1]),
                Bias             = ConvEngine.GetDenseBias((double[])wr.Biases[1]),
                InputFormat      = EVectorFormat.dense,
                ForceDenseFormat = true,
                Verbose          = verbose
            };


            var ActivationLayer5 = new SquareActivation()
            {
                Source  = DenseLayer4,
                Verbose = verbose
            };

            var DenseLayer6 = new LLDenseLayer()
            {
                Source       = ActivationLayer5,
                Weights      = (double[])wr.Weights[2],
                Bias         = (double[])wr.Biases[2],
                WeightsScale = 512.0,
                InputFormat  = EVectorFormat.dense,
                Verbose      = verbose
            };

            var StopTimingLayer = new TimingLayer()
            {
                Source = DenseLayer6, StopCounters = new string[] { "Inference-Time" }
            };

            var network = StopTimingLayer;

            Console.WriteLine("Preparing");
            network.PrepareNetwork();
            int count     = 0;
            int errs      = 0;
            int batchSize = 1;

            while (count < numberOfRecords)
            {
                using (var m = network.GetNext())
                {
                    Utils.ProcessInEnv(env =>
                    {
                        var decrypted = m.Decrypt(env);
                        int pred      = 0;
                        for (int j = 1; j < decrypted.RowCount; j++)
                        {
                            if (decrypted[j, 0] > decrypted[pred, 0])
                            {
                                pred = j;
                            }
                        }
                        if (pred != readerLayer.Labels[0])
                        {
                            errs++;
                        }
                        count++;
                        if (count % batchSize == 0)
                        {
                            Console.Write("errs {0}/{1} accuracy {2:0.000}% prediction {3} label {4} {5}ms", errs, count, 100 - (100.0 * errs / (count)), pred, readerLayer.Labels[0], TimingLayer.GetStats());
                            if (options.Encrypt)
                            {
                                Console.WriteLine();
                            }
                            else
                            {
                                Console.WriteLine(" 2^{0} largest-value", Math.Log(RawMatrix.Max) / Math.Log(2));
                            }
                        }
                    }, factory);
                }
            }
            Console.WriteLine("errs {0}/{1} accuracy {2:0.000}%", errs, count, 100 - (100.0 * errs / (count)));
            network.DisposeNetwork();
            if (!options.Encrypt)
            {
                Console.WriteLine("Max computed value 2^{1}", Math.Log(RawMatrix.Max) / Math.Log(2));
            }
        }
コード例 #8
0
ファイル: Caltech101.cs プロジェクト: ranigb/CryptoNets-1
        static void Main(string[] args)
        {
            var ini = new IniReader(@"cal.model.ini", 4096, 102);

            ini.Normalize(@"cal.AffineNormalizer.txt");
            var    start       = DateTime.Now;
            var    Factory     = new EncryptedSealBfvFactory(new ulong[] { 4300801 }, 4096, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 2);
            double weightscale = 256;
            string FileName    = "cal_deep_test.tsv";

            if (!File.Exists(FileName))
            {
                Console.WriteLine("ERROR: Can't find data file {0}", FileName);
                Console.WriteLine("Please use DataPreprocess to obtain the Caltech-101 dataset");
                return;
            }

            var readerLayer = new LLSingleLineReader()
            {
                FileName            = FileName,
                SparseFormat        = true,
                NormalizationFactor = 1.0,
                Scale = 256,
            };

            var encryptLayer = new EncryptLayer()
            {
                Source = readerLayer, Factory = Factory
            };
            var denseLayer = new LLDenseLayer()
            {
                Source       = encryptLayer,
                Weights      = ini.Weights,
                Bias         = ini.Bias,
                WeightsScale = weightscale,
                InputFormat  = EVectorFormat.dense
            };

            var network = denseLayer;

            network.PrepareNetwork();
            int     errs = 0;
            var     N    = 1020;
            IMatrix m    = null;

            Utils.ProcessInEnv(env =>
            {
                for (int i = 0; i < N; i++)
                {
                    Utils.Time("Prediction+Encryption", () => m = network.GetNext());
                    var dec = m.Decrypt(env);
                    m.Dispose();
                    var l    = readerLayer.Labels[0];
                    int pred = 0;
                    for (int j = 0; j < 101; j++)
                    {
                        if (dec[j, 0] > dec[pred, 0])
                        {
                            pred = j;
                        }
                    }
                    if (pred != l)
                    {
                        errs++;
                    }
                    Console.WriteLine("errs {0}/{1} accuracy {2:0.000}% {3} prediction {4} label {5}", errs, i + 1, 100 - (100.0 * errs / (i + 1)), TimingLayer.GetStats(), pred, l);
                }
            }, Factory);
            network.DisposeNetwork();
        }