如何在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
相关产品推荐
相关产品推荐

