library(torch)
# input dimensionality (number of input features)
# 输入维度(特征的数量)被设定为3,每个输入数据点有3个特征
d_in <- 3
# number of observations in training set
# 训练集中的观测数量被设定为100
n <- 100
# 创建一个100行3列的矩阵x
x <- torch_randn(n, d_in)
# 定义了一个包含系数的向量coefs
coefs <- c(0.2, -1.3, -0.5)
# 进行矩阵乘法运算,将矩阵x与系数coefs相乘
# 并对每个元素添加噪声(通过unsqueeze添加一个额外的维度)
# 最终生成目标变量y。
y <- x$matmul(coefs)$unsqueeze(2) + torch_randn(n, 1)
# 隐藏层32个维度
d_hidden <-32
# 输出层维度为1
d_out <- 1
# 创建序列模型
net <- nn_sequential(
nn_linear(d_in, d_hidden), # 全连接层,线性层
nn_relu(), # 激活函数,引入非线性层
nn_linear(d_hidden, d_out) # 线性层,从隐藏层输出
)
# 初始化Adam优化器
opt <- optim_adam(net$parameters)
### training loop --------------------------------------
for (t in 1:200) {
### -------- Forward pass --------
# 向前传递,通过net生成预测值
y_pred <- net(x)
### -------- Compute loss --------
# 使用均方误差(MSE)计算预测值y_pred与实际值y之间的损失
loss <- nnf_mse_loss(y_pred, y)
# 每10个周期输出一次损失值
if (t %% 10 == 0)
cat("Epoch: ", t, " Loss: ", loss$item(), "\n")
### -------- Backpropagation --------
# 在反向传播之前重置梯度为零
opt$zero_grad()
# 使用反向传播计算损失相对于网络参数的梯度
loss$backward()
### -------- Update weights --------
# 根据计算出的梯度更新网络的权重,以减少下一次迭代中的损失
opt$step()
}
展开/折叠结果
Epoch: 10 Loss: 3.248455
Epoch: 20 Loss: 3.051522
Epoch: 30 Loss: 2.866707
Epoch: 40 Loss: 2.689961
Epoch: 50 Loss: 2.51879
Epoch: 60 Loss: 2.350682
Epoch: 70 Loss: 2.18356
Epoch: 80 Loss: 2.018582
Epoch: 90 Loss: 1.856642
Epoch: 100 Loss: 1.700728
Epoch: 110 Loss: 1.553768
Epoch: 120 Loss: 1.417934
Epoch: 130 Loss: 1.294667
Epoch: 140 Loss: 1.187055
Epoch: 150 Loss: 1.096451
Epoch: 160 Loss: 1.022662
Epoch: 170 Loss: 0.9643999
Epoch: 180 Loss: 0.9189036
Epoch: 190 Loss: 0.8844466
Epoch: 200 Loss: 0.8586743
发表评论