You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在plot.nn()中对神经网络权重进行三位小数取整?

解决neuralnet绘图时权重保留3位小数的问题

你遇到的问题核心在于neuralnet模型的weights是嵌套列表结构,普通的mapply(round)无法递归处理多层嵌套的元素。这里提供两种可行的方案,帮你实现权重取整后再绘图:

方案1:自定义递归函数处理嵌套权重

我们可以写一个简单的递归函数,遍历权重列表的每一层,把所有数值都保留3位小数:

# 定义递归取整函数
round_weights <- function(weight_list, digits = 3) {
  if (is.list(weight_list)) {
    # 如果是列表,递归处理每个子元素
    lapply(weight_list, round_weights, digits = digits)
  } else {
    # 如果是数值矩阵/向量,直接取整
    round(weight_list, digits = digits)
  }
}

# 应用到你的模型
nn.model$weights <- round_weights(nn.model$weights, digits = 3)

# 重新绘制模型
plot(nn.model)

方案2:用purrr包快速处理嵌套结构

如果你已经安装了purrr包(tidyverse系列的工具包),可以用map_depth直接指定嵌套层数来处理,代码更简洁:

library(purrr)

# 针对neuralnet单隐藏层的权重结构(两层嵌套),直接取整
nn.model$weights <- map_depth(nn.model$weights, 2, ~round(.x, 3))

# 绘图
plot(nn.model)

为什么之前的方法无效?

neuralnet训练后的weights是嵌套列表:比如单隐藏层模型,它是一个长度为1的列表,内部又包含输入→隐藏层、隐藏→输出层的权重矩阵。mapply只能处理平行的同级列表,无法深入到子列表里处理矩阵元素,而递归函数或map_depth可以逐层遍历所有嵌套元素,完成取整操作。

你可以通过print(nn.model$weights)验证处理后的权重是否已经变成3位小数,之后再绘图就能看到清晰的取整后数值了。

内容的提问来源于stack exchange,提问作者Rachel Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:27:52