torch-rb 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/ext/torch/ext.cpp +0 -170
- data/ext/torch/nn_functions.cpp +44 -24
- data/ext/torch/templates.cpp +55 -0
- data/ext/torch/templates.hpp +48 -0
- data/ext/torch/tensor_functions.cpp +76 -16
- data/ext/torch/torch_functions.cpp +165 -65
- data/lib/torch.rb +51 -42
- data/lib/torch/ext.bundle +0 -0
- data/lib/torch/native/dispatcher.rb +1 -1
- data/lib/torch/native/function.rb +36 -5
- data/lib/torch/native/generator.rb +26 -7
- data/lib/torch/native/parser.rb +51 -14
- data/lib/torch/nn/avg_pool1d.rb +18 -0
- data/lib/torch/nn/avg_pool2d.rb +7 -2
- data/lib/torch/nn/avg_pool3d.rb +19 -0
- data/lib/torch/nn/avg_poolnd.rb +1 -1
- data/lib/torch/nn/batch_norm.rb +75 -0
- data/lib/torch/nn/batch_norm1d.rb +11 -0
- data/lib/torch/nn/batch_norm2d.rb +11 -0
- data/lib/torch/nn/batch_norm3d.rb +11 -0
- data/lib/torch/nn/constant_pad1d.rb +10 -0
- data/lib/torch/nn/constant_pad2d.rb +10 -0
- data/lib/torch/nn/constant_pad3d.rb +10 -0
- data/lib/torch/nn/constant_padnd.rb +18 -0
- data/lib/torch/nn/conv1d.rb +22 -0
- data/lib/torch/nn/conv2d.rb +9 -17
- data/lib/torch/nn/conv3d.rb +22 -0
- data/lib/torch/nn/fold.rb +20 -0
- data/lib/torch/nn/functional.rb +320 -100
- data/lib/torch/nn/group_norm.rb +36 -0
- data/lib/torch/nn/gru.rb +49 -0
- data/lib/torch/nn/hardshrink.rb +18 -0
- data/lib/torch/nn/instance_norm.rb +20 -0
- data/lib/torch/nn/instance_norm1d.rb +18 -0
- data/lib/torch/nn/instance_norm2d.rb +11 -0
- data/lib/torch/nn/instance_norm3d.rb +11 -0
- data/lib/torch/nn/layer_norm.rb +35 -0
- data/lib/torch/nn/local_response_norm.rb +21 -0
- data/lib/torch/nn/log_sigmoid.rb +9 -0
- data/lib/torch/nn/lp_pool1d.rb +9 -0
- data/lib/torch/nn/lp_pool2d.rb +9 -0
- data/lib/torch/nn/lp_poolnd.rb +22 -0
- data/lib/torch/nn/lstm.rb +66 -0
- data/lib/torch/nn/max_pool1d.rb +9 -0
- data/lib/torch/nn/max_pool2d.rb +1 -1
- data/lib/torch/nn/max_pool3d.rb +9 -0
- data/lib/torch/nn/max_poolnd.rb +6 -6
- data/lib/torch/nn/max_unpool1d.rb +16 -0
- data/lib/torch/nn/max_unpool2d.rb +16 -0
- data/lib/torch/nn/max_unpool3d.rb +16 -0
- data/lib/torch/nn/max_unpoolnd.rb +9 -0
- data/lib/torch/nn/module.rb +7 -0
- data/lib/torch/nn/reflection_pad1d.rb +10 -0
- data/lib/torch/nn/reflection_pad2d.rb +10 -0
- data/lib/torch/nn/reflection_padnd.rb +13 -0
- data/lib/torch/nn/replication_pad1d.rb +10 -0
- data/lib/torch/nn/replication_pad2d.rb +10 -0
- data/lib/torch/nn/replication_pad3d.rb +10 -0
- data/lib/torch/nn/replication_padnd.rb +13 -0
- data/lib/torch/nn/rnn_base.rb +48 -4
- data/lib/torch/nn/softshrink.rb +18 -0
- data/lib/torch/nn/softsign.rb +9 -0
- data/lib/torch/nn/tanh.rb +9 -0
- data/lib/torch/nn/tanhshrink.rb +9 -0
- data/lib/torch/nn/unfold.rb +19 -0
- data/lib/torch/nn/utils.rb +25 -0
- data/lib/torch/nn/zero_pad2d.rb +9 -0
- data/lib/torch/tensor.rb +14 -25
- data/lib/torch/version.rb +1 -1
- metadata +50 -2
@@ -0,0 +1,36 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class GroupNorm < Module
|
4
|
+
def initialize(num_groups, num_channels, eps: 1e-5, affine: true)
|
5
|
+
super()
|
6
|
+
@num_groups = num_groups
|
7
|
+
@num_channels = num_channels
|
8
|
+
@eps = eps
|
9
|
+
@affine = affine
|
10
|
+
if @affine
|
11
|
+
@weight = Parameter.new(Torch::Tensor.new(num_channels))
|
12
|
+
@bias = Parameter.new(Torch::Tensor.new(num_channels))
|
13
|
+
else
|
14
|
+
register_parameter("weight", nil)
|
15
|
+
register_parameter("bias", nil)
|
16
|
+
end
|
17
|
+
reset_parameters
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset_parameters
|
21
|
+
if @affine
|
22
|
+
Init.ones!(@weight)
|
23
|
+
Init.zeros!(@bias)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def forward(input)
|
28
|
+
F.group_norm(input, @num_groups, weight: @weight, bias: @bias, eps: @eps)
|
29
|
+
end
|
30
|
+
|
31
|
+
def extra_inspect
|
32
|
+
format("%{num_groups}, %{num_channels}, eps: %{eps}, affine: %{affine}", **dict)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/torch/nn/gru.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class GRU < RNNBase
|
4
|
+
def initialize(*args, **options)
|
5
|
+
super("GRU", *args, **options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def run_impl(input, hx, batch_sizes)
|
9
|
+
if batch_sizes.nil?
|
10
|
+
Torch.gru(input, hx, _get_flat_weights, @bias, @num_layers,
|
11
|
+
@dropout, @training, @bidirectional, @batch_first)
|
12
|
+
else
|
13
|
+
Torch.gru(input, batch_sizes, hx, _get_flat_weights, @bias,
|
14
|
+
@num_layers, @dropout, @training, @bidirectional)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def forward_impl(input, hx, batch_sizes, max_batch_size, sorted_indices)
|
19
|
+
if hx.nil?
|
20
|
+
num_directions = @bidirectional ? 2 : 1
|
21
|
+
hx = Torch.zeros(@num_layers * num_directions, max_batch_size, @hidden_size, dtype: input.dtype, device: input.device)
|
22
|
+
else
|
23
|
+
# Each batch of the hidden state should match the input sequence that
|
24
|
+
# the user believes he/she is passing in.
|
25
|
+
hx = permute_hidden(hx, sorted_indices)
|
26
|
+
end
|
27
|
+
|
28
|
+
check_forward_args(input, hx, batch_sizes)
|
29
|
+
result = run_impl(input, hx, batch_sizes)
|
30
|
+
output = result[0]
|
31
|
+
hidden = result[1]
|
32
|
+
[output, hidden]
|
33
|
+
end
|
34
|
+
|
35
|
+
def forward_tensor(input, hx: nil)
|
36
|
+
batch_sizes = nil
|
37
|
+
max_batch_size = @batch_first ? input.size(0) : input.size(1)
|
38
|
+
sorted_indices = nil
|
39
|
+
unsorted_indices = nil
|
40
|
+
output, hidden = forward_impl(input, hx, batch_sizes, max_batch_size, sorted_indices)
|
41
|
+
[output, permute_hidden(hidden, unsorted_indices)]
|
42
|
+
end
|
43
|
+
|
44
|
+
def forward(input, hx: nil)
|
45
|
+
forward_tensor(input, hx: hx)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class InstanceNorm < BatchNorm
|
4
|
+
def initialize(num_features, eps: 1e-5, momentum: 0.1, affine: false, track_running_stats: false)
|
5
|
+
super(num_features, eps: eps, momentum: momentum, affine: affine, track_running_stats: track_running_stats)
|
6
|
+
end
|
7
|
+
|
8
|
+
def forward(input)
|
9
|
+
_check_input_dim(input)
|
10
|
+
|
11
|
+
F.instance_norm(
|
12
|
+
input, running_mean: @running_mean, running_var: @running_var,
|
13
|
+
weight: @weight, bias: @bias,
|
14
|
+
use_input_stats: @training || !@track_running_stats,
|
15
|
+
momentum: @momentum, eps: @eps
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class InstanceNorm1d < InstanceNorm
|
4
|
+
def _check_input_dim(input)
|
5
|
+
if input.dim == 2
|
6
|
+
raise ArgumentError,
|
7
|
+
"InstanceNorm1d returns 0-filled tensor to 2D tensor." +
|
8
|
+
"This is because InstanceNorm1d reshapes inputs to" +
|
9
|
+
"(1, N * C, ...) from (N, C,...) and this makes" +
|
10
|
+
"variances 0."
|
11
|
+
end
|
12
|
+
if input.dim != 3
|
13
|
+
raise "expected 3D input (got #{input.dim}D input)"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class LayerNorm < Module
|
4
|
+
def initialize(normalized_shape, eps: 1e-5, elementwise_affine: true)
|
5
|
+
super()
|
6
|
+
@normalized_shape = Array(normalized_shape)
|
7
|
+
@eps = eps
|
8
|
+
@elementwise_affine = elementwise_affine
|
9
|
+
if @elementwise_affine
|
10
|
+
@weight = Parameter.new(Torch::Tensor.new(*normalized_shape))
|
11
|
+
@bias = Parameter.new(Torch::Tensor.new(*normalized_shape))
|
12
|
+
else
|
13
|
+
register_parameter("weight", nil)
|
14
|
+
register_parameter("bias", nil)
|
15
|
+
end
|
16
|
+
reset_parameters
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset_parameters
|
20
|
+
if @elementwise_affine
|
21
|
+
Init.ones!(@weight)
|
22
|
+
Init.zeros!(@bias)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def forward(input)
|
27
|
+
F.layer_norm(input, @normalized_shape, weight: @weight, bias: @bias, eps: @eps)
|
28
|
+
end
|
29
|
+
|
30
|
+
def extra_inspect
|
31
|
+
format("%{normalized_shape}, eps: %{eps}, elementwise_affine: %{elementwise_affine}", **dict)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class LocalResponseNorm < Module
|
4
|
+
def initialize(size, alpha: 1e-4, beta: 0.75, k: 1.0)
|
5
|
+
super()
|
6
|
+
@size = size
|
7
|
+
@alpha = alpha
|
8
|
+
@beta = beta
|
9
|
+
@k = k
|
10
|
+
end
|
11
|
+
|
12
|
+
def forward(input)
|
13
|
+
F.local_response_norm(input, @size, alpha: @alpha, beta: @beta, k: @k)
|
14
|
+
end
|
15
|
+
|
16
|
+
def extra_inspect
|
17
|
+
format("%{size}, alpha: %{alpha}, beta: %{beta}, k: %{k}", **dict)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class LPPoolNd < Module
|
4
|
+
def initialize(norm_type, kernel_size, stride: nil, ceil_mode: false)
|
5
|
+
super()
|
6
|
+
@norm_type = norm_type
|
7
|
+
@kernel_size = kernel_size
|
8
|
+
@stride = stride
|
9
|
+
@ceil_mode = ceil_mode
|
10
|
+
end
|
11
|
+
|
12
|
+
def extra_inspect
|
13
|
+
format("norm_type: %{norm_type}, kernel_size: %{kernel_size}, stride: %{stride}, ceil_mode: %{ceil_mode}",
|
14
|
+
norm_type: @norm_type,
|
15
|
+
kernel_size: @kernel_size,
|
16
|
+
stride: @stride,
|
17
|
+
ceil_mode: @ceil_mode
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class LSTM < RNNBase
|
4
|
+
def initialize(*args, **options)
|
5
|
+
super("LSTM", *args, **options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def check_forward_args(input, hidden, batch_sizes)
|
9
|
+
check_input(input, batch_sizes)
|
10
|
+
expected_hidden_size = get_expected_hidden_size(input, batch_sizes)
|
11
|
+
|
12
|
+
# TODO pass message
|
13
|
+
check_hidden_size(hidden[0], expected_hidden_size)
|
14
|
+
check_hidden_size(hidden[1], expected_hidden_size)
|
15
|
+
end
|
16
|
+
|
17
|
+
def permute_hidden(hx, permutation)
|
18
|
+
if permutation.nil?
|
19
|
+
return hx
|
20
|
+
end
|
21
|
+
raise NotImplementedYet
|
22
|
+
end
|
23
|
+
|
24
|
+
def forward_impl(input, hx, batch_sizes, max_batch_size, sorted_indices)
|
25
|
+
if hx.nil?
|
26
|
+
num_directions = @bidirectional ? 2 : 1
|
27
|
+
zeros = Torch.zeros(@num_layers * num_directions, max_batch_size, @hidden_size, dtype: input.dtype, device: input.device)
|
28
|
+
hx = [zeros, zeros]
|
29
|
+
else
|
30
|
+
# Each batch of the hidden state should match the input sequence that
|
31
|
+
# the user believes he/she is passing in.
|
32
|
+
hx = permute_hidden(hx, sorted_indices)
|
33
|
+
end
|
34
|
+
|
35
|
+
check_forward_args(input, hx, batch_sizes)
|
36
|
+
if batch_sizes.nil?
|
37
|
+
result = Torch.lstm(input, hx, _get_flat_weights, @bias, @num_layers,
|
38
|
+
@dropout, @training, @bidirectional, @batch_first)
|
39
|
+
else
|
40
|
+
result = Torch.lstm(input, batch_sizes, hx, _get_flat_weights, @bias,
|
41
|
+
@num_layers, @dropout, @training, @bidirectional)
|
42
|
+
end
|
43
|
+
output = result[0]
|
44
|
+
hidden = result[1..-1]
|
45
|
+
|
46
|
+
[output, hidden]
|
47
|
+
end
|
48
|
+
|
49
|
+
def forward_tensor(input, hx: nil)
|
50
|
+
batch_sizes = nil
|
51
|
+
max_batch_size = @batch_first ? input.size(0) : input.size(1)
|
52
|
+
sorted_indices = nil
|
53
|
+
unsorted_indices = nil
|
54
|
+
|
55
|
+
output, hidden = forward_impl(input, hx, batch_sizes, max_batch_size, sorted_indices)
|
56
|
+
|
57
|
+
[output, permute_hidden(hidden, unsorted_indices)]
|
58
|
+
end
|
59
|
+
|
60
|
+
def forward(input, hx: nil)
|
61
|
+
# TODO PackedSequence
|
62
|
+
forward_tensor(input, hx: hx)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/torch/nn/max_pool2d.rb
CHANGED
data/lib/torch/nn/max_poolnd.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
module Torch
|
2
2
|
module NN
|
3
3
|
class MaxPoolNd < Module
|
4
|
-
def initialize(kernel_size
|
4
|
+
def initialize(kernel_size, stride: nil, padding: 0, dilation: 1, return_indices: false, ceil_mode: false)
|
5
5
|
super()
|
6
6
|
@kernel_size = kernel_size
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
@stride = stride || kernel_size
|
8
|
+
@padding = padding
|
9
|
+
@dilation = dilation
|
10
|
+
@return_indices = return_indices
|
11
|
+
@ceil_mode = ceil_mode
|
12
12
|
end
|
13
13
|
|
14
14
|
def extra_inspect
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class MaxUnpool1d < MaxUnpoolNd
|
4
|
+
def initialize(kernel_size, stride: nil, padding: 0)
|
5
|
+
super()
|
6
|
+
@kernel_size = _single(kernel_size)
|
7
|
+
@stride = _single(stride || kernel_size)
|
8
|
+
@padding = _single(padding)
|
9
|
+
end
|
10
|
+
|
11
|
+
def forward(input, indices, output_size: nil)
|
12
|
+
F.max_unpool1d(input, indices, @kernel_size, stride: @stride, padding: @padding, output_size: output_size)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Torch
|
2
|
+
module NN
|
3
|
+
class MaxUnpool2d < MaxUnpoolNd
|
4
|
+
def initialize(kernel_size, stride: nil, padding: 0)
|
5
|
+
super()
|
6
|
+
@kernel_size = _pair(kernel_size)
|
7
|
+
@stride = _pair(stride || kernel_size)
|
8
|
+
@padding = _pair(padding)
|
9
|
+
end
|
10
|
+
|
11
|
+
def forward(input, indices, output_size: nil)
|
12
|
+
F.max_unpool2d(input, indices, @kernel_size, @stride, @padding, output_size)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|