Как сохранить списокв Unity для удобного поиска - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь сохранить список весов (List of double [] []), который использовался в моей нейронной сети, в файл.Но я не могу понять, как сохранить его, потому что в настоящее время мой вывод: "double [] [] double [] []"

Как сохранить список матриц в файл?

Вот мой код:

public void Save() {
    List<double[][]> weights = NN[neuron].GetWeights();

    Text(weights.ToString());
}


void Text(string input) {
    string path = Application.dataPath + "/text.text";

    File.WriteAllText(path, input);
}

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Хорошо, это было немного дольше, чем я планировал.Но, по крайней мере, нативный (и проверенный) ...; -)

метод сохранения

void SaveToFile(string fileName, List<double[][]> weightsList)
{
  using (var w = new StreamWriter(fileName))
  {
    w.WriteLine(weightsList.Count);
    foreach (var weight2D in weightsList)
    {
      w.WriteLine(weight2D.Length);
      foreach (var weight1D in weight2D)
      {
        w.WriteLine(weight1D.Length);
        foreach (var val in weight1D)
        {
          w.WriteLine(val.ToString(CultureInfo.InvariantCulture));
        }
      }
    }
  }
}

метод чтения

List<double[][]> ReadFromFile(string fileName)
{
  var output = new List<double[][]>();
  using (var r = new StreamReader(fileName))
  {
    int outputCount = int.Parse(r.ReadLine());
    for (int c = 0; c < outputCount; c++)
    {
      var weight2D = new double[int.Parse(r.ReadLine())][];
      for (int d = 0; d < weight2D.Length; d++)
      {
        weight2D[d] = new double[int.Parse(r.ReadLine())];
        for (int i = 0; i < weight2D[d].Length; i++)
        {
          weight2D[d][i] = double.Parse(r.ReadLine(), CultureInfo.InvariantCulture);
        }
      }
      output.Add(weight2D);
    }
  }
  return output;
}

using-examples:

public void Save()
{
  List<double[][]> weights = Cars[currentChild].GetWeights();

  SaveToFile(Application.dataPath + "/weights.txt", weights);
}

public void Load()
{
  List<double[][]> weights = ReadFromFile(Application.dataPath + "/weights.txt");

  // todo: set weights etc...
}
0 голосов
/ 02 марта 2019

Я бы сделал метод, специфичный для печати вашего списка.

public void Save() {
    List<double[][]> weights = Cars[currentChild].GetWeights();
    CreateTextSpecial(weights);
}


void CreateText(string input) {
    string path = Application.dataPath + "/weights.text";
    File.WriteAllText(path, input);
}

void CreateTextSpecial(List<double[][]> inputList){
    string textToAppend = "";
    for(int j=0;j<inputList.Count;j++){
        textToAppend += "[";
        for(int k=0;k<inputList[j].length;k++){
            textToAppend +="[";
            for(int l=0;l<inputList[j][k].length){
                textToAppend += inputList[j][k][l]+", "; 
            }
            textToAppend +="]\n";
        }
        textToAppend+="]\n";
    }

    string path = Application.dataPath+"/weights.text";
    File.WriteAllText(path, textToAppend);
}

По сути, он проходит по всем матрицам (?) В предоставленном списке и печатает их в следующем формате:

[[0.01,0.0214,0.055,]

[0.11,0.022,0.321,0.55,0.123,]]

[[1.205,2.210,]

[0.34124,25128.250,222,2.5293,]]

0 голосов
/ 01 марта 2019

Вы предполагаете, что вызов ToString для List<double[][]> выводит содержимое списка в строку и, вероятно, также предполагает, что результирующая строка легко проанализированагреться в List<double[][]>.Оба эти предположения неверны.

Как сохранить список матриц в файл?

Существуют библиотеки сериализации (JSON, XML, двоичные и т. Д.).), что может относительно легко сериализовать и десериализовать такие структуры, или вы можете написать код для циклического перемещения по списку и записи двумерного массива в некоем организованном формате, но реализация по умолчанию ToStringне делает это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...