Я использую провайдер типа JSON для загрузки созданного мной файла JSON.Минимальный ввод для провайдера типов выглядит следующим образом:
{
"conv1": {
"weight": {
"shape": [ 64, 3, 7, 7 ],
"data": [ 1e-30, -0.01077061053365469 ]
}
},
"bn1": {
"eps": 1e-05,
"weight": {
"shape": [ 64 ],
"data": [ 1e-30, 0.2651672959327698 ]
},
"bias": {
"shape": [ 64 ],
"data": [ 1e-30, 0.24643374979496002 ]
}
}
}
Хотя обе детали weight
имеют одинаковую форму и тип, провайдер типов дает мне два разных, но эквивалентных типа:
type Weight =
inherit IJsonDocument
new : shape: int [] * data: float [] -> Weight
member Data : float []
member JsonValue: JsonValue
member Shape: int []
и
type Weight2 =
inherit IJsonDocument
new : shape: int [] * data: float [] -> Weight2
member Data : float []
member JsonValue: JsonValue
member Shape: int []
Во-первых, это нехорошо, но, возможно, он не может понять, что они означают одно и то же.Поэтому я сел и попытался написать функцию, которая объединяет оба, чтобы я мог продолжить оттуда - у меня не получилось.
Мой первый подход состоял в использовании перегрузки:
type Tensor = {
Data:single[]
Shape:int list
} with
static member Unify1 (w:NN.Weight) = { Data = w.Data |> Array.map single; Shape = w.Shape |> Array.toList }
static member Unify1 (w:NN.Weight2) = { Data = w.Data |> Array.map single; Shape = w.Shape |> Array.toList }
Ошибка FS0438 Повторяющийся метод.Метод Unify1
имеет то же имя и сигнатуру, что и другой метод в типе Tensor
после удаления кортежей, функций, единиц измерения и / или предоставленных типов.
Затем я попробовал ручное тестирование типовнапример:
let unify2 (o:obj) =
match o with
| :? NN.Weight as w -> { Data = w.Data |> Array.map single; Shape = w.Shape |> Array.toList }
| :? NN.Weight2 as w -> { Data = w.Data |> Array.map single; Shape = w.Shape |> Array.toList }
| _ -> failwith "pattern oops"
Этот вариант не компилируется, потому что
Ошибка FS3062 Этот тип теста с предоставленным типом JsonProvider<...>.Weight
не разрешен, потому что этопредоставленный тип будет удален до Runtime.BaseTypes.IJsonDocument
во время выполнения.
Как я могу получить провайдер типа для создания унифицированного типа?В качестве альтернативы, как бы я сам смог объединить их, сделав счастливым компилятор?