FastAI
function
_datareciperegistry
(
datasetregistry
;
name
=
"
Dataset recipes
"
)
Registry
(
(
;
id
=
Field
(
String
,
name
=
"
ID
"
,
formatfn
=
x
->
sprint
(
show
,
x
)
)
,
blocks
=
Field
(
Any
,
name
=
"
Block types
"
,
description
=
"
Types of blocks of the data container that this recipe loads.
"
,
filterfn
=
blocktypesmatch
,
formatfn
=
b
->
FeatureRegistries
.
code_format
(
_formatblock
(
b
)
)
)
,
description
=
Field
(
String
,
name
=
"
Description
"
,
optional
=
true
,
description
=
"
More information about the dataset recipe
"
,
formatfn
=
FeatureRegistries
.
md_format
)
,
downloaded
=
Field
(
Bool
,
name
=
"
Is downloaded
"
,
description
=
"""
Whether the dataset this recipe is based has been downloaded and is
available locally.
"""
,
computefn
=
(
row
,
key
)
->
isavailable
(
datasetregistry
[
row
.
datasetid
]
.
loader
)
)
,
datasetid
=
Field
(
String
,
name
=
"
Dataset ID
"
,
description
=
"
ID of the dataset this recipe is based on.
"
,
computefn
=
function
(
row
,
key
)
val
=
row
[
key
]
if
!
haskey
(
datasetregistry
,
val
)
throw
(
ArgumentError
(
"
Could not find dataset with ID \"
$
val
\"!
"
)
)
end
return
val
end
)
,
package
=
Field
(
Module
,
name
=
"
Package
"
)
,
recipe
=
Field
(
Datasets
.
DatasetRecipe
,
name
=
"
Recipe
"
,
formatfn
=
FeatureRegistries
.
type_format
)
)
;
name
,
loadfn
=
function
loadrecipeentry
(
row
)
dataset
=
load
(
datasetregistry
[
row
.
datasetid
]
)
Datasets
.
loadrecipe
(
row
.
recipe
,
dataset
)
end
,
description
=
"""
A registry for dataset recipes. `load`ing an entry will download the
corresponding dataset (see `datasets`) and return `data, blocks`, a
data container and the `Block`s of the observations.
```julia
data, blocks = load(datarecipes()[id])
```
See `learningtasks` to find compatible learning tasks.
"""
)
end
const
DATARECIPES
=
_datareciperegistry
(
DATASETS
)
"""
datarecipes(; filters...)
Show a registry of available dataset recipes. A dataset recipe defines how
to load a dataset into a suitable format for use with a learning task.
Pass in filters as keyword arguments to look at a subset.
See also [finding functionality](/doc/docs/discovery.md), [`datasets`](#),
and [`learningtasks`](#). For more information on registries, see
[FeatureRegistries.jl](https://github.com/lorenzoh/FeatureRegistries.jl).
## Examples
Show all available dataset recipes:
{cell}
```julia
using FastAI
datarecipes()
```
Show all recipes for datasets that have "image" in their name:
{cell}
```julia
datarecipes(datasetid="image")
```
Show all data recipes usable for classification tasks, that is where the
target block is a [`Label`](#):
{cell}
```julia
datarecipes(blocks=(Any, Label))
```
Get an explanation of fields in the dataset recipe registry:
{cell}
```julia
info(datarecipes())
```
"""
datarecipes
(
;
kwargs
...
)
=
isempty
(
kwargs
)
?
DATARECIPES
:
filter
(
DATARECIPES
;
kwargs
...
)
registerrecipes
(
m
::
Module
,
recipes
)
=
registerrecipes
(
DATARECIPES
,
m
,
recipes
)
function
registerrecipes
(
reg
::
Registry
,
m
::
Module
,
recipes
::
Dict
)
for
(
datasetid
,
rs
)
in
recipes
,
recipe
in
rs
recipeid
,
recipe
=
if
recipe
isa
Pair
joinpath
(
datasetid
,
recipe
[
1
]
)
,
recipe
[
2
]
else
datasetid
,
recipe
end
if
!
haskey
(
reg
,
recipeid
)
push!
(
reg
,
(
id
=
recipeid
,
datasetid
=
datasetid
,
blocks
=
Datasets
.
recipeblocks
(
recipe
)
,
package
=
m
,
recipe
=
recipe
)
)
end
end
end