Keras自定义评估函数
1. 比较一般的自定义函数:
需要注意的是,不能像sklearn那样直接定义,因为这里的y_true和y_pred是张量,不是numpy数组。示例如下:
from keras import backend def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))
用的时候直接:
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[rmse])
2. 比较复杂的如AUC函数:
AUC的计算需要整体数据,如果直接在batch里算,误差就比较大,不能合理反映整体情况。这里采用回调函数写法,每个epoch计算一次:
from sklearn.metrics import roc_auc_score class roc_callback(keras.callbacks.Callback):
def __init__(self,training_data, validation_data): self.x = training_data[0]
self.y = training_data[1]
self.x_val = validation_data[0]
self.y_val = validation_data[1] def on_train_begin(self, logs={}):
return def on_train_end(self, logs={}):
return def on_epoch_begin(self, epoch, logs={}):
return def on_epoch_end(self, epoch, logs={}):
y_pred = self.model.predict(self.x)
roc = roc_auc_score(self.y, y_pred) y_pred_val = self.model.predict(self.x_val)
roc_val = roc_auc_score(self.y_val, y_pred_val) print('\rroc-auc: %s - roc-auc_val: %s' % (str(round(roc,4)),str(round(roc_val,4))),end=100*' '+'\n')
return def on_batch_begin(self, batch, logs={}):
return def on_batch_end(self, batch, logs={}):
return
调用回调函数示例:
model.fit(X_train, y_train, epochs=10, batch_size=4,
callbacks = [roc_callback(training_data=[X_train, y_train], validation_data=[X_test, y_test])] )
整体示例:
from tensorflow import keras
from sklearn import datasets
from sklearn import model_selection
from sklearn.metrics import roc_auc_score def rmse(y_true, y_pred):
return keras.backend.sqrt(keras.backend.mean(keras.backend.square(y_pred - y_true), axis=-1)) class roc_callback(keras.callbacks.Callback):
def __init__(self,training_data, validation_data): self.x = training_data[0]
self.y = training_data[1]
self.x_val = validation_data[0]
self.y_val = validation_data[1] def on_train_begin(self, logs={}):
return def on_train_end(self, logs={}):
return def on_epoch_begin(self, epoch, logs={}):
return def on_epoch_end(self, epoch, logs={}):
y_pred = self.model.predict(self.x)
roc = roc_auc_score(self.y, y_pred) y_pred_val = self.model.predict(self.x_val)
roc_val = roc_auc_score(self.y_val, y_pred_val) print('\rroc-auc: %s - roc-auc_val: %s' % (str(round(roc,4)),str(round(roc_val,4))),end=100*' '+'\n')
return def on_batch_begin(self, batch, logs={}):
return def on_batch_end(self, batch, logs={}):
return X, y = datasets.make_classification(n_samples=100, n_features=4, n_classes=2, random_state=2018)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2, random_state=2018)
print("TrainSet", X_train.shape, "TestSet", X_test.shape) model = keras.models.Sequential()
model.add(keras.layers.Dense(20, input_shape=(4,), activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[rmse]) model.fit(X_train, y_train, epochs=10, batch_size=4,
callbacks = [roc_callback(training_data=[X_train, y_train], validation_data=[X_test, y_test])] )
运行结果:
TrainSet (80, 4) TestSet (20, 4)
Epoch 1/10
roc-auc: 0.1604 - roc-auc_val: 0.2738
80/80 [==============================] - 0s - loss: 0.8132 - rmse: 0.5298
Epoch 2/10
roc-auc: 0.4874 - roc-auc_val: 0.619
80/80 [==============================] - 0s - loss: 0.7432 - rmse: 0.5049
Epoch 3/10
roc-auc: 0.7715 - roc-auc_val: 0.9643
80/80 [==============================] - 0s - loss: 0.6821 - rmse: 0.4807
Epoch 4/10
roc-auc: 0.9602 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.6268 - rmse: 0.4560
Epoch 5/10
roc-auc: 0.9842 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.5747 - rmse: 0.4301
Epoch 6/10
roc-auc: 0.9956 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.5230 - rmse: 0.4025
Epoch 7/10
roc-auc: 0.9975 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.4743 - rmse: 0.3739
Epoch 8/10
roc-auc: 0.9987 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.4289 - rmse: 0.3454
Epoch 9/10
roc-auc: 0.9987 - roc-auc_val: 1.0...] - ETA: 0s - loss: 0.4019 - rmse: 0.3301
80/80 [==============================] - 0s - loss: 0.3830 - rmse: 0.3149
Epoch 10/10
roc-auc: 0.9987 - roc-auc_val: 1.0
80/80 [==============================] - 0s - loss: 0.3424 - rmse: 0.2865
Keras自定义评估函数的更多相关文章
- keras 自定义 custom 函数
转自: https://kexue.fm/archives/4493/,感谢分享! Keras是一个搭积木式的深度学习框架,用它可以很方便且直观地搭建一些常见的深度学习模型.在tensorflow出来 ...
- xgboost 自定义目标函数和评估函数
https://zhpmatrix.github.io/2017/06/29/custom-xgboost/ https://www.cnblogs.com/silence-gtx/p/5812012 ...
- TensorFlow自定义训练函数
本文记录了在TensorFlow框架中自定义训练函数的模板并简述了使用自定义训练函数的优势与劣势. 首先需要说明的是,本文中所记录的训练函数模板参考自https://stackoverflow.com ...
- 关于jqGrig如何写自定义格式化函数将JSON数据的字符串转换为表格各个列的值
首先介绍一下jqGrid是一个jQuery的一个表格框架,现在有一个需求就是将数据库表的数据拿出来显示出来,分别有id,name,details三个字段,其中难点就是details字段,它的数据是这样 ...
- 自定义el函数
1.1.1 自定义EL函数(EL调用Java的函数) 第一步:创建一个Java类.方法必须是静态方法. public static String sayHello(String name){ retu ...
- ORACLE 自定义聚合函数
用户可以自定义聚合函数 ODCIAggregate,定义了四个聚集函数:初始化.迭代.合并和终止. Initialization is accomplished by the ODCIAggrega ...
- SQL Server 自定义聚合函数
说明:本文依据网络转载整理而成,因为时间关系,其中原理暂时并未深入研究,只是整理备份留个记录而已. 目标:在SQL Server中自定义聚合函数,在Group BY语句中 ,不是单纯的SUM和MAX等 ...
- Matlab中如何将(自定义)函数作为参数传递给另一个函数
假如我们编写了一个积分通用程序,想使它更具有通用性,那么可以把被积函数也作为一个参数.在c/c++中,可以使用函数指针来实现上边的功能,在matlab中如何实现呢?使用函数句柄--这时类似于函数指针的 ...
- python 自定义排序函数
自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 ...
随机推荐
- CF464C-Substitutes in Number
题意 开始给出一个长为\(n\)的数字串,有\(m\)次操作按顺序执行,每次把当前数字串中的某一个数码替换成一个数字串\(t\)(可以为空或多位),最后问操作结束后的数字串十进制下模\(10^9+7\ ...
- 最小生成树-Borůvka算法
一般求最小生成树的时候,最流行的是Kruskal算法,一种基于拟阵证明的贪心,通过给边排序再扫描一次边集,利用并查集优化得到,复杂度为\(O(ElogE)\).另一种用得比较少的是Prim算法,利用优 ...
- vdbench测试过程中遇到的小问题
1.报Slave hd2-0 prematurely terminated 错误 首先根据提示查看hd2-0.stdout.html文件获取更多的错误信息,这个问题一般是未安装vdbench或者路径不 ...
- 【BZOJ1226】学校食堂(动态规划,状态压缩)
[BZOJ1226]学校食堂(动态规划,状态压缩) 题面 BZOJ 洛谷 题解 发现\(b\)很小,意味着当前这个人最坏情况下也只有后面的一小部分人在他前面拿到饭. 所以整个结果的大致顺序是不会变化的 ...
- 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...
- CSS3制作3D水晶糖果按钮
本人仿照20个漂亮 CSS3 按钮效果及优秀的制作教程中的BonBon(Candy)Button实现了其棒棒糖果按钮,如下图所示: 在线演示地址见here. 使用完全使用CSS实现,无需JS.源码如下 ...
- iframe在ios上不能滚动问题解决
同这篇文章一样,用到了-webkit-overflow-scrolling: touch;属性.主要解决方案是在iframe外层添加一个div,然后设置-webkit-overflow-scrolli ...
- C# 利用mysql.data 在mysql中创建数据库及数据表
C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...
- poj 1655 树的重心
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13178 Accepted: 5565 De ...
- [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...