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

Keras R中自定义RMSE损失函数如何设置以显示函数名称

解决Keras R中自定义损失函数名称不显示的问题

这是因为你直接传入的自定义函数会被Keras自动包装成一个Python函数对象,默认没有设置可读的名称属性;而内置损失函数(比如'mse')是通过字符串引用的预注册函数,所以model$loss会直接返回这个字符串名称。

你可以通过两种方式解决这个问题:

方法1:给自定义函数添加name属性

在定义完损失函数后,给它设置一个name属性,这样Keras在包装成Python函数时会使用这个名称:

# 定义自定义RMSE损失函数
RMSE <- function(y_true, y_pred){ 
  k_sqrt(k_mean(k_square(y_pred - y_true))) 
}
# 给函数添加名称属性
attr(RMSE, "name") <- "rmse"

# 创建模型时使用这个函数
model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = 'relu', input_shape = c(10)) %>%
  layer_dense(units = 1)

model %>% compile(
  optimizer = 'adam',
  loss = RMSE
)

# 现在调用model$loss会显示带有名称的函数对象
print(model$loss)
# 输出类似:<function rmse at 0x...>

方法2:注册自定义损失函数为内置风格的字符串引用

使用register_custom_object()把你的自定义函数注册到Keras的对象库中,这样就可以像使用内置损失函数一样用字符串引用它,此时model$loss会直接返回字符串名称:

# 定义自定义RMSE损失函数
RMSE <- function(y_true, y_pred){ 
  k_sqrt(k_mean(k_square(y_pred - y_true))) 
}
# 注册自定义损失函数
keras::register_custom_object("rmse", RMSE)

# 创建模型时使用字符串名称
model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = 'relu', input_shape = c(10)) %>%
  layer_dense(units = 1)

model %>% compile(
  optimizer = 'adam',
  loss = "rmse"
)

# 现在调用model$loss会返回字符串"rmse"
print(model$loss)
# 输出:[1] "rmse"

两种方法都能解决你的问题,方法2更贴近内置损失函数的使用方式,如果你需要和其他Keras功能(比如模型保存/加载)兼容,推荐使用方法2。

内容的提问来源于stack exchange,提问作者David Díaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:57:38