torch和luz在dataloader、张量和R对象的训练

通过测试,dataloader的速度最快。张量和R对象的速度一样。

library(torch)
library(luz)

# input dimensionality (number of input features)
d_in <- 3
# number of observations in training set
n <- 1000

# 生成一个1000x3的矩阵,其元素为从正态分布生成的随机数
x <- torch_randn(n, d_in)
# 定义线性关系的系数
coefs <- c(0.2, -1.3, -0.5)
# 计算目标变量y,使其成为输入x的线性组合,并添加噪声
y <- x$matmul(coefs)$unsqueeze(2) + torch_randn(n, 1)
# 使用输入和目标张量创建一个数据集对象
ds <- tensor_dataset(x, y)
# 构建一个数据加载器,批量大小为100,并启用随机洗牌以随机化数据顺序
dl <- dataloader(ds, batch_size = 100, shuffle = TRUE)
# 将隐藏层的神经元数量设置为32
# dimensionality of hidden layer
d_hidden <- 32
# 将输出特征或预测的数量设为1
# output dimensionality (number of predicted features)
d_out <- 1

# 使用torch包初始化一个神经网络模块
net <- nn_module(
    # 接收输入维度、隐藏层维度和输出维度作为参数
  initialize = function(d_in, d_hidden, d_out) {
    # 构建一个由三个部分组成的序列化神经网络
    self$net <- nn_sequential(
        # 从输入层到隐藏层的线性变换
      nn_linear(d_in, d_hidden),
    #   对隐藏层输出应用ReLU激活函数
      nn_relu(),
    #   从隐藏层到输出层的线性变换
      nn_linear(d_hidden, d_out)
    )
  },
#   定义网络的前向传递,将initialize中定义的序列模型应用于输入x
  forward = function(x) {
    self$net(x)
  }
)

# 初始化模型以进行训练
fitted <- net %>%
# 设置损失函数为均方误差(MSE),指定Adam优化算法
  setup(loss = nn_mse_loss(), optimizer = optim_adam) %>%
#   配置模型的超参数
  set_hparams(
    d_in = d_in,   # 设置输入维度
    d_hidden = d_hidden,   # 设置隐藏层的神经元数量
    d_out = d_out   # 设置输出维度
  ) %>%
   # 使用提供的数据加载器dl训练模型
#    dl: 包含训练数据集的数据加载器
# 指定训练过程运行200个周期,即将整个数据集迭代200次
  fit(dl, epochs = 200)  

# 替换dl为张量
fitted <- net %>%
  setup(loss = nn_mse_loss(), optimizer = optim_adam) %>%
  set_hparams(
    d_in = d_in,
    d_hidden = d_hidden, d_out = d_out
  ) %>%
  fit(list(x, y), epochs = 200)

# 替换dl为R对象
fitted <- net %>%
  setup(loss = nn_mse_loss(), optimizer = optim_adam) %>%
  set_hparams(
    d_in = d_in,
    d_hidden = d_hidden, d_out = d_out
  ) %>%
  fit(list(as.matrix(x), as.matrix(y)), epochs = 200)

评论

发表评论

了解 数据控|突破是我们的每一步 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读