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

