Importing things we would need.
We are going to select a dataset from the recently released Monash, UEA & UCR
Time Series Extrinsic Regression Repository (2020) ( web , paper ).
data
,
blocks
=
load
(
datarecipes
(
)
[
"
appliances_energy
"
]
)
;
getobs
gets us a sample from the TimeSeriesDataset. It returns a tuple with the input time series and the correspodning label.
input
,
label
=
sample
=
getobs
(
data
,
25
)
(Float32[23.7 23.7 … 24.0 24.1; 30.856667 30.663334 … 31.066668 31.23; … ; 40.0 40.0 … 40.0 40.0; 0.6 0.55 … 1.3666667 1.3333334], 11.49f0)
Now we create a learning task for time-series regression. This means using the time-series to predict labels. We will use the TimeSeriesRow block as input and
Continuous
block as the target.
task
=
TSRegression
(
blocks
,
data
)
;
The encodings passed in transform samples into formats suitable as inputs and outputs for a model
Let's check that samples from the created data container conform to the blocks of the learning task:
checkblock
(
task
.
blocks
.
sample
,
sample
)
true
To get an overview of the learning task created, and as a sanity test, we can use describetask. This shows us what encodings will be applied to which blocks, and how the predicted ŷ values are decoded.
describetask
(
task
)
encoded_sample
=
encodesample
(
task
,
Training
(
)
,
sample
)
(Float32[1.25567 1.25567 … 1.4426183 1.5049348; -2.3630838 -2.4116828 … -2.3102949 -2.269237; … ; 0.14111246 0.14111246 … 0.14111246 0.14111246; -0.7532581 -0.7651869 … -0.57035017 -0.5783027], Float32[11.49])
We will use an
InceptionTime
model for this task.
model
=
FastTimeSeries
.
Models
.
InceptionTime
(
24
,
1
)
;
We can
tasklossfn
to get a loss function suitable for our task.
lossfn
=
tasklossfn
(
task
)
mse (generic function with 1 method)
Next we create a pair of training and validation data loaders. They take care of batching and loading the data in parallel in the background.
traindl
,
validdl
=
taskdataloaders
(
data
,
task
,
8
)
;
We will use an
ADAM
optimzer for this task.
optimizer
=
ADAM
(
)
ADAM(0.001, (0.9, 0.999), 1.0e-8, IdDict{Any, Any}())
With the addition of an optimizer and a loss function, we can now create a Learner and start training.
fitonecycle!
(
learner
,
20
,
0.03
)
┌ Info: The GPU function is being called but the GPU is not accessible.
│ Defaulting back to the CPU. (No action is required if you want to run on the CPU).
└ @ Flux /Users/saksham/.julia/packages/Flux/js6mP/src/functor.jl:192
Epoch 1 TrainingPhase(): 100%|██████████████████████████| Time: 0:01:40
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 1.0 │ 142.689 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 1.0 │ 9526.84 │
└─────────────────┴───────┴─────────┘
Epoch 2 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 2.0 │ 36.1776 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 2.0 │ 2761.77 │
└─────────────────┴───────┴─────────┘
Epoch 3 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 3.0 │ 21.8786 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 3.0 │ 2405.18 │
└─────────────────┴───────┴─────────┘
Epoch 4 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 4.0 │ 24.9655 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 4.0 │ 581.368 │
└─────────────────┴───────┴─────────┘
Epoch 5 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 5.0 │ 22.4986 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 5.0 │ 78.5748 │
└─────────────────┴───────┴─────────┘
Epoch 6 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 6.0 │ 17.6525 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 6.0 │ 31.8414 │
└─────────────────┴───────┴─────────┘
Epoch 7 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 7.0 │ 16.7812 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 7.0 │ 43.8513 │
└─────────────────┴───────┴─────────┘
Epoch 8 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 8.0 │ 18.4489 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 8.0 │ 19.5717 │
└─────────────────┴───────┴─────────┘
Epoch 9 TrainingPhase(): 100%|██████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 9.0 │ 17.3489 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 9.0 │ 20.2309 │
└─────────────────┴───────┴─────────┘
Epoch 10 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:02
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 10.0 │ 13.0602 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 10.0 │ 27.7731 │
└─────────────────┴───────┴─────────┘
Epoch 11 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:04
┌───────────────┬───────┬────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │ 11.0 │ 17.051 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 11.0 │ 16.8113 │
└─────────────────┴───────┴─────────┘
Epoch 12 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:04
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 12.0 │ 12.0818 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 12.0 │ 23.0781 │
└─────────────────┴───────┴─────────┘
Epoch 13 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 13.0 │ 14.9439 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 13.0 │ 15.9388 │
└─────────────────┴───────┴─────────┘
Epoch 14 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │ 14.0 │ 13.336 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 14.0 │ 15.2863 │
└─────────────────┴───────┴─────────┘
Epoch 15 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 15.0 │ 11.6416 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 15.0 │ 17.4399 │
└─────────────────┴───────┴─────────┘
Epoch 16 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼────────┤
│ TrainingPhase │ 16.0 │ 9.8485 │
└───────────────┴───────┴────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 16.0 │ 15.5438 │
└─────────────────┴───────┴─────────┘
Epoch 17 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 17.0 │ 9.37123 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 17.0 │ 15.5285 │
└─────────────────┴───────┴─────────┘
Epoch 18 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 18.0 │ 10.1838 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 18.0 │ 14.4063 │
└─────────────────┴───────┴─────────┘
Epoch 19 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 19.0 │ 9.74364 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼────────┤
│ ValidationPhase │ 19.0 │ 14.059 │
└─────────────────┴───────┴────────┘
Epoch 20 TrainingPhase(): 100%|█████████████████████████| Time: 0:00:03
┌───────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├───────────────┼───────┼─────────┤
│ TrainingPhase │ 20.0 │ 8.15523 │
└───────────────┴───────┴─────────┘
┌─────────────────┬───────┬─────────┐
│ Phase │ Epoch │ Loss │
├─────────────────┼───────┼─────────┤
│ ValidationPhase │ 20.0 │ 15.6445 │
└─────────────────┴───────┴─────────┘
We can save the model for later inference using
savetaskmodel
savetaskmodel
(
"
tsregression.jld2
"
,
task
,
learner
.
model
;
force
=
true
)