0 | module NN.Training.DataLoader
3 | import Data.Container.Additive
5 | import Control.Monad.Distribution
6 | import Control.Monad.Sample.Definition
7 | import Control.Monad.Sample.Instances
11 | DatasetAxis = "dataset" ~> List1
17 | DataLoader : (input, output : Type) -> Cont
18 | DataLoader input output = Pick [DatasetAxis] (input, output)
21 | Dataset : (input, output : Type) -> Type
22 | Dataset input output = (DataLoader input output).Shp
26 | datasetSize : Dataset input output -> Nat
27 | datasetSize dl = S dl.extractShapeRank1
34 | dataLens : DataLoader input output =%> Dist DatasetAxis
35 | dataLens = Tensor.pick %>> rightUnit %>> uniformLens
39 | handleData : Costate (IO <!> DataLoader input output)
40 | handleData = (IO <!> dataLens) %>> sample
45 | SupervisedData : (input, output : Type) -> Cont
46 | SupervisedData input output = Nap (input, output)
50 | handleDataFor : (dl : Dataset x y) -> Costate (IO <!> SupervisedData x y)
51 | handleDataFor dl = (IO <!> atShape {c = DataLoader x y} dl) %>> handleData
55 | makeDataLoader : Monad m =>
56 | {batch : Axis} -> (isCub : IsCubical batch) => IsSucc (batch.dim) =>
57 | (xs : Tensor [batch] input) ->
58 | (groundTruthFn : input -> m output) ->
59 | m (Dataset input output)
60 | makeDataLoader {isCub = MkIsCubical _ (S k)} xs groundTruthFn
61 | = restructureAxis vectToList1 . liftA2Tensor xs <$> traverse groundTruthFn xs