PipeOpModule
wraps an nn_module
or function
that is being called during the train
phase of this
mlr3pipelines::PipeOp
. By doing so, this allows to assemble PipeOpModule
s in a computational
mlr3pipelines::Graph
that represents either a neural network or a preprocessing graph of a lazy_tensor
.
In most cases it is easier to create such a network by creating a graph that generates this graph.
In most cases it is easier to create such a network by creating a structurally related graph consisting
of nodes of class PipeOpTorchIngress
and PipeOpTorch
. This graph will then generate the graph consisting
of PipeOpModule
s as part of the ModelDescriptor
.
Input and Output Channels
The number and names of the input and output channels can be set during construction. They input and output
"torch_tensor"
during training, and NULL
during prediction as the prediction phase currently serves no
meaningful purpose.
Internals
During training, the wrapped nn_module
/ function
is called with the provided inputs in the order in which
the channels are defined. Arguments are not matched by name.
See also
Other Graph Network:
ModelDescriptor()
,
TorchIngressToken()
,
mlr_learners_torch_model
,
mlr_pipeops_torch
,
mlr_pipeops_torch_ingress
,
mlr_pipeops_torch_ingress_categ
,
mlr_pipeops_torch_ingress_ltnsr
,
mlr_pipeops_torch_ingress_num
,
model_descriptor_to_learner()
,
model_descriptor_to_module()
,
model_descriptor_union()
,
nn_graph()
Other PipeOp:
mlr_pipeops_torch_callbacks
,
mlr_pipeops_torch_optimizer
Super class
mlr3pipelines::PipeOp
-> PipeOpModule
Public fields
module
(
nn_module
)
The torch module that is called during the training phase.
Methods
Method new()
Creates a new instance of this R6 class.
Usage
PipeOpModule$new(
id = "module",
module = nn_identity(),
inname = "input",
outname = "output",
param_vals = list(),
packages = character(0)
)
Arguments
id
(
character(1)
)
The id for of the new object.module
(
nn_module
orfunction()
)
The torch module or function that is being wrapped.inname
(
character()
)
The names of the input channels.outname
(
character()
)
The names of the output channels. If this parameter has length 1, the parameter module must return a tensor. Otherwise it must return alist()
of tensors of corresponding length.param_vals
(named
list()
)
Parameter values to be set after construction.packages
(
character()
)
The R packages this object depends on.
Examples
## creating an PipeOpModule manually
# one input and output channel
po_module = po("module",
id = "linear",
module = torch::nn_linear(10, 20),
inname = "input",
outname = "output"
)
x = torch::torch_randn(16, 10)
# This calls the forward function of the wrapped module.
y = po_module$train(list(input = x))
str(y)
#> List of 1
#> $ output:Float [1:16, 1:20]
# multiple input and output channels
nn_custom = torch::nn_module("nn_custom",
initialize = function(in_features, out_features) {
self$lin1 = torch::nn_linear(in_features, out_features)
self$lin2 = torch::nn_linear(in_features, out_features)
},
forward = function(x, z) {
list(out1 = self$lin1(x), out2 = torch::nnf_relu(self$lin2(z)))
}
)
module = nn_custom(3, 2)
po_module = po("module",
id = "custom",
module = module,
inname = c("x", "z"),
outname = c("out1", "out2")
)
x = torch::torch_randn(1, 3)
z = torch::torch_randn(1, 3)
out = po_module$train(list(x = x, z = z))
str(out)
#> List of 2
#> $ out1:Float [1:1, 1:2]
#> $ out2:Float [1:1, 1:2]
# How such a PipeOpModule is usually generated
graph = po("torch_ingress_num") %>>% po("nn_linear", out_features = 10L)
result = graph$train(tsk("iris"))
# The PipeOpTorchLinear generates a PipeOpModule and adds it to a new (module) graph
result[[1]]$graph
#> Graph with 2 PipeOps:
#> ID State sccssors prdcssors
#> <char> <char> <char> <char>
#> torch_ingress_num <<UNTRAINED>> nn_linear
#> nn_linear <<UNTRAINED>> torch_ingress_num
linear_module = result[[1L]]$graph$pipeops$nn_linear
linear_module
#> PipeOp: <nn_linear> (not trained)
#> values: <list()>
#> Input channels <name [train type, predict type]>:
#> input [torch_tensor,NULL]
#> Output channels <name [train type, predict type]>:
#> output [torch_tensor,NULL]
formalArgs(linear_module$module)
#> [1] "input"
linear_module$input$name
#> [1] "input"
# Constructing a PipeOpModule using a simple function
po_add1 = po("module",
id = "add_one",
module = function(x) x + 1
)
input = list(torch_tensor(1))
po_add1$train(input)$output
#> torch_tensor
#> 2
#> [ CPUFloatType{1} ]