Теперь совсем непонятно. Значения никто с клавиатуры не вводит, они ПРОПИСАНЫ В КОДЕ! Итак, имею программу, которая выводит ключи(имена массивов):
{$reference System.Web.Extensions.dll}
uses System.Collections.Generic;
Uses System.Web.Script.Serialization;
Uses System;
type
Dic = Dictionary<string, object>;
Type
ObjArr = array of object;
Type WType = array of array of array of System.Decimal;
Begin
var json := ReadAllText('weights.json'); //всё в виде текста
var jss := new JavaScriptSerializer(); //штука которая сделает из текста объект
jss.MaxJsonLength:=System.Int32.MaxValue;
var Head: Dic := jss.DeserializeObject(json) as Dic; //получаем объект. И да, можно в 1 строчку всё написать ;)
//Console.WriteLine(Single(Decimal(((((Head['1.weight'] as objArr)[2] as ObjArr)[0] as ObjArr)[1] as ObjArr)[8])).ToString());
//Console.WriteLine(Decimal((Head['1.bias'] as objArr)[0]).ToString());
Var arr:=new String[Head.Keys.Count];
Head.Keys.CopyTo(arr, 0);
For Var i:=0 to arr.Length-1 do
Console.WriteLine(arr[i]);
End.
Теперь, сохранить значения(и ничего более) каждого массива в отдельный бинарный файл…
Ну так последняя моя программа именно это и делает. Там проверяется тип является ли массив 4-х или 1-о мерным по ключу (у 4-х мерных вроде .weigth в названии, а может наоборот). И дальше их записывает каждый в отдельный файл.
13.0.0.4.weight потому что оно так называется в словоре. Дайте ему своё название если хотите, оно передаётся параметром fname в функции которые считывают объект и сохраняют его в файл. Я сейчас сделал что передаёт вместо названия ключ словаря.
А размеры уже не сохраняет, я закомментировал это.
Вот проблема: Ошибка при приведении Double в Decimal. Переписал так, чтобы читал и Double и Decimal и переводил сразу в Single. Результат - bw.Write(single((o4))) - заданное приведение не является допустимым.
0.CannotConvertException: Failed to convert from <System.Double> to <System.Decimal>
в 0.Program.SaveWeights(String fname, Object o) в D:\1Cергей\Мои программы\Test\0\0.pas:строка 52
в 0.Program.$Main() в D:\1Cергей\Мои программы\Test\0\0.pas:строка 101
в 0.Program.Main()
То есть ошибка тут:
foreach var o4 in a4 do
if o4 is Decimal then
bw.Write(single(Decimal(o4))) else
raise new CannotConvertException(o4.GetType,typeof(Decimal));
Значит входной тип был real а не Decimal.
Вот как раз для того чтоб понимать это и нужны исключения. Попробуйте их читать))
Я посмотрел в отформатированном варианте - там большая часть значения Decimal, но вперемешку с ними встречаются Double. Значит надо оба уметь читать, это не сложно добавить.
Дальше следующая проблема, под ключом “2.weight” сохранён 1-о мерный массив:
Вот чуть-чуть не успел сказать, что следующий за weight/bias группой weight/bias группа - это shift и scale для instanceNormalization, то есть - одномерный массив.
Спасибо! Очень помогли!