Creating tensors

library(torch)

In this article we describe various ways of creating torch tensors in R.

From R objects

You can create tensors from R objects using the torch_tensor function. The torch_tensor function takes an R vector, matrix or array and creates an equivalent torch_tensor.

You can see a few examples below:

torch_tensor(c(1,2,3))
#> torch_tensor
#>  1
#>  2
#>  3
#> [ CPUFloatType{3} ]

# conform to row-major indexing used in torch
torch_tensor(matrix(1:10, ncol = 5, nrow = 2, byrow = TRUE))
#> torch_tensor
#>   1   2   3   4   5
#>   6   7   8   9  10
#> [ CPULongType{2,5} ]
torch_tensor(array(runif(12), dim = c(2, 2, 3)))
#> torch_tensor
#> (1,.,.) = 
#>   0.1991  0.0488  0.8962
#>   0.4901  0.0607  0.2944
#> 
#> (2,.,.) = 
#>   0.9687  0.9823  0.7019
#>   0.8187  0.4887  0.1491
#> [ CPUFloatType{2,2,3} ]

By default, we will create tensors in the cpu device, converting their R datatype to the corresponding torch dtype.

Note currently, only numeric and boolean types are supported.

You can always modify dtype and device when converting an R object to a torch tensor. For example:

torch_tensor(1, dtype = torch_long())
#> torch_tensor
#>  1
#> [ CPULongType{1} ]
torch_tensor(1, device = "cpu", dtype = torch_float64())
#> torch_tensor
#>  1
#> [ CPUDoubleType{1} ]

Other options available when creating a tensor are:

These options are available for all functions that can be used to create new tensors, including the factory functions listed in the next section.

Using creation functions

You can also use the torch_* functions listed below to create torch tensors using some algorithm.

For example, the torch_randn function will create tensors using the normal distribution with mean 0 and standard deviation 1. You can use the ... argument to pass the size of the dimensions. For example, the code below will create a normally distributed tensor with shape 5x3.

x <- torch_randn(5, 3)
x
#> torch_tensor
#>  1.3552  1.0197 -0.7342
#>  0.9285 -0.6003  1.0019
#>  0.2969 -0.5679  0.3356
#> -1.5980  1.2547  1.6663
#> -0.6493  0.2528 -1.3845
#> [ CPUFloatType{5,3} ]

Another example is torch_ones, which creates a tensor filled with ones.

x <- torch_ones(2, 4, dtype = torch_int64(), device = "cpu")
x
#> torch_tensor
#>  1  1  1  1
#>  1  1  1  1
#> [ CPULongType{2,4} ]

Here is the full list of functions that can be used to bulk-create tensors in torch:

Conversion

Once a tensor exists you can convert between dtypes and move to a different device with to method. For example:

x <- torch_tensor(1)
y <- x$to(dtype = torch_int32())
x
#> torch_tensor
#>  1
#> [ CPUFloatType{1} ]
y
#> torch_tensor
#>  1
#> [ CPUIntType{1} ]

You can also copy a tensor to the GPU using:

x <- torch_tensor(1)
y <- x$cuda())