public void serialize_reload_new_version() { double[][] inputs = { new double[] { 1, 4, 2, 0, 1 }, new double[] { 1, 3, 2, 0, 1 }, new double[] { 3, 0, 1, 1, 1 }, new double[] { 3, 0, 1, 0, 1 }, new double[] { 0, 5, 5, 5, 5 }, new double[] { 1, 5, 5, 5, 5 }, new double[] { 1, 0, 0, 0, 0 }, new double[] { 1, 0, 0, 0, 0 }, }; int[] outputs = { 0, 0, 1, 1, 2, 2, 3, 3, }; IKernel kernel = new Linear(); var msvm = new MultilabelSupportVectorMachine(5, kernel, 4); var smo = new MultilabelSupportVectorLearning(msvm, inputs, outputs); smo.Algorithm = (svm, classInputs, classOutputs, i, j) => new SequentialMinimalOptimization(svm, classInputs, classOutputs) { Complexity = 1 }; double expected = smo.Run(); // Save the machines var bytes = msvm.Save(); // Reload the machines var target = Serializer.Load <MultilabelSupportVectorMachine>(bytes); double actual; int count = 0; // Compute errors for (int i = 0; i < inputs.Length; i++) { double[] responses; target.Compute(inputs[i], out responses); int y; responses.Max(out y); if (y != outputs[i]) { count++; } } actual = (double)count / inputs.Length; Assert.AreEqual(expected, actual); Assert.AreEqual(msvm.Inputs, target.Inputs); Assert.AreEqual(msvm.Classes, target.Classes); for (int i = 0; i < msvm.Machines.Length; i++) { var a = msvm[i]; var b = target[i]; Assert.AreEqual(a.Threshold, b.Threshold); Assert.AreEqual(a.NumberOfInputs, b.NumberOfInputs); Assert.AreEqual(a.NumberOfOutputs, b.NumberOfOutputs); Assert.IsTrue(a.Weights.IsEqual(b.Weights)); Assert.IsTrue(a.SupportVectors.IsEqual(b.SupportVectors)); } }
public void SerializeTest1() { double[][] inputs = { new double[] { 1, 4, 2, 0, 1 }, new double[] { 1, 3, 2, 0, 1 }, new double[] { 3, 0, 1, 1, 1 }, new double[] { 3, 0, 1, 0, 1 }, new double[] { 0, 5, 5, 5, 5 }, new double[] { 1, 5, 5, 5, 5 }, new double[] { 1, 0, 0, 0, 0 }, new double[] { 1, 0, 0, 0, 0 }, }; int[] outputs = { 0, 0, 1, 1, 2, 2, 3, 3, }; IKernel kernel = new Linear(); var msvm = new MultilabelSupportVectorMachine(5, kernel, 4); var smo = new MultilabelSupportVectorLearning(msvm, inputs, outputs); smo.Algorithm = (svm, classInputs, classOutputs, i, j) => new SequentialMinimalOptimization(svm, classInputs, classOutputs) { Complexity = 1 }; double error = smo.Run(); Assert.AreEqual(0, error); int count = 0; // Compute errors for (int i = 0; i < inputs.Length; i++) { double[] responses; msvm.Compute(inputs[i], out responses); int y; responses.Max(out y); if (y != outputs[i]) { count++; } } double expected = (double)count / inputs.Length; Assert.AreEqual(msvm.Inputs, 5); Assert.AreEqual(msvm.Classes, 4); Assert.AreEqual(4, msvm.Machines.Length); MemoryStream stream = new MemoryStream(); // Save the machines msvm.Save(stream); // Rewind stream.Seek(0, SeekOrigin.Begin); // Reload the machines var target = MultilabelSupportVectorMachine.Load(stream); double actual; count = 0; // Compute errors for (int i = 0; i < inputs.Length; i++) { double[] responses; target.Compute(inputs[i], out responses); int y; responses.Max(out y); if (y != outputs[i]) { count++; } } actual = (double)count / inputs.Length; Assert.AreEqual(expected, actual); Assert.AreEqual(msvm.Inputs, target.Inputs); Assert.AreEqual(msvm.Classes, target.Classes); for (int i = 0; i < msvm.Machines.Length; i++) { var a = msvm[i]; var b = target[i]; Assert.IsTrue(a.SupportVectors.IsEqual(b.SupportVectors)); } }