public void PreConvLayer() { var Factory = Defaults.RawFactory; var preConvLayer = new LLPreConvLayer() { Factory = Factory, InputShape = new int[] { 28, 28 }, KernelShape = new int[] { 5, 5 }, Upperpadding = new int[] { 1, 1 }, Stride = new int[] { 2, 2 }, }; preConvLayer.Prepare(); var lineLength = 28; var inp = Enumerable.Range(0, lineLength * lineLength).Select(x => (double)(x + 1)).ToArray(); Utils.ProcessInEnv(env => { var v = Factory.GetEncryptedVector(Vector <double> .Build.DenseOfArray(inp), EVectorFormat.dense, 1); var res = preConvLayer.Apply(Factory.GetMatrix(new IVector[] { v }, EMatrixFormat.ColumnMajor)); var dec = res.Decrypt(env); Assert.AreEqual(196, dec.RowCount); Assert.AreEqual(25, dec.ColumnCount); var values = new HashSet <int>(); for (int j = 0; j < dec.RowCount; j++) { var val = (int)(dec[j, 0]); if (val != 0) { Assert.IsFalse(values.Contains(val)); values.Add(val); var x = (val - 1) / 28; var y = (val - 1) % 28; Assert.AreEqual(0, x % 2); Assert.AreEqual(0, y % 2); Assert.IsTrue(x >= 0); Assert.IsTrue(x < 26); Assert.IsTrue(y >= 0); Assert.IsTrue(y < 26); } } Assert.AreEqual(13 * 13, values.Count); for (int i = 1; i < 25; i++) { var dx = i / 5; var dy = i % 5; var delta = dy * 28 + dx; for (int j = 0; j < dec.RowCount; j++) { var val = dec[j, i]; var val0 = dec[j, 0]; if (val0 == 0) { Assert.AreEqual(0, val); } else { var y = (int)(val0 - 1) / 28; var x = (int)(val0 - 1) % 28; if (x + dx >= 28) { Assert.AreEqual(0, val); } else if (y + dy >= 28) { Assert.AreEqual(0, val); } else { Assert.AreEqual(val0 + delta, val); } } } } }, Factory); }
public static Tuple<INetwork, IFactory> LoLaDense(string FileName, bool Encrypt) { Console.WriteLine("LoLa-Dense mode"); Console.Write("Generating keys in "); var start = DateTime.Now; var Factory = (Encrypt) ? (IFactory)new EncryptedSealBfvFactory(new ulong[] { 34359771137, 34360754177 }, 16384, DecompositionBitCount: 60, GaloisDecompositionBitCount: 60, SmallModulusCount: 7) : (IFactory)new RawFactory(16384); var end = DateTime.Now; Console.WriteLine("{0} seconds", (end - start).TotalSeconds); int weightscale = 32; var readerLayer = new LLSingleLineReader() { FileName = FileName, SparseFormat = true, NormalizationFactor = 1.0 / 256.0, Scale = 16.0, }; var encryptLayer = new EncryptLayer() { Source = readerLayer, Factory = Factory }; var preConvLayer1 = new LLPreConvLayer() { Source = encryptLayer, InputShape = new int[] { 28, 28 }, KernelShape = new int[] { 5, 5 }, Upperpadding = new int[] { 1, 1 }, Stride = new int[] { 2, 2 }, UseAxisForBlocks = new bool[] { true, true } }; var ConvLayer2 = new LLPoolLayer() { Source = preConvLayer1, 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, HotIndices = preConvLayer1.HotIndices }; var VectorizeLayer3 = new LLVectorizeLayer() { Source = ConvLayer2 }; //var ActivationLayer4 = new SquareActivation() { Source = VectorizeLayer3 }; var ActivationLayer4 = new AppxReLUActivation() { Source = VectorizeLayer3 }; //var ActivationLayer4 = new LeakyReLUActivation() { Source = VectorizeLayer3 }; //var ActivationLayer4 = new ReLUActivation() { Source = VectorizeLayer3 }; var DuplicateLayer5 = new LLDuplicateLayer() { Source = ActivationLayer4, Count = 16}; var DenseLayer6 = new LLPackedDenseLayer() { Source = DuplicateLayer5, Weights = preConvLayer1.RearrangeWeights(Transpose(Weights.Weights_1, 5 * 13 * 13, 100)), Bias = Weights.Biases_2, WeightsScale = weightscale * weightscale, PackingCount = DuplicateLayer5.Count, PackingShift = 1024, }; //var ActivationLayer7 = new SquareActivation() { Source = DenseLayer6 }; var ActivationLayer7 = new AppxReLUActivation() { Source = DenseLayer6 }; //var ActivationLayer7 = new LeakyReLUActivation() { Source = DenseLayer6 }; //var ActivationLayer7 = new ReLUActivation() { Source = DenseLayer6 }; var InterleaveLayer8 = new LLInterleaveLayer() { Source = ActivationLayer7, Shift = -1, SelectedIndices = Enumerable.Range(0, (int)DuplicateLayer5.Count).Select(i => 1023 + i * 1024).ToList() }; var DenseLayer8 = new LLInterleavedDenseLayer() { Source = InterleaveLayer8, Weights = Weights.Weights_3, Bias = Weights.Biases_3, WeightsScale = weightscale, Shift = -1, SelectedIndices = Enumerable.Range(0, (int)DuplicateLayer5.Count).Select(i => 1023 + i * 1024).ToList() }; var network = DenseLayer8; return new Tuple<INetwork, IFactory>(network, Factory); }