Дешифровка из json

Теперь совсем непонятно. Значения никто с клавиатуры не вводит, они ПРОПИСАНЫ В КОДЕ! Итак, имею программу, которая выводит ключи(имена массивов):

{$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. К тому же она зачем то сохраняет размеры.

13.0.0.4.weight потому что оно так называется в словоре. Дайте ему своё название если хотите, оно передаётся параметром fname в функции которые считывают объект и сохраняют его в файл. Я сейчас сделал что передаёт вместо названия ключ словаря.

А размеры уже не сохраняет, я закомментировал это.

Вот проблема: Ошибка при приведении Double в Decimal. Переписал так, чтобы читал и Double и Decimal и переводил сразу в Single. Результат - bw.Write(single((o4))) - заданное приведение не является допустимым.

Попробовал запустить Вашу программу - Exception. Я уже ничего не понимаю.

Важно не то что ошибка а какая). У меня пишет:

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-о мерный массив:

"2.weight" : Arr : [
			0 : System.Decimal(0.36821678280830383)
			1 : System.Decimal(0.11325336992740631)
			2 : System.Decimal(0.16857537627220154)
			3 : System.Decimal(0.0031781825236976147)
			4 : System.Decimal(0.37329545617103577)
			5 : System.Decimal(0.032075829803943634)
			6 : System.Decimal(0.36210280656814575)
			7 : System.Decimal(0.23077285289764404)
			8 : System.Decimal(2.4315297603607178)
			9 : System.Decimal(0.5644348859786987)
			10 : System.Decimal(0.2736789286136627)
			11 : System.Decimal(0.5671119689941406)
			12 : System.Decimal(0.6046656966209412)
			13 : System.Decimal(0.4039381146430969)
			14 : System.Decimal(0.37746092677116394)
			15 : System.Decimal(0.0011575500248000026)
			16 : System.Decimal(0.0007204473367892206)
			17 : System.Decimal(-0.002729201689362526)
			18 : System.Decimal(0.6900720000267029)
			19 : System.Decimal(0.13734953105449677)
			20 : System.Decimal(0.10661596059799194)
			21 : System.Decimal(0.4918227195739746)
			22 : System.Decimal(2.8141560554504395)
			23 : System.Decimal(0.14301876723766327)
			24 : System.Decimal(0.0006540906615555286)
			25 : System.Decimal(0.3235042989253998)
			26 : System.Decimal(0.5100299119949341)
			27 : System.Decimal(0.2883673906326294)
			28 : System.Decimal(1.045630693435669)
			29 : System.Decimal(0.4360208809375763)
			30 : System.Decimal(0.22335734963417053)
			31 : System.Decimal(-0.4508594274520874)
		]

То есть, моя догадка что weight-ы это 4-х мерные массивы а bias-ы это одномерные была не верна…

В таком случае немного более криво получается, ну да ладно. Вот то что получилось. Вот это у меня уже без ошибок работает.

1 лайк

Удалось это добавить! :slight_smile:

Вот чуть-чуть не успел сказать, что следующий за weight/bias группой weight/bias группа - это shift и scale для instanceNormalization, то есть - одномерный массив. :wink: Спасибо! Очень помогли! :blush: