模块化神经网络

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 

评论

发表评论

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

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

继续阅读