Я пытаюсь сохранить класс в читаемом формате (XML). Проблема, результирующий файл только выводится как:XML Сериализация результатов класса Empty XML
<?xml version="1.0" encoding="Windows-1252"?>
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?>
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?>
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?>
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
Вот мой класс:
public class ExtremeLearningMachine {
public ExtremeLearningMachine()
{
}
int input, hidden; //only have 1 output neuron
double[,] W1, W2;
public ExtremeLearningMachine(int inputNeuron, int hiddenNeuron) { input = inputNeuron; hidden = hiddenNeuron; }
public void train(int dataCount, double[,] trainingSet) {
//set matrix
double[,] trainInput = new double[input, dataCount], desireOutput = new double[1, dataCount];
for (int i = 0; i < dataCount; i++) {
for (int j = 0; j < input; j++) trainInput[j, i] = trainingSet[i, j];
desireOutput[0, i] = trainingSet[i, input];
}
//W1
W1 = new double[hidden, input];
for (int i = 0; i < hidden; i++) { for (int j = 0; j < input; j++)W1[i, j] = Random.value; }
//hidden
//double[,] H = new double[hidden, dataCount];
double[,] H = Matrix.Multiply(W1, trainInput);
//activation function(binary sigmoid)
for (int i = 0; i < hidden; i++) {
for (int j = 0; j < dataCount; j++) H[i, j] = 1f/(1f + Mathf.Exp((float)-H[i, j]));
}
//W2
W2 = Matrix.Multiply(desireOutput, H.PseudoInverse());
}
public double test(double[,] set) {//only [~,1] allowed
double[,] H = Matrix.Multiply(W1, set.Transpose());
//activation function(binary sigmoid)
for (int i = 0; i < hidden; i++) H[i, 0] = 1f/(1f + Mathf.Exp((float)-H[i, 0]));
H = Matrix.Multiply(W2, H);
return H[0, 0];
}
}
А вот мой сохранить код:
void save()
{
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(typeof(ExtremeLearningMachine));
string path = Directory.GetCurrentDirectory() + "\\ElmTrain.xml";
System.IO.FileStream file = System.IO.File.Create(path);
for(int i=0;i<elm.Length;i++)
writer.Serialize(file, elm[i]);
file.Close();
}
Кроме того, мой код загрузки, в (я еще не проверял его, так как не могу сэкономить):
void load()
{
System.Xml.Serialization.XmlSerializer reader =
new System.Xml.Serialization.XmlSerializer(typeof(ExtremeLearningMachine));
System.IO.StreamReader file = new System.IO.StreamReader("//ElmTrain.xml");
elm = (ExtremeLearningMachine[])reader.Deserialize(file);
file.Close();
}
Я также открыт для любой другой идеи, чтобы сохранить этот класс в других машиночитаемых форматах, если это рекомендуется
Большое спасибо
Я попытался с помощью своей (я также сделал переменные общедоступными), но теперь это приводит к пустому файлу и исключению: массив не был одномерным массивом. – christantoan
@christantoan справа; поэтому исключение говорит вам, что 'XmlSerializer' является только счастливым сериализации массивов, если они одномерные. У вас есть двумерный массив. Итак ... это говорит вам, в чем проблема. Параметры: 1: сгладить ваши данные (все массивы могут быть векторизованы, пока вы сохраняете размеры); 2: используйте другой сериализатор –
И обратите внимание: я являюсь сильным сторонником создания отдельной модели DTO только для сериализации; ваша модель домена может иметь 2D-массив, а модель DTO может иметь 1D-массив, высоту и ширину (хотя технически хотя бы один из них избыточен, поскольку 1D-массив содержит длину) –