通过测试,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)
发表评论